Modul:Homokozó/Pepo41/Dátumból ISO 8601 dátum
Megjelenés
Homokozó/Pepo41/Dátumból ISO 8601 dátum[mi ez?] • [dokumentáció: mutat, ] • [tesztek: létrehozás]
-- Magyar dátumot konvertál át az ISO 8601 szabványnak megfelelő alakra
--[[
Az angol dátumokat jó lenne felismernie: "Dec. 10, 2013".
--]]
-- Elvárja, hogy a dátumban év és hónap szerepeljen (a nap hiányát elviseli), különben hibajelzést ad
local p={}
honapok = {"jan.","feb.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."}
local decimal={}
decimal['I'] =1
decimal['II'] =2
decimal['III'] =3
decimal['IV'] =4
decimal['V'] =5
decimal['VI'] =6
decimal['VII'] =7
decimal['VIII'] =8
decimal['IX'] = 9
decimal['X'] = 10
decimal['XI'] = 11
decimal['XII'] = 12
local honapsorszamekezetnelkul={}
honapsorszamekezetnelkul["jan"] = "01"
honapsorszamekezetnelkul["feb"] = "02"
honapsorszamekezetnelkul["mar"] = "03"
honapsorszamekezetnelkul["apr"] = "04"
honapsorszamekezetnelkul["maj"] = "05"
honapsorszamekezetnelkul["jun"] = "06"
honapsorszamekezetnelkul["jul"] = "07"
honapsorszamekezetnelkul["aug"] = "08"
honapsorszamekezetnelkul["sze"] = "09"
honapsorszamekezetnelkul["okt"] = "10"
honapsorszamekezetnelkul["nov"] = "11"
honapsorszamekezetnelkul["dec"] = "12"
function p.romantodecimal(v)
if type(v) ~= 'string' then return nil end -- ha nem string, nilt ad visssza
local n = decimal[v]
return n
end
function p.isArabic(v)
if type(v) ~= 'string' then return false end -- számok is stringek
for i = 1,string.len(v) do
j, l = string.find("0123456789",string.sub(v,i,i),1,true) -- az i-arab számjegy?
if j == nil then return false end
end --do ciklus, lejárt, tehát minden karakter arab számjegy
return true
end
function p.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
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
function p.error ( about )
-- Enclose errorMsg with <span>
-- Precondition:
-- about -- string
p.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 -- p.error()
function p.trim(str)
if str.args then
str = str.args[1]
end
if str == nil then
return nil
else
return (str:gsub("^%s*(.-)%s*$", "%1")) -- extra brackets are necessary because gsub returns multiple values
end
end
--[[
Szökőévek a következők: minden néggyel osztható év, kivéve a százzal is oszthatókat.
Szökőévek viszont a 400-zal osztható évek.
Vagyis a századfordulók évei közül csak azok szökőévek, amelyek 400-zal is oszthatók.
--]]
function p.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
-- uni8 karakterek hossza miatt szükséges az ascii konverzió
-- paraméter: text , ha nem string a fgv. false értéket ad vissza
-- , különben lecserélt betűkkel
function uni8toascii (text)
if type (text) == 'string' then
text = string.gsub(text,'á','a')
text = string.gsub(text,'é','e')
text = string.gsub(text,'í','i')
text = string.gsub(text,'ó','o')
text = string.gsub(text,'ő','ö')
text = string.gsub(text,'ú','u')
text = string.gsub(text,'ű','ü')
else return false
end
return text
end
p.honaphossz = {31,28,31,30,31,30,31,31,30,31,30,31}
function p.en_to_hu(de)
--Az angol dátumokat jó lenne felismernie: "Dec. 10, 2013". string.lower (s)
de=string.lower (de) -- minden kisbetűs
if type(de)== 'string'then
-- cseréljük fel a szóközöket üressel
-- cseréljük fel a pontot kötőjellel dec-10,2013
-- keressünk a dátumban betűt
-- nézzük, meg hogy ő az első-e (en)
-- válasszuk le a hónap nevét
-- helyettesítsük a magyar rövid hónapnévnek megfelelő sorszámmal 12-10,2013
-- a vessző utáni karakterek adják az évet 2013
-- a vessző előttieket nevezzuk maradeknak 12-10
-- írjuk egy s string elejére az évet lezárva egy kötőjellel 2013-
-- írjuk mögéje a maradékot 2013-12-10 ÉS KÉSZ
-- if string.sub (de, 1, 1)
--else return false
end
end
-- a magyar dátumokat (rövid, vagy hosszú hónapnevekkel, ill. római számokkal ) konvertálja éééé-hh-nn formára
-- ha eleve éééé-hh-nn formát kap (esetleg hibásan), korrigálva visszaadja
-- ha éééé.hh.nn. formát kap (esetleg hibásan), korrigálja és átalakítja
-- a dátumokat ellenőrzi (még a szökőévet is)
-- paramétere a string formátumú dátum, ha nem ilyet kap hamis értékkel tér vissza
-- visszatérési értéke az éééé-hh-nn forma, vagy false dátumhibás esetekben
-- igényli a uni8toascii függvényt a különböző stringműveletek miatt
function p.dateconv(de)
de = string.gsub(de,'%(', '')
de = string.gsub(de,'%)', '')
de = string.gsub(de,'%.', '-') -- a pontot helyttesítjük kiskötőjellel
de = string.gsub(de,"%s",'') -- belső szóközök eltávolítása
if string.sub(de,-1,-1) == '-' then de = string.sub(de,1,-2) end -- utsó kötjel lecsípve
local i,j,ev,ho,nap,rovidho,maradek
local datt =''
local ou='' -- gyűjtő string
if not de then return false, ou end
if p.isArabic(string.gsub(de,"-",'')) then -- itt kötőjel benne
-- itt csak számjegyeink vannak
i,j = string.find(de,"-")
if i then ev = string.sub(de,1,i-1);ou=ou..'\n'.."1 arab év=".. ev
elseif #de ~= 0 then ev = string.sub(de,1,#de); return ev
elseif #de == 0 then return false, ou
end -- mert évnek lennie kell
maradek = string.sub(de,i+1,-1)
if maradek then -- van még hó és nap adat
ou=ou..'\n'.."1 arab maradék=".. maradek
i,j = string.find(maradek,"-") --talált az évet követő maradékban kötőjelet, ami hónapot és napot válsztja el
if i then ho = string.sub(maradek,1,i-1)
nap = string.sub(maradek,i+1,-1);ou=ou..'\n'.."1 arab ho=".. ho;ou=ou..'\n'.."1 arab nap=".. nap
else ho=maradek --return false, ou
if tonumber(ho)>12 then return false, ou
elseif #ho ==1 then ho= '0'..ho
end
end
else return true , ev -- mert kell lennie maradéknak, azaz hónapnak és napnak is
end -- eddig, ha volt maradek
--if tonumber(ho)>12 then return false, ou
-- elseif #ho ==1 then ho= '0'..ho
--end
if nap and tonumber(nap) > 31 then return false, ou end
if nap and tonumber(nap)< 10 then nap= '0'..nap end
else -- nem csak arab számok alkotják a dátumot, pl. római, vagy betűvel adott hónap
i,j = string.find(de,"-")
if i then ev = string.sub(de,1,i-1) end
if ev then ou=ou..'\n'.."2 nem arab év= ".. ev end --mert évnek lennie kell
if i then maradek = string.sub(de,i+1,-1) end
if maradek then -- van még hó és nap adat
rovidho=string.match(maradek,"[^0-9]+") -- minden ami nem szám
if rovidho then
rovidho= uni8toascii (rovidho)
rovidho=string.sub(rovidho,1,3) -- abból az első három karakter itt jön az ascii problémánk
rovidho=string.gsub(rovidho,'-','') -- már nem kell a kötőjel és semmiképp sem római számjel
ou=ou..'\n'.."1 nem arab rovidho= ".. rovidho
if p.isRoman(rovidho)then ho= p.romantodecimal(rovidho) -- ha római szám a hó
if ho then
if ho < 10 then ho = '0'..tostring(ho)
elseif ho > 12 then return false, ou
else ho = tostring(ho)
end
else return false, ou -- nincs a római számnak megfelelő hónap
end
ou=ou..'\n'.."2 nem arab ho,ha római=".. tostring(ho)
else -- a rövid hónap nem római számokból áll
ho = (honapsorszamekezetnelkul[rovidho]) -- kikeressük a hónap sorszámát, ami kétjegyű karakter
if ho then ou=ou..'\n'.."2 nem arab ho,ha nem római="..ho else return false end
end -- római szám lekezelve
else return false, ou-- nincs rövidhó , tehát hónapunk sem
end --rövidho ág vége
nap=string.match(maradek,"[0-9]+") -- a számok alkotják a napot nap=string.sub(nap,-2,-1)
if nap then
ou=ou..'\n'.."1 nap="..nap
nap=string.sub(nap,-2,-1) -- a legfeljebb kétjegyű nap
if tonumber(nap) < 10 then nap='0'..nap
elseif tonumber(nap) > 31 then return false, ou -- túl nagy nap
end
ou=ou..'\n'.."2 nem arab nap= ".. nap
--a nap vizsgálat vége
else --return false, ou --napunk nincs
end
end -- else maradék ág vége
end -- a dátumvizsgálat vége
-- ellenőrzés szökőév a februárhoz
-- hónap utólsó napja a többi hónaphoz
if nap then
if p.szokoev(ev) then h = 29 else h = 28 end
ou=ou..'\n'.."határnap="..tostring(h);ou=ou..'\n'.."végső nap="..nap;ou=ou..'\n'.."ho a végén="..ho
if tonumber(ho) == 2 and tonumber(nap)> h then return false, ou end
if tonumber(ho)~= 2 then
local h= p.honaphossz[tonumber(ho)] -- a tábla tartalmazza a zárónapok sorszámait
if h and tonumber(nap)> h then return false, ou end
end
end
-- most összerakjuk a kimenő dátumot
if ev then datt = datt..ev end
if ho then datt = datt ..'-'..ho end
if nap then datt = datt ..'-'..nap end
return datt, ou
end --dateconv rutin
p.getArg = function (arg,alternativarg, assign ) -- itt eredetileg a frame nem paraméter
-- Retrieve template argument
-- Precondition:
-- arg -- string or number; argument identifier
-- assign -- any, optional; default value
-- Uses:
-- mw.getCurrentFrame()
--local r = mw.getCurrentFrame().args[ arg ] állt itt eredetileg
-- a kurrens frame argumentumai közül az arg kulccsal megadott
local r,r1,r2 = nil
-- a frame nil értéket ad, ha nem szerepel a paraméter, ''-et ad, ha szerepel, de nincs benne karakter
if args[ arg ] ~=nil and args[ arg ] ~='' then r1 = args[ arg ] end
-- r1 nil marad, ha a paramétert nem adták meg, vagy üresen adták meg
if args[ alternativarg ]~= nil and args[ alternativarg ] ~='' then r2 = args[ alternativarg ] end
-- r2 nil marad, ha az alternatív paramétert nem adták meg, vagy üresen adták meg
if r1 then r = r1 else
if r2 then r = r2 end
end
if type( r ) ~= "string" then
if type( assign ) == nil then
r = "{{{<" .. arg .. ">}}}" --ha r nem string tipus, azaz és assign nil érték
else
r = assign -- ha r nem string tipus, és assign nem nil
end
end
return r -- ha r string tipus, vagy nil
end
local function _konverzio(frame)
local datum , outdatum , nyom = nil
datum= p.getArg("dátum", "date")
if datum then datum, nyom = p.dateconv(datum)
if not datum then datum = p.error("hibás dátum") end
return datum
end
end
function p.run(frame)
local pframe = frame:getParent()
args = pframe.args -- azok a paraméterek, amelyek a sablont kisérik a Pepo41/CCitPer --sablon hivása oldalon
config = frame.args -- az #invoke utasításban átadott paraméterek
return _konverzio(frame)
end
return p