Vés al contingut

Mòdul:Identificadores

De la Viquipèdia, l'enciclopèdia lliure
local p = {}

--[[
ISBN-10 and ISSN validator code calculates checksum across all isbn/issn digits including the check digit. ISBN-13 is checked in checkisbn().
If the number is valid the result will be 0. Before calling this function, issbn/issn must be checked for length and stripped of dashes,
spaces and other non-isxn characters.
]]
-- Función traída de en:Module:Citation/CS1

function p.esValidoISXN (isxn_str, len)
	local temp = 0;
	isxn_str = { isxn_str:byte(1, len) };	-- make a table of bytes
	len = len+1;							-- adjust to be a loop counter
	for i, v in ipairs( isxn_str ) do		-- loop through all of the bytes and calculate the checksum
		if v == string.byte( "X" ) then		-- if checkdigit is X
			temp = temp + 10*( len - i );	-- it represents 10 decimal
		else
			temp = temp + tonumber( string.char(v) )*(len-i);
		end
	end
	return temp % 11 == 0;					-- returns true if calculation result is zero
end

-- Adaptación de la función checkisbn de en:Module:Citation/CS1
function p.esValidoISBN(isbn)
	-- El isbn solo contiene números, guiones, espacios en blanco y el dígito de 
	-- control X.
	
	if not isbn or isbn:match("[^%s-0-9X]")  then
		return false
	end
	
	-- Eliminar los guiones y espacios en blanco
	
	isbn = isbn:gsub( "-", "" ):gsub( " ", "" )
	local longitud = isbn:len()
 
	if longitud == 10 then
		-- La X solo puede ir al final.
		if not isbn:match( "^%d*X?$" ) then
			return false
		end
		return p.esValidoISXN(isbn, 10);
	elseif longitud == 13 then -- isbn13
		local temp = 0;
		-- Debe comenzar por 978 o 979
		if not isbn:match( "^97[89]%d*$" ) then 
			return false
		end
		
		-- Comprobar el dígito de control
		isbn = { isbn:byte(1, longitud) };
		for i, v in ipairs( isbn ) do
			temp = temp + (3 - 2*(i % 2)) * tonumber( string.char(v) );
		end
		return temp % 10 == 0;
	else
		return false
	end
	
end

-- Función que devuelve un enlace al ISBN si es correcto y si no (por ejemplo si
-- ya está enlazado) lo devuelve sin más.
-- Por defecto no se incluye el literal ISBN delante.

function p.enlazarISBN(isbn, opciones)
    if p.esValidoISBN(isbn) then
        return '[[Especial:FuentesDeLibros/' .. isbn .. '|' .. isbn .. ']]'
    else
    	return isbn
    end
end

function p.enlazarOCLC(oclc, opciones)
    if tonumber(oclc) then
        return '[http://www.worldcat.org/oclc/' .. oclc .. ' ' .. oclc .. ']'
    else
    	return oclc
    end
end

return p