יחידה:ISBN
מען קען שאפן דאקומענטאציע פאר דעם מאדול ביי יחידה:ISBN/דאק
function checkisbn( frame )
local isbn_str = frame.args[1]
if nil ~= isbn_str:match("[^%s-0-9X]") then
return false
end -- fail if isbn_str contains anything but digits, hyphens, or the uppercase X
isbn_str = isbn_str:gsub( "-", "" ):gsub( " ", "" ); -- remove hyphens and spaces
local len = isbn_str:len();
if len ~= 10 and len ~= 13 then
return false;
end
if len == 10 then
if isbn_str:match( "^%d*X?$" ) == nil then
return false
end
return is_valid_isbn(isbn_str, 10)
else
local temp = 0
if isbn_str:match( "^97[89]%d*$" ) == nil
then return false
end -- isbn13 begins with 978 or 979
isbn_str = { isbn_str:byte(1, len) }
for i, v in ipairs( isbn_str ) do
temp = temp + (3 - 2*(i % 2)) * tonumber( string.char(v) )
end
return temp % 10 == 0
end
end
function is_valid_isbn (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
function pmid(frame)
return check(frame.args[1], 30000000)
end
function rfc(frame)
return check(frame.args[1], 10000)
end
function check(id, test_limit)
if id:match("[^%d]") then -- if id has anything but digits
return false
else
local id_num = tonumber(id) -- convert id to a number for range testing
if 1 > id_num or test_limit < id_num then -- if id is outside test limit boundaries
return false
end
end
return true
end
-- The code taken from Module:Citation/CS1 and changed
return {isbn = checkisbn, pmid = pmid, rfc = rfc}