Modul:ISBN
Vzhled
ISBN může být použit k ověření pravosti ISBN.
Použití
Modul od začátku zadaného textu projde všechny číslice a spojovníky, dokud nenarazí na jiný znak. Výsledek považuje za ISBN a pokusí se jej ověřit. Pokud ISBN nemá správný počet číslic, obsahuje i jiné znaky než číslice, spojovník, malé nebo velké x, anebo poslední číslice neodpovídá kontrolnímu součtu, vloží údržbovou kategorii Údržba:Články obsahující prapodivné ISBN.
{{#invoke:ISBN|check|isbn = 80-251-0210-6}}
local p = {}
function p.isValid(isbn)
local digits = {}
local isbn_len = 0
local check = nil
for i = 1, #isbn do
local char = isbn:sub(i,i)
if tonumber(char) then
isbn_len = isbn_len + 1
digits[isbn_len] = char
elseif char:lower() == 'x' then
isbn_len = isbn_len + 1
check = 'X'
elseif char ~= '-' then
break
end
end
if not check then
check = digits[isbn_len]
digits[isbn_len] = nil
end
if isbn_len == 10 then
if check == 'X' then
check = 10
elseif not tonumber(check) then
return false
end
local sum = 0
for i, j in pairs(digits) do
sum = (11-i)*j + sum
end
return ((sum + check) % 11) == 0
elseif isbn_len == 13 then
if not tonumber(check) then
return false
end
local sum = 0
for i, j in pairs(digits) do
if (i % 2) == 0 then
sum = 3*j + sum
else
sum = j + sum
end
end
return ((sum + check) % 10) == 0
end
return false
end
function p.check(context)
local a = require('Modul:Arguments')
local params = a.getArgs(context)
local isbn = params['isbn'] or params[1]
if not p.isValid(isbn) then
return '[[Kategorie:Údržba:Články obsahující prapodivné ISBN]]'
end
return nil
end
return p