<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3ACheck_isxn</id>
	<title>Módulo:Check isxn - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3ACheck_isxn"/>
	<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Check_isxn&amp;action=history"/>
	<updated>2026-07-05T11:59:04Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Check_isxn&amp;diff=2541&amp;oldid=prev</id>
		<title>Tavoraadmin: Importando predefinição/módulo da Wikipédia em português para manter layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Check_isxn&amp;diff=2541&amp;oldid=prev"/>
		<updated>2026-07-05T05:51:10Z</updated>

		<summary type="html">&lt;p&gt;Importando predefinição/módulo da Wikipédia em português para manter layout&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
Este código é derivado do código de validação ISXN no Módulo:Citação/CS1. Ele permite validar ISBN, ISMN, e ISSN sem ter que&lt;br /&gt;
invocar uma predefinição de citação.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E R R _ M S G _ S U P L _ T &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Mensagem de erro suplementar para check_isbn(); adaptado de uma tabela nomeada simelhante de Módulo:Citação/CS1/Configuração&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local err_msg_supl_t = {&lt;br /&gt;
	[&amp;#039;char&amp;#039;] = &amp;#039;caractere inválido&amp;#039;,&lt;br /&gt;
	[&amp;#039;check&amp;#039;] = &amp;#039;soma de verificação&amp;#039;,&lt;br /&gt;
	[&amp;#039;form&amp;#039;] = &amp;#039;forma inválida&amp;#039;,&lt;br /&gt;
	[&amp;#039;group&amp;#039;] = &amp;#039;id do grupo inválido&amp;#039;,&lt;br /&gt;
	[&amp;#039;length&amp;#039;] = &amp;#039;comprimento&amp;#039;,&lt;br /&gt;
	[&amp;#039;prefix&amp;#039;] = &amp;#039;prefixo inválido&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; IS _ V A L I D _ I S X N &amp;gt;-----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
O código validador ISBN-10 e ISSN calcula a soma de verificação em todos os dígitos isbn/issn, incluindo o dígito de verificação. ISBN-13 é&lt;br /&gt;
verificado em check_isbn().&lt;br /&gt;
Se o número for válido, o resultado será 0. Antes de chamar esta função, issbn/issn deve ser verificado quanto ao comprimento e sem travessões,&lt;br /&gt;
espaços e outros caracteres não isxn.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_isxn (isxn_str, len)&lt;br /&gt;
	local temp = 0;&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, len) };	-- cria uma tabela de valores de bytes &amp;#039;0&amp;#039; → 0x30 .. &amp;#039;9&amp;#039; → 0x39, &amp;#039;X&amp;#039; → 0x58&lt;br /&gt;
	len = len+1;							-- ajuste para ser um contador de loop&lt;br /&gt;
	for i, v in ipairs( isxn_str ) do		-- faz um loop por todos os bytes e calcular a soma de verificação&lt;br /&gt;
		if v == string.byte( &amp;quot;X&amp;quot; ) then		-- se o dígito de verificação é X (compara o valor de byte de &amp;#039;X&amp;#039; que é 0x58)&lt;br /&gt;
			temp = temp + 10*( len - i );	-- representa o 10 decimal&lt;br /&gt;
		else&lt;br /&gt;
			temp = temp + tonumber( string.char(v) )*(len-i);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 11 == 0;					-- retorna verdadeiro de o resultado do cálculo é zero&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; IS _ V A L I D _ I S X N  _ 1 3 &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
O código validador ISBN-13 e ISMN calcula a soma de verificação em todos os 13 dígitos isbn/ismn, incluindo o dígito de verificação.&lt;br /&gt;
Se o número for válido, o resultado será 0. Antes de chamar esta função, isbn-13/ismn deve ser verificado quanto ao comprimento e sem&lt;br /&gt;
travessões, espaços e outros caracteres diferentes de isxn-13.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_isxn_13 (isxn_str)&lt;br /&gt;
	local temp=0;&lt;br /&gt;
	&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, 13) };										-- cria uma tabela com os valores de bytes &amp;#039;0&amp;#039; → 0x30 .. &amp;#039;9&amp;#039;  → 0x39&lt;br /&gt;
	for i, v in ipairs( isxn_str ) do&lt;br /&gt;
		temp = temp + (3 - 2*(i % 2)) * tonumber( string.char(v) );				-- multiplica índices ímpares por 1, pares por 3 e soma; incluindo o dígito de verificação&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 10 == 0;														-- soma modulo 10 é zero quando a isbn-13/ismn está correta&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C H E C K _ I S B N &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determina se uma ISBN é válida.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function check_isbn (isbn_str, frame)&lt;br /&gt;
	local function return_result (check, err_type)								-- função local para renderizar os vários retornos de erro&lt;br /&gt;
		if not check then														-- &amp;lt;check&amp;gt; é falso quando há um erro&lt;br /&gt;
			local template = ((frame.args.template_name and &amp;#039;&amp;#039; ~= frame.args.template_name) and frame.args.template_name) or nil;	-- pega o nome da predefinição&lt;br /&gt;
			if not template then&lt;br /&gt;
				return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot; style=&amp;quot;font-size:100%&amp;quot;&amp;gt;&amp;amp;nbsp;a chamada da predefinição requer o parâmetro template_name&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local out_t = {&amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot; style=&amp;quot;font-size:100%&amp;quot;&amp;gt;&amp;#039;};		-- abre o span da mensagem de erro&lt;br /&gt;
			table.insert (out_t, &amp;#039;&amp;amp;nbsp;Erro de parâmetro em {{[[Predefinição:&amp;#039;); -- abre a marcação para &amp;#039;predefinição&amp;#039;; abre a ligação para o domínio predefinição&lt;br /&gt;
			table.insert (out_t, template);										-- ligação para o nome da predefinição&lt;br /&gt;
			table.insert (out_t, &amp;#039;|&amp;#039;);											-- pipe&lt;br /&gt;
			table.insert (out_t, template);										-- etiqueta da ligação&lt;br /&gt;
			table.insert (out_t, &amp;#039;]]}}:&amp;amp;nbsp;&amp;#039;);								-- fecha ligação; fecha a marcação &amp;#039;predefinição&amp;#039;&lt;br /&gt;
			table.insert (out_t, err_type);										-- tipo do erro da isbn&lt;br /&gt;
			table.insert (out_t, &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;)										-- fecha o span da mensagem de erro&lt;br /&gt;
			if 0 == mw.title.getCurrentTitle().namespace then					-- categoriza apenas se a predefinição é utilizada no domínio principal&lt;br /&gt;
				local category = table.concat ({&amp;#039;[[Categoria:!Páginas com erro de ISBN]]&amp;#039;});&lt;br /&gt;
				table.insert (out_t, category);&lt;br /&gt;
			end&lt;br /&gt;
			return table.concat (out_t);										-- cria uma grande string e finaliza&lt;br /&gt;
		end&lt;br /&gt;
	return &amp;#039;&amp;#039;;																	-- se não há erros, retorna uma string vazia&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nil ~= isbn_str:match (&amp;#039;[^%s-0-9X]&amp;#039;) then&lt;br /&gt;
		return return_result (false, err_msg_supl_t.char);						-- erro se isbn_str contiver qualquer coisa além de dígitos, hifens ou X maiúsculo&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local id = isbn_str:gsub (&amp;#039;[%s-]&amp;#039;, &amp;#039;&amp;#039;);										-- remove hifens e espaços em branco&lt;br /&gt;
&lt;br /&gt;
	local len = id:len();&lt;br /&gt;
 &lt;br /&gt;
	if len ~= 10 and len ~= 13 then&lt;br /&gt;
		return return_result (false, err_msg_supl_t.length);					-- erro se o comprimento for incorreto&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if len == 10 then&lt;br /&gt;
		if id:match (&amp;#039;^%d*X?$&amp;#039;) == nil then										-- erro se isbn_str contiver &amp;#039;X&amp;#039; em qualquer lugar que não seja no último dígito&lt;br /&gt;
			return return_result (false, err_msg_supl_t.form);									&lt;br /&gt;
		end&lt;br /&gt;
		if id:find (&amp;#039;^63[01]&amp;#039;) then												-- 630xxxxxxx e 631xxxxxxx (aparentemente) não são IDs de grupo isbn válidos, mas são usados pela Amazon como identificadores numéricos (asin)&lt;br /&gt;
			return return_result (false, err_msg_supl_t.group);					-- erro se isbn-10 começa com 630/1&lt;br /&gt;
		end&lt;br /&gt;
		return return_result (is_valid_isxn (id, 10), err_msg_supl_t.check);	-- aprova se isbn-10 for numericamente válido (soma de verificação)&lt;br /&gt;
	else&lt;br /&gt;
		if id:match (&amp;#039;^%d+$&amp;#039;) == nil then&lt;br /&gt;
			return return_result (false, err_msg_supl_t.char);					-- erro se ISBN-13 não for apenas dígitos&lt;br /&gt;
		end&lt;br /&gt;
		if id:match (&amp;#039;^97[89]%d*$&amp;#039;) == nil then&lt;br /&gt;
			return return_result (false, err_msg_supl_t.prefix);				-- erro se ISBN-13 não começar com 978 ou 979&lt;br /&gt;
		end&lt;br /&gt;
		if id:match (&amp;#039;^9790&amp;#039;) then&lt;br /&gt;
			return return_result (false, err_msg_supl_t.group);					-- o grupo identificador &amp;#039;0&amp;#039; é resercado para ISMN&lt;br /&gt;
		end&lt;br /&gt;
		return return_result (is_valid_isxn_13 (id), err_msg_supl_t.check);		-- aprova se isbn-10 for numericamente válido (soma de verificação)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C H E C K _ I S M N &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determina se uma sequência ISMN é válida. Semelhante ao isbn-13, o ismn tem 13 dígitos começando com 979-0-... e usa os mesmos&lt;br /&gt;
cálculos de dígitos de verificação. Consulte http://www.ismn-international.org/download/Web_ISMN_Users_Manual_2008-6.pdf&lt;br /&gt;
seção 2, páginas 9–12.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function check_ismn (id, error_string)&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_ismn = true;&lt;br /&gt;
&lt;br /&gt;
	id=id:gsub( &amp;quot;[%s-–]&amp;quot;, &amp;quot;&amp;quot; );													-- retira espaços, hífens e travessões do ismn&lt;br /&gt;
&lt;br /&gt;
	if 13 ~= id:len() or id:match( &amp;quot;^9790%d*$&amp;quot; ) == nil then					-- ismn deve conter 13 dígitos e começar com 9790&lt;br /&gt;
		valid_ismn = false;&lt;br /&gt;
	else&lt;br /&gt;
		valid_ismn=is_valid_isxn_13 (id);										-- valida ismn&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return valid_ismn and &amp;#039;&amp;#039; or error_string&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S S N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Valida e formata um issn. Este código corrige o caso em que um editor incluiu um ISSN na citação, mas separou os dois grupos de quatro dígitos com&lt;br /&gt;
um espaço. Quando essa condição ocorre, a ligação resultante fica assim:&lt;br /&gt;
&lt;br /&gt;
	|issn=0819 4327 gera: [http://www.worldcat.org/issn/0819 4327 0819 4327]	-- não poda haver espações numa ligação externa&lt;br /&gt;
	&lt;br /&gt;
Este código agora evita isso inserindo um hífen no ponto médio do issn. Ele também valida o comprimento do issn e garante que o dígito de verificação esteja de&lt;br /&gt;
acordo com o valor calculado. Comprimento incorreto (8 dígitos), caracteres diferentes de 0-9 e X ou incompatibilidade de dígito de verificação/valor calculado&lt;br /&gt;
causarão uma mensagem de erro de verificação issn.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function check_issn(id, error_string)&lt;br /&gt;
	local issn_copy = id;		-- salva uma cópia da issn não alterada; usa esta versão para exibir se a issn não for válida&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_issn = true;&lt;br /&gt;
&lt;br /&gt;
	if not id:match (&amp;#039;^%d%d%d%d%-%d%d%d[%dX]$&amp;#039;) then&lt;br /&gt;
		return error_string;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	id=id:gsub( &amp;quot;[%s-–]&amp;quot;, &amp;quot;&amp;quot; );									-- retirar espaços, hífens e travessões do issn&lt;br /&gt;
&lt;br /&gt;
	if 8 ~= id:len() or nil == id:match( &amp;quot;^%d*X?$&amp;quot; ) then		-- valida o issn: 8 digitos de comprimento, contendo apenas 0-9 ou X nã última posição&lt;br /&gt;
		valid_issn=false;										-- comprimento errado ou caractere impróprio&lt;br /&gt;
	else&lt;br /&gt;
		valid_issn=is_valid_isxn(id, 8);						-- valida issn&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return valid_issn and &amp;#039;&amp;#039; or error_string&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------------&amp;lt; E N T R Y   P O I N T S &amp;gt;--------------------------------------------------====&lt;br /&gt;
&lt;br /&gt;
function p.check_isbn(frame)&lt;br /&gt;
	return check_isbn(frame.args[1] or frame:getParent().args[1], frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.check_ismn(frame)&lt;br /&gt;
	return check_ismn(frame.args[1] or frame:getParent().args[1], frame.args[&amp;#039;error&amp;#039;] or frame:getParent().args[&amp;#039;error&amp;#039;] or &amp;#039;error&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.check_issn(frame)&lt;br /&gt;
	return check_issn(frame.args[1] or frame:getParent().args[1], frame.args[&amp;#039;error&amp;#039;] or frame:getParent().args[&amp;#039;error&amp;#039;] or &amp;#039;error&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Tavoraadmin</name></author>
	</entry>
</feed>