Modul:Dátumszűrés
Megjelenés
A modult a Modul:Dátumszűrés/doc lapon tudod dokumentálni
-- A MODUL FÜGGVÉNYEIT ÉS ADATAIT CSAK require('Modul:Dátumszűrés') MÓDON TUDJUK ELÉRNI.
--A CCitWeb és családja számára készült el.
local honapok = {"jan.","feb.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."} -- a magyar dátumhoz kell
local honaphossz = {31,28,31,30,31,30,31,31,30,31,30,31} -- ellenőrizzük az egyes hónapok hosszát
--[[
pop a nyomkövetés céljait szolgálja
--]]
local ou = ''
local function pop(...) -- idézőjeles rész és bővítmények az ou számára
--[[ memóriatúllépést okoz, csak teszteléshez
local list = {...}
for _, var in pairs(list) do
ou = ou .. tostring(var) .. '\n '
mw.log(ou)
end
]]
end
-- a magyar helyesírás szerinti rövidített hónapnevek a function honapnevesdate kimenetének
-- előállításához
-- az ISO 8604 szabvány szerinti dátumban a hónap helyére lépő stringet szolgáltatja
local honapsorszamekezetnelkul = {
["jan"] = "01", -- january, Januar
["feb"] = "02", -- february, Februar , février
["mar"] = "03", -- mars, März , mars
["apr"] = "04", -- april , avril első betű a, második v APRL AVRL
["maj"] = "05", -- may mai mai az első betű m, a harmadik nem r MAY
["jun"] = "06", -- june,juin az első kettő ju de a harmadik i JUN
["jul"] = "07", -- july, juli,juillet viszont itt is i, VEGYÜK KI AZ I-T A NÉVBŐL: JUL
["aug"] = "08", --, august, aout első betű a, második o
["sze"] = "09", -- sept
["okt"] = "10",
["nov"] = "11",
["dec"] = "12", -- első betű j ja, jun jul
-- első betű m mar, Mär, may, ma
}
-- a római számmal megadott hónap decimális megfelelője
local decimal = {
['I'] = 1,
['II'] = 2,
['III'] = 3,
['IV'] = 4,
['V'] = 5,
['VI'] = 6,
['VII'] = 7,
['VIII'] = 8,
['IX'] = 9,
['X'] = 10,
['XI'] = 11,
['XII'] = 12
}
local hibavan = false
-- kell a dátum ellenőrzéséhez
--[[a numerikus dátumokat kezeli le és ISO 8604 szabvány szerinti dátumot csinála bemeneti esetleg helytelenül megadott dátumból--]]
--[[ DÁTUMSZŰRŐ:Kiszűri a bemenetén kaporr dátumokbóla)a csupa számból álló ISO 8604 dátumokatb)a római számmal megadott magyar dátumokatc)a magyar, vagy idegen hónapneveket tartalmazó dátumokatés ezekből mind helyesen formázott ISO 8604 dátumokat csinál--]]
local function error ( about ) -- hibajelzést szolgál
-- Enclose errorMsg with <span>
-- Precondition:
-- about -- string
hibavan = true
local r = about
if type( about ) == "string" then
if #about == 0 then
r = "Error in Lua"
end
else
r = tostring( about )
end
return "<span class=\'error\'>" .. r .. "</span>, "
end -- error()
local function isRoman(v)
if type(v) ~= 'string' then return false end -- római számok stringek
for i = 1,string.len(v) do -- végig a stringen
local j, l = string.find ("IVXLCDM",string.sub(v,i,i)) -- az i-edik római?
if j == nil then return false end
end --do ciklus, lejárt, tehát minden karakter római számnak felel meg
return true
end
--[[ month_to_hu(m)
segéd-funkció, mely az idegen hónapneveket helyettesíti azékezet nélküli, három karakteres rövidített
magyar hónapnevekre (a rövidítést nem jelzi ponntal)
Ennek alapján beküzdi a kétjegyű hónap-sorszámot az ISO 8604 szabványank megfelelő alakban
--]]
local function month_to_hu(m)
--[[
Spanyol:enero febrero marzo abril mayo junio julio ago septiembre v. setiembre octubre noviembre diziembre
Portugál:janeiro fevereiro marco abril maio junho julho agosto setembro outubro novembro dezembro
Olasz:gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novemre dicembre
--]]
local alfa,eb,ub,e2b=''
if not m then return end
m= string.gsub (m,' ','') -- cseréljük fel a szóközöket üressel
m= string.gsub (m,'ä','a') -- März , mars problem ôû
m= string.gsub (m,'û','u')
m =string.lower (m) -- minden kisbetűs
alfa=string.match(m,"[a-z%-]+") -- kötőjel problémás
if alfa then -- vannak egyáltalán betűk
pop("1- alfa=",alfa)
m= string.sub (m,1,3) --három betünk van
eb = string.sub (m,1,1)
if eb =='m' then ub=string.sub (m,-1,-1)
if ub == 'i' then m='maj'
elseif ub == 'r' then m='mar'
elseif ub == 'y' then m='maj'
elseif ub == 'g' then m='maj' --maggio
end
elseif eb =='e' then m='jan'--spanyol
elseif eb =='g' then e2b = string.sub (m,1,2)
if e2b == 'ge' then m='jan'
elseif e2b == 'gi' then m='jun' --- olasz
end
elseif eb =='j' then
if string.sub (m,2,2) == 'a'then m='jan'
elseif string.sub (m,3,3) == 'n' then m='jun'
elseif string.sub (m,3,3) == 'i'then m='jul'
end
elseif eb =='a' then e2b = string.sub (m,1,2)
if e2b == 'ap'or e2b == 'av'or e2b == 'ab' then m='apr' --- első betű a apr, av, au, ao
elseif e2b =='au'or e2b == 'ag'or e2b == 'ao' then m='aug'
end
elseif eb =='f' then m='feb'
elseif eb =='l' then m='jul' --olasz
elseif eb =='s' then m='sze'
elseif eb =='o' then m='okt'
elseif eb =='n' then m='nov'
elseif eb =='d' then m='dec'
else return false
end
else return false
end --if alfa
return m
end-- function
local function szokoev (ev)
if ev== nil then return false end
local e= tonumber(ev)
if e then --is numeric?
if e % 400 == 0 then return true end
if ev % 100 == 0 then return false end
if ev % 4 == 0 then return true end
end
return false
end
--[[ en_to_hu(de)
angol, vagy amerikai angol dátumokból,
illetve német, francia, olasz, spanyol és portugál dátumokból csinál
ISO 8604 szabvány szerinti dátumot. Esetleg bővíthető ez a lista, ha nem vezet kollízióra az idegen neveket értelmező en_to_hu funkcióban. Hibás dátum esetén false értékkel tér vissza.
--]]
local function en_to_hu(de)
pop("en_to_hu indul")
--Az angol dátumokat jó lenne felismernie: "Dec. 10, 2013". string.lower (s)
local i,j,k,l,ho,betuk,maradek,sz,e2b,e,e2k,ev,nap,s=''
if type(de)~= 'string'then return false end
de= string.gsub (de,' ','') -- cseréljük fel a szóközöket üressel
de= string.gsub (de,'[%.%-]','/')-- cseréljük fel a pontot és kötőjelet perjellel dec/10/2013
--éôûäde= string.gsub (de,'é','e')--éôûäF
de=string.lower (de) -- minden kisbetűs
ev =string.match(de,"%d%d%d%d?")-- keress a dátumban az évet 2013
if ev then maradek = string.gsub(de,ev,'') else return false end
if maradek then
pop("en maradek?",maradek)
-- számmal indul mert little endian
maradek= string.gsub (maradek,'/','')-- már nincsenek perjelek dec10 ,vagy pl dec
local i,j
i, j = string.match(maradek,"()%d%d?()")
pop("nap indexei a maradékban=",i,j)
if j then nap=string.sub(maradek,i,j-1);end
pop("nap ?=", nap)
if nap then ho=string.gsub (maradek,nap,'') else ho = maradek end --
-- azaz dec10 esetén marad dec, dec esetén pedig ő a hónap
end
de =ev
ho=honapsorszamekezetnelkul[month_to_hu(ho)];
if ho then de=de..'-'..ho end
if nap then de = de..'-'..nap end -- összeraktuk a dátumot
pop("USA&en átalakult?", de);
local honum= tonumber(ho)
pop("honum",honum)
if honum ~= nil and 1 <= honum and honum <= 12 then
else return false -- hónap sorszáma hibás
end
pop("nap=",nap); pop("nap típusa: ",type(nap))
if nap then
local napnum= tonumber(nap)
pop("napnum",napnum)
if napnum ~= nile and 1 <= napnum and napnum <= 31 then
pop("napnum jó?g",napnum)
if szokoev(ev) then honaphossz[2] = 29 else honaphossz[2] = 28 end
if honaphossz[honum] < napnum then return false end -- nap sorszáma hibás
else return false
end -- nap sorszáma hibás
end
return de
end-- function en_to_hu
local function ekezet_le(s)
s=string.gsub(s,'á','a')
s=string.gsub(s,'é','e')
s=string.gsub(s,'í','i')
s=string.gsub(s,'ó','o')
s=string.gsub(s,'ő','ö')
s=string.gsub(s,'ú','u')
s=string.gsub(s,'ű','ö')
s=string.gsub(s,'ä','a')
s=string.gsub(s,'ô','o')
s=string.gsub(s,'û','u')
return s
end
local function numdate(de)
local ev, ho, nap,i,j,k,l, maradek
local de,perek= string.gsub(de,'%-','/')
pop("numdate de perekkel =",de,tostring(perek)); --
if perek == 2 then
i,j= string.find(de,'/');
pop("numdate_2peres, benne hol a perjel= ",i,j)
ev= string.sub(de,1,j-1)
maradek= string.sub(de,j+1,-1)
pop("numdate_2peres: év,maradek="..ev..', '..maradek);--
i,j= string.find(maradek,'/');
pop("numdate_2peres i,j a hóhoz és naphoz =",i,j)
ho= string.sub(maradek,1,j-1)
nap= string.sub(maradek,j+1,-1)
pop("2peres év,maradekban ho, nap=",ho,nap);
elseif perek == 1 then -- van év és hó
i,j= string.find(de,'/');
pop("numdate_1peres, benne hol a perjel =",i,j)
ev= string.sub(de,1,j-1)
ho= string.sub(de,j+1,-1)
pop("numdate_1peres: év,hó=",ev,ho);
else ev= de
end
if #ev < 3 then return false end
pop("év hossza=" ,tostring(#ev))
if ho then local honum= tonumber(ho)
pop("ho számmal=",tostring(honum));
if honum then
if 1 > honum or honum > 12 then return false end-- hónap sorszáma hibás
if nap then
local napnum= tonumber(nap);
pop("nap számmal=",tostring(napnum));
if not (napnum and 1 <= napnum and napnum <= 31) then return false end
if szokoev (ev) then honaphossz[2] = 29 else honaphossz[2] = 28 end
if honaphossz[honum] < napnum then
pop("túl a hónaphatáron a nap");
return false -- nap sorszáma hibás
else pop("ellenőrzött év,hó, nap",ev,ho,nap);
end
end
end
end
de=ev
if ho and ho ~= ''then de=de..'-'..ho end
if nap then de=de..'-'..nap end
pop("numdate átadja:",de);return de
end
local function hudate(de)
pop("hudate indul")
local i,j,ev,ho,nap,maradek
pop(de)
ev= string.match (de,"^%d%d%d%d?") -- ééé v. éééé levágva ev-be
pop("ev=", ev)
local hostring = string.match(de,"%a+")
if hostring then ho = string.sub(hostring,1,3) end
pop("ho=", ho);
if ho then
i,j = string.find (de, ho)
maradek = string.gsub (string.sub(de,j+1,-1),"%p",'')
nap = string.match(maradek,"%d%d?");
pop("nap=", nap);
end
if isRoman(ho) then ho= decimal[ho]
if ho then ho= tostring(ho) else return false end
-- a római számból decimálist csinál a tábla, ebből ismét string kell
-- , hogy az if utasítás végén egynemű string hónapunk legyen
pop("ho rómaiból =", ho);
else
ho = honapsorszamekezetnelkul[ho]
end
if ho then local honum= tonumber(ho)
pop("honum=",tostring(honum));
if honum then
if 1 > honum or honum > 12 then return false end-- hónap sorszáma hibás
if nap then
local napnum= tonumber(nap);
pop("napnum=",tostring(napnum));
if not (napnum and 1 <= napnum and napnum <= 31) then return false end
if szokoev (ev) then honaphossz[2] = 29 else honaphossz[2] = 28 end
if honaphossz[honum] < napnum then
pop("fals nap");
return false -- nap sorszáma hibás
else pop("másodszor",ev,ho,nap);
end
end
end
end
if ho~= nil and #ho < 2 then ho = '0'..ho end
de =ev
if ho then de=de..'-'..ho end
if nap then de = de..'-'..nap end
return de
end
--[[ datumszuro(de)
megszűri a numerikus éééé-hh-nn , illetve a Dec. 10, 2001, 10 january 2001, 2001. december 10 formákat
, leellenőrzi a dátumot (hónaphossz, létező hónap sorszám )
és valamennyiből az ISO 8604 szabvány szerinti dátumot csinál
--]]
local function datumszuro(de)
local log, cserelt
if not de then return ou, false
else de, cserelt =string.gsub(de,'%.','-');
if cserelt == 2 then de = string.gsub (de, '%-*$','') end -- ha a végén van kötőjel, lecsipjük
end
pop("datumszurodatuma paramétere= ", de);
de= ekezet_le(de)
pop("ékezetek nélküli dátum=", de)
de=string.gsub(de,'%s','')
local i,j = string.match(de,"()%d%d%d%d?()")
if not j then return ou, false -- mert nincs év a dátumban
else pop(i,j,string.sub(de,i,j-1))
end -- ha j==5, akkor a dátum elején áll az év, magyar a dátum vagy ISO
if not de or type(de)~= 'string' then return ou, false end
local d2= string.gsub(de,"[%p%-]",'') -- punctuation, kötjel is üres lesz
pop("d2 van benne kötjel?", d2)
d2 = tonumber (d2)
pop("d2 mint szám", d2)
if d2 then
--[[ a dátum számjegyes
adB1) keresünk %d%d%d%d? mintával négy, vagy háromjegyű decimálist a dátumban
ha van, megnézzük, hogy hol van ő a dátreturn 1, false endumban,
ha elől akkor tényleg magyar a dátum (átadjuk a kezelőjének: ennek nagy része már megvan az datumoutput-ban)
különben ad B2) höz
--]]
log = numdate (de)
if log == false then return ou, false end-- mert hibás a dátum
else -- betűk is vannak d2-ben
local i,j = string.match(de,"()%d%d%d%d?()")
if j==5 then log=hudate(de)-- mert magyar a dátum
pop("hudate utáni dátum= ",log )-- meghívjuk a magyar dátum lekezelését log vagy false, vagy a magyar dátum
else log=en_to_hu (de);
pop("en_to_hu utáni dátum= ",log);
end
end -- if d2
if log == false then return ou, false end-- mert hibás a dátum
pop("dátum a dátumszűrés végén =",log);
return ou, log -- azaz a dátum
end-- datumszuro
local function honapnevesdate (isodate)
local ev, ho, nap,i,j,k,l, maradek, de
if not isodate then return end
isodate = string.gsub(isodate,'%s+', '')
i,j= string.find(isodate,'-')
if i then
ev,maradek= string.match(isodate,"(%d+)%s*%-%s*([%d%p%-]+)") --,ho,nap --%-%s*(%d+)%s*%s*(%d+)%s"
pop('isodate ev,maradek=',ev,maradek)
i,j= string.find(maradek,'-')
if i then
ho,nap= string.match(maradek,"(%d+)%s*%-%s*([%d%p%-]+)")
pop("isodate ho , nap=",tostring(ho), nap);
else
ho=maradek
end
ho=honapok[tonumber(ho)]
else ev= isodate
end
de =ev
if ho then de=de..'. '..ho end
if nap then de = de .. ' ' .. tonumber(nap) .. '.' end
return de
end
local q = {
datumszuro= datumszuro, -- csak a dátumszűrés és a honapnevesdate publikus a modulból
honapnevesdate=honapnevesdate, -- valami oknál fogva kell itt a vessző neki
}
return q