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

A Wikipédiából, a szabad enciklopédiából

Homokozó/Pepo41/Dátumból ISO 8601 dátum[mi ez?] • [dokumentáció: mutat, szerkeszt] • [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