Module:ISBN

From Wikipedia, the free encyclopedia
Jump to: navigation, search
Module documentation[create]
isbn = {};

function validate( isbn_str )
    isbn_str = isbn_str:gsub("-", ""):upper();
    local len = isbn_str:len();
    
    if len ~= 10 and len ~= 13 then
        return false;
    end
        
    local temp = 0;
    if len == 10 then
        if isbn_str:match( "^%d*X?$" ) == nil then return false; end
        isbn_str = { isbn_str:byte(1, len) };
        for i, v in ipairs( isbn_str ) do
            if v == string.byte( "X" ) then
                temp = temp + 10*( 11 - i );
            else
                temp = temp + tonumber( string.char(v) )*(11-i);
            end
        end
        return temp % 11 == 0;
    else
        if isbn_str:match( "^%d*$" ) == nil then return false; end
        isbn_str = { isbn_str:byte(1, len) };
        for i, v in ipairs( isbn_str ) do
            temp = temp + (3 - 2*(i % 2)) * tonumber( string.char(v) );
        end
        return temp % 10 == 0;
    end
end

function isbn.is_valid( frame )
    return validate( mw.text.trim(frame.args[1]) or "" );    
end

return isbn;