Modul:Homokozó/Pepo41/Dátumból ISO 8601 dátum

Innen: Hungaropédia
Ugrás a navigációhozUgrás a kereséshez

A modult a Modul:Homokozó/Pepo41/Dátumból ISO 8601 dátum/doc lapon tudod dokumentálni

-- 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