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