--
local p =
--
local err_msg_supl_t =
----------------------------< IS _ V A L I D _ I S X N >-----------------------------------------------------
ISBN-10 and ISSN validator code calculates checksum across all isbn/issn digits including the check digit. ISBN-13 is checked in check_isbn.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.
local function is_valid_isxn (isxn_str, len) local temp = 0; isxn_str = ; -- make a table of byte values '0' → 0x30 .. '9' → 0x39, 'X' → 0x58 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
0; -- returns true if calculation result is zeroend
----------------------------< IS _ V A L I D _ I S X N _ 1 3 >----------------------------------------------
ISBN-13 and ISMN validator code calculates checksum across all 13 isbn/ismn digits including the check digit.If the number is valid, the result will be 0. Before calling this function, isbn-13/ismn must be checked for lengthand stripped of dashes, spaces and other non-isxn-13 characters.
local function is_valid_isxn_13 (isxn_str) local temp=0; isxn_str = ; -- make a table of byte values '0' → 0x30 .. '9' → 0x39 for i, v in ipairs(isxn_str) do temp = temp + (3 - 2*(i % 2)) * tonumber(string.char(v)); -- multiply odd index digits by 1, even index digits by 3 and sum; includes check digit end return temp % 10
----------------------------< C H E C K _ I S B N >------------------------------------------------------------
Determines whether an ISBN string is valid. Implements an ISBN validity check for,,, and.
local function check_isbn (isbn_str, frame) local function return_result (check, err_type) -- local function to render the various error returns if not check then --
local out_t = ; -- open the error message span table.insert (out_t, ' Parameter error in : '); -- close wikilink; close 'template' markup table.insert (out_t, err_type); -- type of isbn error table.insert (out_t, '') -- close the error message span if 0
if nil ~= isbn_str:match ('[^%s-0-9X]') then return return_result (false, err_msg_supl_t.char); -- fail if isbn_str contains anything but digits, hyphens, or the uppercase X end
local id = isbn_str:gsub ('[%s-]', ); -- remove hyphens and whitespace
local len = id:len; if len ~= 10 and len ~= 13 then return return_result (false, err_msg_supl_t.length); -- fail if incorrect length end
if len
nil then -- fail if isbn_str has 'X' anywhere but last position return return_result (false, err_msg_supl_t.form); end if id:find ('^63[01]') then -- 630xxxxxxx and 631xxxxxxx are (apparently) not valid isbn group ids but are used by amazon as numeric identifiers (asin) return return_result (false, err_msg_supl_t.group); -- fail if isbn-10 begins with 630/1 end return return_result (is_valid_isxn (id, 10), err_msg_supl_t.check); -- pass if isbn-10 is numerically valid (checksum) else if id:match ('^%d+$')
nil then return return_result (false, err_msg_supl_t.prefix); -- fail when ISBN-13 does not begin with 978 or 979 end if id:match ('^9790') then return return_result (false, err_msg_supl_t.group); -- group identifier '0' is reserved to ISMN end return return_result (is_valid_isxn_13 (id), err_msg_supl_t.check); -- pass if isbn-10 is numerically valid (checksum) endend
--
local function check_ismn (id, error_string) local text; local valid_ismn = true;
id=id:gsub("[%s-–]", ""); -- strip spaces, hyphens, and endashes from the ismn
if 13 ~= id:len or id:match("^9790%d*$")
return valid_ismn and or error_stringend
--issn=0819 4327 gives: 4327 0819 4327 -- can't have spaces in an external link This code now prevents that by inserting a hyphen at the issn midpoint. It also validates the issn for length and makes sure that the checkdigit agreeswith the calculated value. Incorrect length (8 digits), characters other than 0-9 and X, or checkdigit / calculated value mismatch will all cause a check issnerror message.
local function check_issn(id, error_string) local issn_copy = id; -- save a copy of unadulterated issn; use this version for display if issn does not validate local text; local valid_issn = true;
if not id:match ('^%d%d%d%d%-%d%d%d[%dX]$') then return error_string; end id=id:gsub("[%s-–]", ""); -- strip spaces, hyphens, and endashes from the issn
if 8 ~= id:len or nil
return valid_issn and or error_stringend
------------------------------< E N T R Y P O I N T S >--------------------------------------------------
function p.check_isbn(frame) return check_isbn(frame.args[1] or frame:getParent.args[1], frame)end
function p.check_ismn(frame) return check_ismn(frame.args[1] or frame:getParent.args[1], frame.args['error'] or frame:getParent.args['error'] or 'error')end
function p.check_issn(frame) return check_issn(frame.args[1] or frame:getParent.args[1], frame.args['error'] or frame:getParent.args['error'] or 'error')end
return p