<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wikincat.org/w/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AISBN</id>
	<title>Módulo:ISBN - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wikincat.org/w/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AISBN"/>
	<link rel="alternate" type="text/html" href="https://wikincat.org/w/index.php?title=M%C3%B3dulo:ISBN&amp;action=history"/>
	<updated>2026-07-01T08:20:47Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wikincat.org/w/index.php?title=M%C3%B3dulo:ISBN&amp;diff=526&amp;oldid=prev</id>
		<title>Jaider.ferreira em 13h10min de 13 de outubro de 2022</title>
		<link rel="alternate" type="text/html" href="https://wikincat.org/w/index.php?title=M%C3%B3dulo:ISBN&amp;diff=526&amp;oldid=prev"/>
		<updated>2022-10-13T13:10:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pt-BR&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Edição anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Edição das 10h10min de 13 de outubro de 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 16:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 16:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--    _publisher_code, sting, varying lengths&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--    _publisher_code, sting, varying lengths&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--    _article_code - string, varying lengths&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--    _article_code - string, varying lengths&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- From: https://geoffrichards.co.uk/lua/isbn/&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local M = { _NAME = &quot;isbn&quot; }&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local M = { _NAME = &quot;isbn&quot; }&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jaider.ferreira</name></author>
	</entry>
	<entry>
		<id>https://wikincat.org/w/index.php?title=M%C3%B3dulo:ISBN&amp;diff=525&amp;oldid=prev</id>
		<title>Jaider.ferreira: uma edição</title>
		<link rel="alternate" type="text/html" href="https://wikincat.org/w/index.php?title=M%C3%B3dulo:ISBN&amp;diff=525&amp;oldid=prev"/>
		<updated>2020-10-26T18:19:39Z</updated>

		<summary type="html">&lt;p&gt;uma edição&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pt-BR&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Edição anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Edição das 15h19min de 26 de outubro de 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;pt-BR&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sem diferença)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Jaider.ferreira</name></author>
	</entry>
	<entry>
		<id>https://wikincat.org/w/index.php?title=M%C3%B3dulo:ISBN&amp;diff=524&amp;oldid=prev</id>
		<title>Jaider.ferreira em 16h17min de 20 de janeiro de 2020</title>
		<link rel="alternate" type="text/html" href="https://wikincat.org/w/index.php?title=M%C3%B3dulo:ISBN&amp;diff=524&amp;oldid=prev"/>
		<updated>2020-01-20T16:17:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This Lua code was originally based on the Perl modules ISBN::Business and&lt;br /&gt;
-- ISBN::Business::Data by brian d foy &amp;lt;bdfoy@cpan.org&amp;gt;.  The Lua version is&lt;br /&gt;
-- a complete rewrite with a simpler structure and much less code.&lt;br /&gt;
--&lt;br /&gt;
-- This software and documentation is Copyright (c) 2007 Geoff Richards&lt;br /&gt;
-- &amp;lt;geoff@geoffrichards.co.uk&amp;gt;.  It is free software; you can redistribute it&lt;br /&gt;
-- and/or modify it under the terms of the S&amp;lt;Lua 5.0&amp;gt; license.  The full terms&lt;br /&gt;
-- are given in the file I&amp;lt;COPYRIGHT&amp;gt; supplied with the source code package,&lt;br /&gt;
-- and are also available here: http://www.lua.org/license.html&lt;br /&gt;
-- More in: http://www.geoffrichards.co.uk/lua/isbn/&lt;br /&gt;
--&lt;br /&gt;
-- Objects of this class have the following private fields in (all of&lt;br /&gt;
-- which are required):&lt;br /&gt;
--    _isbn - string, 10 or 13 chars&lt;br /&gt;
--    _group_code, string, varying lengths&lt;br /&gt;
--    _publisher_code, sting, varying lengths&lt;br /&gt;
--    _article_code - string, varying lengths&lt;br /&gt;
 &lt;br /&gt;
local M = { _NAME = &amp;quot;isbn&amp;quot; }&lt;br /&gt;
M.__index = M&lt;br /&gt;
M.VERSION = &amp;quot;1.2&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
local isbndata = require( &amp;#039;Module:Isbn._data&amp;#039; )&lt;br /&gt;
 &lt;br /&gt;
local _max_publisher_code_length, _prefix_length,&lt;br /&gt;
      _calc_checksum, _parse_isbn,&lt;br /&gt;
      _parse_group_code, _parse_publisher_code, _extract_article_code&lt;br /&gt;
 &lt;br /&gt;
function _max_publisher_code_length (self)&lt;br /&gt;
    local isbn = self._isbn&lt;br /&gt;
    return isbn:len()&lt;br /&gt;
         - _prefix_length(isbn)         -- prefix&lt;br /&gt;
         - self._group_code:len()       -- group&lt;br /&gt;
         - 1                            -- article&lt;br /&gt;
         - 1                            -- checksum&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
local function _new (class, input_data, correction_mode)&lt;br /&gt;
    if not correction_mode then correction_mode = &amp;quot;normal&amp;quot; end&lt;br /&gt;
 &lt;br /&gt;
    input_data = input_data:upper()             -- we want uppercase X&amp;#039;s&lt;br /&gt;
    if correction_mode == &amp;quot;strict&amp;quot; then&lt;br /&gt;
        input_data = input_data:gsub(&amp;quot;[-%s]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        if input_data:find(&amp;quot;[^0-9X]&amp;quot;) then&lt;br /&gt;
            return nil, &amp;quot;character not allowed&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        input_data = input_data:gsub(&amp;quot;[^0-9X]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local len = input_data:len()&lt;br /&gt;
    if correction_mode == &amp;quot;fix-checksum&amp;quot; and (len == 9 or len == 12) then&lt;br /&gt;
        -- allow checksum to be missing if we&amp;#039;re going to correct it anyway.&lt;br /&gt;
        input_data = input_data .. &amp;quot;0&amp;quot;&lt;br /&gt;
    elseif len ~= 10 and len ~= 13 then&lt;br /&gt;
        return nil, &amp;quot;wrong number of digits&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if not input_data:find(&amp;quot;^%d+[%dX]$&amp;quot;) then&lt;br /&gt;
        return nil, &amp;quot;digit &amp;#039;X&amp;#039; not allowed in middle&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local o = { _isbn = input_data }&lt;br /&gt;
    setmetatable(o, class)&lt;br /&gt;
 &lt;br /&gt;
    local err = _parse_isbn(o, correction_mode)&lt;br /&gt;
    if err then return nil, err end&lt;br /&gt;
 &lt;br /&gt;
    return o&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
-- Allow access to old &amp;#039;new&amp;#039; class function for backwards compatibility.&lt;br /&gt;
M.new = _new&lt;br /&gt;
 &lt;br /&gt;
function M:isbn () return self._isbn end&lt;br /&gt;
function M:prefix ()&lt;br /&gt;
    local data = self._isbn&lt;br /&gt;
    return data:len() == 13 and data:sub(1, 3) or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
function _prefix_length (isbn) return isbn:len() == 13 and 3 or 0 end&lt;br /&gt;
 &lt;br /&gt;
function M:group_code () return self._group_code end&lt;br /&gt;
function M:group_name ()&lt;br /&gt;
    return isbndata.country_name[self:group_code()]&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M:publisher_code () return self._publisher_code end&lt;br /&gt;
function M:article_code () return self._article_code end&lt;br /&gt;
function M:checksum () return self._isbn:sub(-1) end&lt;br /&gt;
 &lt;br /&gt;
function M:as_isbn10 ()&lt;br /&gt;
    local data = self._isbn&lt;br /&gt;
    if data:len() == 10 then return self end&lt;br /&gt;
    if self:prefix() ~= &amp;quot;978&amp;quot; then return nil end&lt;br /&gt;
    return _new(M, data:sub(4), &amp;quot;fix-checksum&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M:as_isbn13 ()&lt;br /&gt;
    local data = self._isbn&lt;br /&gt;
    if data:len() == 13 then return self end&lt;br /&gt;
    return _new(M, &amp;quot;978&amp;quot; .. data, &amp;quot;fix-checksum&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function _calc_checksum (data)&lt;br /&gt;
    local sum = 0&lt;br /&gt;
 &lt;br /&gt;
    if data:len() == 10 then&lt;br /&gt;
        for i = 1, 9 do&lt;br /&gt;
            sum = sum + (10 - i + 1) * data:sub(i, i)&lt;br /&gt;
        end&lt;br /&gt;
 &lt;br /&gt;
        local checksum = (11 - (sum % 11)) % 11&lt;br /&gt;
        return checksum == 10 and &amp;quot;X&amp;quot; or tostring(checksum)&lt;br /&gt;
    else&lt;br /&gt;
        for i = 0, 10, 2 do&lt;br /&gt;
            sum = sum + data:sub(i + 1, i + 1)&lt;br /&gt;
                      + data:sub(i + 2, i + 2) * 3&lt;br /&gt;
        end&lt;br /&gt;
 &lt;br /&gt;
        -- take the next higher multiple of 10 and subtract the sum.&lt;br /&gt;
        -- if $sum is 37, the next highest multiple of ten is 40. the&lt;br /&gt;
        -- check digit would be 40 - 37 =&amp;gt; 3.&lt;br /&gt;
        local tenth = sum / 10&lt;br /&gt;
        return tostring((10 * (tenth - tenth % 1 + 1) - sum) % 10)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M:__tostring ()&lt;br /&gt;
    local isbn = self._isbn&lt;br /&gt;
    local prefix = isbn:len() == 13 and isbn:sub(1, 3) .. &amp;quot;-&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
    return prefix .. self._group_code .. &amp;quot;-&amp;quot; .. self._publisher_code .. &amp;quot;-&amp;quot; ..&lt;br /&gt;
           self._article_code .. &amp;quot;-&amp;quot; .. isbn:sub(-1)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M:eq (other)&lt;br /&gt;
    if type(other) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local tmp = _new(M, other)&lt;br /&gt;
        if not tmp then error(&amp;quot;invalid ISBN value &amp;#039;&amp;quot; .. other .. &amp;quot;&amp;#039;&amp;quot;, 2) end&lt;br /&gt;
        other = tmp&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local selfstr, otherstr = self._isbn, other._isbn&lt;br /&gt;
    if selfstr:len() ~= otherstr:len() then&lt;br /&gt;
        if selfstr:len() == 10 then&lt;br /&gt;
            selfstr = self:as_isbn13()._isbn&lt;br /&gt;
        else&lt;br /&gt;
            otherstr = other:as_isbn13()._isbn&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    return selfstr == otherstr&lt;br /&gt;
end&lt;br /&gt;
M.__eq = M.eq&lt;br /&gt;
 &lt;br /&gt;
function _parse_isbn (self, correction_mode)&lt;br /&gt;
    local isbn = self._isbn&lt;br /&gt;
    local result&lt;br /&gt;
 &lt;br /&gt;
    if isbn:len() == 13 and not isbn:find(&amp;quot;^97[89]&amp;quot;) then&lt;br /&gt;
        return &amp;quot;invalid prefix&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    result = _parse_group_code(self)&lt;br /&gt;
    if not result then return &amp;quot;invalid group code&amp;quot; end&lt;br /&gt;
    self._group_code = result&lt;br /&gt;
 &lt;br /&gt;
    result = _parse_publisher_code(self)&lt;br /&gt;
    if not result then return &amp;quot;invalid publisher code&amp;quot; end&lt;br /&gt;
    self._publisher_code = result&lt;br /&gt;
 &lt;br /&gt;
    _extract_article_code(self)&lt;br /&gt;
 &lt;br /&gt;
    local expected_checksum = _calc_checksum(isbn)&lt;br /&gt;
    if isbn:sub(-1) ~= expected_checksum then&lt;br /&gt;
        if correction_mode == &amp;quot;fix-checksum&amp;quot; then&lt;br /&gt;
            self._isbn = isbn:sub(1, -2) .. expected_checksum&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;wrong checksum digit&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function _parse_group_code (self)&lt;br /&gt;
    local isbn = self._isbn&lt;br /&gt;
    local start = _prefix_length(isbn) + 1      -- first char of group code&lt;br /&gt;
    local count = 1&lt;br /&gt;
 &lt;br /&gt;
    while true do&lt;br /&gt;
        local code = isbn:sub(start, start + count - 1)&lt;br /&gt;
        if isbndata.country_ranges[code] then return code end&lt;br /&gt;
 &lt;br /&gt;
        count = count + 1&lt;br /&gt;
        if count &amp;gt; isbndata.max_country_code_length then return end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function _parse_publisher_code  (self)&lt;br /&gt;
    -- get the longest possible publisher code&lt;br /&gt;
    -- I&amp;#039;ll try substrs of this to get the real one&lt;br /&gt;
    local isbn = self._isbn&lt;br /&gt;
    local strt = _prefix_length(isbn) + self._group_code:len() + 1&lt;br /&gt;
    local longest = isbn:sub(strt, strt + _max_publisher_code_length(self) - 1)&lt;br /&gt;
 &lt;br /&gt;
    local ranges = isbndata.country_ranges[self:group_code()]&lt;br /&gt;
    for i = 1, #ranges, 2 do&lt;br /&gt;
        local lower = ranges[i]&lt;br /&gt;
        local upper = ranges[i + 1]&lt;br /&gt;
        local code  = longest:sub(1, lower:len())&lt;br /&gt;
        if code &amp;gt;= lower and code &amp;lt;= upper then return code end&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    return      -- failed if I got this far&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function _extract_article_code (self)&lt;br /&gt;
    local isbn = self._isbn&lt;br /&gt;
    local start = _prefix_length(isbn) +&lt;br /&gt;
                  self._group_code:len() +&lt;br /&gt;
                  self._publisher_code:len()&lt;br /&gt;
    local length = isbn:len() - start - 1&lt;br /&gt;
    self._article_code = isbn:sub(start + 1, start + length)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return setmetatable(M, { _NAME = &amp;quot;isbn metatable&amp;quot;, __call = _new })&lt;br /&gt;
-- vi:ts=4 sw=4 expandtab&lt;/div&gt;</summary>
		<author><name>Jaider.ferreira</name></author>
	</entry>
</feed>