Módulo:Identificadores

De Terrawiki
Ir a la navegación Ir a la búsqueda

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 '' .. isbn .. ''
   else
   	return isbn
   end

end

function p.enlazarOCLC(oclc, opciones)

   if tonumber(oclc) then
       return '.. oclc .. ' ' .. oclc .. ''
   else
   	return oclc
   end

end

return p