Modul:CheckISBN
Ugrás a navigációhoz
Ugrás a kereséshez
A modult a Modul:CheckISBN/doc lapon tudod dokumentálni
require 'Modul:No globals' local args = {} local ou = '' local function pop(...) -- idézőjeles rész és bővítmények az ou számára -- Ha nem kell, ne zabálja a memóriát do return end local mi = {...} for _, v in ipairs(mi) do ou = ou .. v .. '\n' mw.log(v) end end local hibavan = false local kategorizalas_van = false local function error(kategorizalas_kell, about) -- Enclose errorMsg with <span> -- Precondition: -- about -- string hibavan = true if kategorizalas_kell then kategorizalas_van = true end local r = about if type( about ) == 'string' then if #about == 0 then r = 'Lua-hiba' end else r = tostring( about ) end return '<span class="error">' .. r .. '</span>' end local function isISBN10(str) local v, chsum, chnum, chd, i, j, chnumdo, eloirt_hossz v = str:gsub('[^%d]', '') -- a decimális jegyeken kívül mindent figyelmen kívül hagyunk pop('10', v) chd = str:sub(-1, -1) -- check digit az utólsó pop(chd) if chd == 'X' or chd == 'x' or tonumber(chd) ~= nil then if chd == 'X' or chd == 'x' then chnum = 10 eloirt_hossz = 9 else chnum = string.byte(chd, 1) - string.byte('0', 1) eloirt_hossz = 10 end else return false end pop(chd, chnum) if #v ~= eloirt_hossz then -- kötőjelek nélkül 10 karakter hosszúnak kell lennie return false end v = v:sub(1, 9) pop(v, chd) pop(chnum) chsum = 0 for j = 10, 2, -1 do local elsbyte = string.byte(v, (11 - j)) chsum = chsum + (elsbyte - string.byte('0', 1)) * (11 - j) end pop(chsum) chnumdo = chsum % 11 pop(chnumdo) if chnumdo == chnum then return true else return false end end local function isISBN13(str) local v, chsum, chnum, chd, i, j, chnumdo v = str:gsub('[^%d]', '') -- a decimális jegyeken kívül mindent figyelmen kívül hagyunk pop('v_1', v) chd = str:sub(-1, -1) -- check digit az utolsó pop('chd_2', chd) if tonumber(chd) ~= nil then chnum = string.byte(chd, 1) - string.byte('0', 1) else return false end pop('chd_3, chnum_1', chd, chnum) if #v ~= 13 then -- kötőjelek nélkül 13 karakter hosszúnak kell lennie return false end v = string.sub(v, 1, 12) pop(v, chd) local elsbyte chsum = 0 for j = 1, 12 do -- z_13 = (10 - Summa (i=1,12) (z_i*(3^((i+1)%2))%10) %10 elsbyte = string.byte(v, j); --pop(elsbyte) chsum = chsum + (elsbyte - string.byte('0', 1)) * 3^((j+1)%2) --pop(3^((j+1)%2)) end pop(chsum) chnumdo = (10 - chsum % 10) % 10 pop(chnumdo) if chnumdo == chnum then pop("true") return true else pop("true") return false end end local function isI(str) local v, eloirt_hossz v = str:gsub('[^%dXx]', '') -- a decimális jegyeken kívül mindent figyelmen kívül hagyunk pop(v) eloirt_hossz = 10 pop('előírt hossza', eloirt_hossz) if #v == eloirt_hossz then pop('tízes') return isISBN10(str) elseif #v > eloirt_hossz then pop('tizenhármas') return isISBN13(str) else return false end end local function isISBN(str, link, no_isbn) if type(str) ~= 'string' then return error(false, 'Nem string bemenet az isISBN függvénynek') end local vizsgalandok = {} str = str:gsub('[^%d%,Xx -]', '') -- minden ki, ami nem számjegy, vessző, X/x, szóköz vagy kötőjel --[=[ local elso_szelet, masodik_szelet elso_szelet = string.sub(str,1,-2) masodik_szelet = string.sub(str,-1,-1) pop("elso_szelet, masodik_szelet",elso_szelet,masodik_szelet) if masodik_szelet == 'X' then elso_szelet=string.gsub(elso_szelet,'[%a<>%[%]%-%(%)%/%=%"]','') -- (str,'[^%d%,X,x]','') elso_szelet=string.gsub(elso_szelet,"ó",'') str = elso_szelet .. masodik_szelet else str=string.gsub(str,'[%a<>%[%]%-%(%)%/%=%"]','') -- (str,'[^%d%,X,x]','') str=string.gsub(str,"ó",'') end --]=] pop('str a ballaszt nélkül', str) for w in str:gmatch('[^%,]+') do w = mw.text.trim(w) pop('w', w .. '\n') if w ~= '' then table.insert(vizsgalandok, w) end end local s = {} local s_nyers = {} local h = {} local h_nyers = {} local helyes = true local formatstring if link and no_isbn then formatstring = '[[Speciális:Könyvforrások/%s|%s]]' elseif link then formatstring = '[[Speciális:Könyvforrások/%s|ISBN %s]]' elseif no_isbn then formatstring = '%s' else formatstring = 'ISBN %s' end for _, vi in ipairs(vizsgalandok) do if isI(vi) then table.insert(s, string.format(formatstring, vi:gsub('[ -]', ''), vi:gsub(' ', ' '))) table.insert(s_nyers, vi) pop('helyes előrehaladása', table.concat(s, ', ')) else helyes = false table.insert(h, error(true, 'helytelen ISBN kód') .. ': ' .. vi) table.insert(h_nyers, vi) pop('hibás előrehaladása', table.concat(h, ', ')) end end s = table.concat(s, ', ') h = table.concat(h, ', ') return helyes, s, h, s_nyers, h_nyers end -- isISBN local function _checkISBN(args) local jo_lista, mind local alkategoriak = {} local isbn = args[1] local link = (args.link ~= nil) local no_isbn = (args['isbn szöveg nélkül'] ~= nil) local hiba_jelzes = '' local milyen_lista = args[2] pop('a kapott argumentum', isbn) pop('linkelve?', tostring(link)) -- ISBN lekezelése if isbn then pop('van isbn paraméter', isbn) --isbn=string.gsub(isbn,"ISBN",'') -- a beleírt ISBN szövegeket kivesszük local helyes helyes, isbn, hiba_jelzes = isISBN(isbn, link, no_isbn) if helyes then pop('helyesek a paraméterek') end end if milyen_lista then mind = false jo_lista = (milyen_lista == 'jólista') else mind = true end -- output összeállítása local s if isbn then if hiba_jelzes then if mind then s = isbn if hibavan then s = s ..' ' .. hiba_jelzes -- a fölérendelt kategória marad hiba esetén if kategorizalas_van then s = s .. ' [[Kategória:Lapok helytelen ISBN kóddal]]' end end else if jo_lista then s = isbn elseif hibavan then s = hiba_jelzes -- a fölérendelt kategória marad hiba esetén if kategorizalas_van then s = s .. ' [[Kategória:Lapok helytelen ISBN kóddal]]' end end end end end -- if ou then s = s..ou end --ez csak nyomkövetésnél kell, de akkor nagyon -- s = s .. mw.dumpObject(args) return s end local function run(frame) args = require('Modul:Arguments').getArgs(frame) return _checkISBN(args) end local p = { run = run, isISBN = isISBN, argumentumok = args } return p