Modul:Homokozó/Pepo41/Fekete CutPer

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

Homokozó/Pepo41/Fekete CutPer[mi ez?] • [dokumentáció: mutat, szerkeszt] • [tesztek: létrehozás]

--Version: 2010.01.13_15.20
local ds =require("Modul:Dátumszűrés") 

local lang = mw.getContentLanguage() 

local ou = ''
function pop(mi,mv1,mv2,mv3,mv4,mv5)  -- idézőjeles rész és 5 bővítmény az ou számára
    	if not mi then return else ou = ou..mi..'\n ' end
      if not mv1 then return else ou = ou..mv1..'\n' end
	if not mv2 then return else ou = ou..mv2..'\n' end
	if not mv3 then return else ou = ou..mv3..'\n' end
	if not mv4 then return else ou = ou..mv4..'\n' end
	if not mv5 then return else ou = ou..mv5..'\n' end
    
end
function val_to_str(v) 
    if type(v) == 'string' then 
        v = mw.ustring.gsub(v, '\n', '\\n')
        if mw.ustring.match(mw.ustring.gsub(v, '[^\'"]', ''), '^"+$') then
            return "'" .. v .. "'"
        end
        return '"' .. mw.ustring.gsub(v, '"', '\\"' ) .. '"'
    else 
        return type(v) == 'table' and table_to_str(v) or tostring(v)
    end
end 

hibavan = false  
kategorizalas_van = false  

 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 = "Error in Lua"
        end
    else
        r = tostring( about )
    end
    return  "<small><font color=\"black\">" ..' ('.. r..') ' .. "</font></small> "
    --"<span class=\'error\'><font color=\"red\"><small>" ..' ('.. r..') ' .. "</small></font></span>, "
   -- return "<span class=\'error\'><font color=\"black\"><small>" .. r .. "</small></font></span>, "
end -- error()

function 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


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

local rovidhonapnev={}
	rovidhonapnev["jan"] = "jan." 
	rovidhonapnev["feb"] = "feb." 
	rovidhonapnev["már"] = "márc." 
	rovidhonapnev["ápr"] = "ápr." 
	rovidhonapnev["máj"] = "máj." 
	rovidhonapnev["jún"] = "jún." 
	rovidhonapnev["júl"] = "júl." 
	rovidhonapnev["aug"] = "aug." 
	rovidhonapnev["sze"] = "szept." 
	rovidhonapnev["okt"] = "okt." 
	rovidhonapnev["nov"] = "nov." 
	rovidhonapnev["dec"] = "dec." 	
 
local decimal={}
decimal['I'] =1
decimal['II'] =2
decimal['III'] =3
decimal['V'] =5
decimal['VI'] =6
decimal['VII'] =7
decimal['VIII'] =8
decimal['IX'] = 9
decimal['X'] = 10
decimal['XI'] = 11
decimal['XII'] = 12

function romantodecimal(v)
    if type(v) ~= 'string' then return nil end -- ha nem string, nilt ad visssza
    local n = decimal[v] 
    return n
end
local function isISSN( str)
    local v,chsum,chnum,chd,i,j,chnumdo
    if #str>9 then str= string.sub(str,1,9) end -- csak az első 9 marad, többi ignorálva
    
    v=''
    for w in string.gmatch(str, "%d") do
         v=v..w
    end    
    v=string.sub(v,1,7) -- 
    chd =  string.sub (str,-1,-1); -- check digit az utólsó 
    
    if chd == 'X' or isArabic(chd) then
        if chd == 'X' then chnum = 10 else chnum = string.byte(chd,1) - string.byte('0',1) end 
      else
      return false
    end 
    chsum = 0
    for j = 8,2,-1 do   
      local elsbyte = string.byte(v,(9 - j))
      chsum = chsum + (elsbyte - string.byte('0',1)) * j
    end -- j ciklus
    
    if chsum % 11 == 0 then chnumdo=0 else chnumdo = 11 - (chsum % 11) end  
    if chnumdo == chnum then return true else return false end
 
 end -- isISSN
 



function isArabic(v)
    if type(v) ~= 'string' then return false end --  számok is stringek
         -- az i-arab számjegy? 
    	if tonumber(v) == nil then return false else return true end 
end

local lans={}
	
    lans["an"] = "van"
    lans["ar"] = "van"
    lans["aze"] = "van"
    lans["be"] = "van"
    lans["bg"] = "van"
    lans["bn"] = "van"
    lans["bs"] = "van" 
    lans["ca"] = "van" 
    lans["chm"] = "van"
    lans["cy"] = "van"
    lans["cs"] = "van"
    lans["da"] = "van"
    lans["de"] = "van"
    lans["ee"] = "van"
    lans["el"] = "van"
    lans["en"] = "van"
    lans["eo"] = "van"
    lans["es"] = "van"
    lans["et"] = "van"
    lans["eu"] = "van"
    lans["fa"] = "van"
    lans["fi"] = "van"
    lans["fo"] = "van"
    lans["fr"] = "van"
    lans["fy"] = "van"
    lans["ga"] = "van"
    lans["gd"] = "van"
    lans["gl"] = "van"
    lans["grc"] = "van"
    lans["gu"] = "van"
    lans["he"] = "van"
    lans["hi"] = "van"
    lans["hr"] = "van"
    lans["ht"] = "van"
    lans["hu"] = "van"
    lans["hy"] = "van"
    lans["hz"] = "van"
    lans["id"] = "van"
    lans["is"] = "van"
    lans["it"] = "van"
    lans["ja"] = "van"
    lans["jp"] = "van"
    lans["ka"] = "van"
    lans["kk"] = "van" 
    lans["km"] = "van"
    lans["kn"] = "van"
    lans["ko"] = "van"
    lans["ku"] = "van"
    lans["ky"] = "van"
    lans["lat"] = "van"
    lans["lb"] = "van"
    lans["lo"] = "van"
    lans["lit"] = "van"
    lans["lv"] = "van"
    lans["mk"] = "van"
    lans["mn"] = "van"
    lans["mo"] = "van"
    lans["ms"] = "van"
    lans["mt"] = "van"
    lans["my"] = "van"
    lans["ne"] = "van"
    lans["nl"] = "van"
    lans["nn"] = "van"
    lans["no"] = "van"
    lans["oc"] = "van"
    lans["pa"] = "van"
    lans["pl"] = "van"
    lans["pt"] = "van"
    lans["rm"] = "van"
    lans["ro"] = "van"
    lans["ru"] = "van"
    lans["rue"] = "van"
    lans["sa"] = "van"
    lans["sah"] = "van"
    lans["scn"] = "van"
    lans["se"] = "van"
    lans["sh"] = "van"
    lans["sk"] = "van"
    lans["slo"] = "van"
    lans["sm"] = "van"
    lans["sq"] = "van"
    lans["sr"] = "van"
    lans["sv"] = "van" 
    lans["tam"] = "van"
    lans["te"] = "van"
    lans["tet"] = "van"
    lans["tg"] = "van"
    lans["th"] = "van"
    lans["tk"] = "van"
    lans["tag"] = "van"
    lans["to"] = "van"
    lans["tr"] = "van"
    lans["tat"] = "van"
    lans["ty"] = "van"
    lans["uk"] = "van"
    lans["ur"] = "van"
    lans["uz"] = "van"
    lans["vi"] = "van"
    lans["yi"] = "van"
    lans["zh"] = "van"
 

toRoman =function ( num) 
    if ( num < 0 or  num > 9999) then return -1 end
 local romanOnes =  {}
 local romanTens =  {}
 local romanHund =  {}
 local romanThou =  {}
     romanOnes =  {"I","II","III","IV", "V", "VI", "VII", "VIII", "IX"}
     romanTens =  { "X","XX",  "XXX",  "XL",  "L",  "LX",  "LXX", "LXXX", "XC"}
     romanHund =  {"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}
     romanThou =  {"M","MM","MMM","MMMM","MMMMM","MMMMMM","MMMMMMM","MMMMMMMM",
                   "MMMMMMMMM"}
 
     ones =  num % 10
     tens = ( num -  ones) % 100
     hund = ( num -  tens -  ones) % 1000
     thou = ( num -  hund -  tens -  ones) % 10000
 
     tens =  tens / 10
     hund =  hund / 100
     thou =  thou / 1000
     romanNum = ''
     if ( thou > 0) then romanNum = romanNum .. romanThou[ thou] end
     if ( hund > 0) then romanNum = romanNum .. romanHund[ hund] end
     if ( tens > 0) then romanNum = romanNum .. romanTens[ tens] end
     if ( ones > 0) then romanNum = romanNum .. romanOnes[ ones] end
     return  romanNum
 end    



local function getArg(le,arg,alternativarg, assign ) -- itt eredetileg a frame nem paraméter
    -- Retrieve template argument
    -- Precondition:
    -- 	    le true értékkel jelzi, hogy levágható a paraméter végéről a felesleges vessző és pont
    --     arg     -- string or number; argument identifier
    --     alternativarg -- a paraméternek a másik neve
    --     assign  -- any, optional; default value
    
    local r1 = args[ arg ] 
    local r2 = nil
    if alternativarg ~= nil then  r2 = args[ alternativarg ] end
    if r1 == '' or r1 ==nil then r =  r2  else r = r1 end
    if r  == '' then r =  nil  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
    else -- r típusa string
    	if #r > 1 then -- ha r strint típus és legalább két karaktert tartalmaz
    		local utso_karakter = string.sub(r,-1,-1); 
    		if le then 
    			if utso_karakter == '.' or utso_karakter == ',' then r=string.sub(r,1,-2) end --lecsípjük az utólsó pontot, vagy vesszőt 
    		end
    	end
    end
    return r  
end


function _citper(frame)
  local hiba_jelzes=' '          
  local honapok = {"jan.","feb.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."}
  local szerzo, szerzo2, szerzo3, cim, alcim, periodika, ev,ho,nap, evfolyam, szam, oldal = nil
  local issn, doi, misc, url, nyelvkod,accd,arurl,archd =nil 
  local aut,aut2,aut3,tit,subtit,per,ann,lun,die,tom,fasc,pag,misc,volume,lan,nyelv,accd,aurl,archd, outdatum =nil 
  
  
  szerzo= getArg(true,"szerző","aut") 
  szerzo2= getArg(true,"szerző2","aut2") 
  szerzo3= getArg(true,"szerző3","aut3")
  cim= getArg(false,"cím","tit")    
  alcim= getArg(false,"alcím","subtit")
  periodika= getArg(true,"periodika","per")
  ev= getArg(true,"év","ann")
  ho= getArg(true,"hó","lun") 
  if tonumber(ho) then 
  	ho=honapok[tonumber(ho)] 
  end
  nap= getArg(true,"nap","die") 
  datum= getArg(true,"dátum","date") 
  szam= getArg(true,"szám","fasc") 
  volume= getArg(true,"kötet","volume") 
  url= getArg(false,"url") 
  lan=getArg(true,"nyelvkód","lan")
  accd=getArg(true,"elér","accd")
  issn= getArg(true,"issn")
  oldal= getArg(true,"oldal","pag")
  archd=getArg(true,"archívdátum","archd")
  aurl=getArg(true,"archívurl","aurl") 
  doi= getArg(true,"doi")
  evfolyam= getArg(true,"évfolyam","tom") 
  misc=getArg(true,"egyéb","misc")
  
  
  --szerzők
  
if  szerzo2 == nil  then  -- előre léptetjük a második alszerzőt
                   if szerzo3 then szerzo2 = szerzo3; szerzo3 = nil  end
	end				  
 
 if  szerzo == nil then  -- előre léptetjuk az alszerzőket 
                   if szerzo2 then szerzo = szerzo2 ; szerzo2 = nil  end
                   if szerzo3 then szerzo2 = szerzo3 ;szerzo3 = nil  end
	end				  
  
  if szerzo ~= nil then  
            			if szerzo2 then szerzo=szerzo.." &#150; "..szerzo2 end 
  						if szerzo3 then szerzo=szerzo.." &#150; "..szerzo3 end
  						szerzo = szerzo..":&#x20;"
  	end

  --cím és alcím
  local terminator
  if cim  
     then cim = trim(lang:ucfirst(cim)); pop("cim",cim)
     else cim = " (cím nélkül) "
      end
  if alcim   then 
              	alcim=lang:ucfirst(alcim)  --string.upper(kezdbet)..kezdbetutan
              	if cim   then 
              	         if string.sub(cim,-1,-1) ~= ":" then
               								    cim= cim..": "..alcim 
           				 else cim= cim.." "..alcim
           				 end
           		end		 --	
  end 
  if cim then 
  	terminator = string.sub(cim,-1,-1) 
	if (terminator ~= '?' and terminator ~= '!'and terminator ~= ',' and terminator ~= '.' and terminator ~= '\166' ) 
	    then      cim= cim.."."  end   
 
  end   
  


-- periodika

 if periodika and periodika ~= '' then periodika="&#x20;".."''"..periodika..",''" 
  
  else 
         if cim and cim ~= '' then hiba_jelzes = hiba_jelzes..' '.. error (false,"periodika nélkül") end  
  end



 if ev then  
	local nums={} --  tárolja az évszámokat
	local hossz={} --  tárolja az évszámok számát
	
	for w in string.gmatch(ev,'%d+') do -- csak decimálisakat keres 
		nums[#nums + 1] = w; hossz[#hossz + 1] = #w
	end
    pop("hány tagból áll az év?", #nums)
		if #nums == 2 then -- lásd almanachok 2011-2012
			pop("évtag 1", nums[1])
			pop("évtag 2", nums[2])
		   if  hossz[1] ==hossz[2]   then 			
		   		datum = nil			   
		   		ev=nums[1] -- és most bármi volt a két év adat közt az inputban nagykötőjel köti össze őket.
			   	if nums[2] then ev=ev..' – '..nums[2] end
		   end
		else -- pl éééé-éé az év megadásának formája
			
			datum = string.sub(ev,1,4)..'.' -- nem tekintjük az éééé-hh forma szándékának, levágjuk
			pop("dátum évből1", datum)
			if ho then datum = datum..' '..ho; pop("dátum évből,hóból", datum) 
				if nap then datum = datum..' '..nap..'.' ;
					pop("dátum évből,hóból,napból", datum)
				end
			end
			ev=nil -- mert már összeállt a dátum
		end 	
end  -- if ev


-- DÁTUM
 	
 if datum  then
 	local nyom=''-- ha van dátum (mostmár vagy a dátum, vagy ennek hiányában az év)
    local nyom, dou= ds.datumszuro(datum)
    pop("nyom",nyom)
    pop("dou",tostring(dou))
	if dou 
		then outdatum = ds.honapnevesdate(dou) -- a zárójelezés a szám és év sorrend tisztázásánál
		    pop("outdatum",outdatum)
		else outdatum = datum -- bármit adtak meg, menjen az outputra 
			 hiba_jelzes = hiba_jelzes..' '..error (false, "hibás dátum") -- az outdatum körül még nincs zárójel
	end    	 
	pop("*outdatum", outdatum)	
 end 

if szam then 
	szam = string.gsub (szam, '-' , '–')
  	szam = string.gsub (szam, '—' , '–')
  	szam =  szam..". sz." 
	--pop("*szám=", szam) 
end -- if szam

local evszam = ''
  
if not szam then szam=''end -- ha a szám nil érték, akkor legyen üres a konkatenálás miatt
if not outdatum then outdatum='' end -- ha a szám nil érték, akkor legyen üres a konkatenálás miatt

if ev then evszam =  "&#x20;"..'('..ev..') '..szam.." " 
else
  	 if outdatum ~= '' then evszam =  "&#x20;"..szam.." "..'('..outdatum..') ' 
  	 else 
  	 	  if szam then evszam =  "&#x20;"..'(????) '..szam.." " end
  	 end
end
 -- pop("evszam",evszam)
  
  -- évfolyam


  if evfolyam then
           if isRoman(evfolyam) == false then 
  	          if isArabic(evfolyam) then evfolyam = toRoman(tonumber(evfolyam)) end
  	       end -- evfolyam arab szám
  	       evfolyam = "&#x20;"..evfolyam..". évf."
  	   end -- nem nil az évfolyam    
  
  -- oldal


  if oldal then 
  	oldal = string.gsub (oldal, '-' , '–') -- kiskötőjelből nagy
  	oldal = string.gsub (oldal, '—' , '–') -- hetvenkvirtesből nagy
  	oldal = string.gsub (oldal, '%.,' , ',') -- pontot követő veszőből vesszőt
  	oldal = string.gsub (oldal, '%.' , '') -- pontból üreset
  	oldal = string.gsub (oldal, ',' , '.,') -- végül vesszőből ponot kovető vesszőt
  	oldal ="&#x20;"..oldal..". o." 
  	end

-- ISSN
--<abbr title="0708-9635">ISSN</abbr>
if issn then --<abbr title="International Standard Serial Number:  0708-9635">ISBN</abbr> 
    if isISSN (issn) then 
    issn = "<abbr title=\""..string.sub(issn,1,9).."\"> ISSN </abbr>"
    else hiba_jelzes = hiba_jelzes..' '..error(false,"hibás ISSN")
    end    
else issn = '' -- ha nem létezik, legyen üres
end	-- issn 
 
  -- archívdátum -- archívurl
  
   if aurl  then 
   		aurl = string.gsub(aurl, '%s','%%20')  -- URL ÁTKÓDOLÁSA 
		aurl = string.gsub(aurl, '\"','%%22')
		aurl = string.gsub(aurl, "\'",'%%27')
		aurl = string.gsub(aurl, "<",'%%3c')
		aurl = string.gsub(aurl, ">",'%%3e')
		aurl = string.gsub(aurl, "%[",'%%5b')
		aurl = string.gsub(aurl, "%]",'%%5d')
		aurl = string.gsub(aurl, "{",'%%7b')
		aurl = string.gsub(aurl, "|",'%%7c')
		aurl = string.gsub(aurl, "}",'%%7d')
     			if archd then -- ha van dátum (mostmár vagy a dátum, vagy ennek hiányában az év)
    				local outarchd
					local dou= ds.datumszuro(archd)
					if dou 
						then outarchd = ds.honapnevesdate(dou)
								if aurl then 
	  							--<span title="2006-05-17">[http://archive.org/details/erdeishegyicser00budegoog arch]</span>
  									archd = "<span title=\""..outarchd.."\">["..aurl.." arch]</span>"
  									else hiba_jelzes = hiba_jelzes..' '..error(true," archívurl nélkül) ")
  								end
						else hiba_jelzes = hiba_jelzes..' '..error(true, "hibás archívdátum")
					end  -- if dou  	 	
				end	-- if archd
     		else archd = nil
   end


-- doi
  
 
    if doi then 
    	local doicontrol, doi_10_utani_resz =''
    	doicontrol = string.sub(doi,1,2)
    	doi_10_utani_resz = string.sub(doi,3,-1)
    	if doicontrol ~= "10" then doi = '10'..doi_10_utani_resz end
    	doi = "<span title=\""..doi.."\">[".."http://dx.doi.org/"..doi.." doi".."]</span>" 
    end 
-- kötet

  if volume then volume =" "..volume.." k." end
 
 --egyéb 
 
 
  if misc then misc ="&#x20; "..misc end

 -- url
 
 
  if url ~= nil  and cim ~= nil then
	-- SZÜKSÉGES CSERÉK:cím=[http://crypto.com/papers/jbug-Usenix06-final.pdf Keyboards and Covert Channels"]
	--newline 	[ 	     ] 	     |    Ezek kellenek, mert az URL ráhúzásakor bezavarnak
	--space    &#91; 	&#93; 	&#124;
		cim = string.gsub(cim,'\n',' ')
		cim = string.gsub(cim,'%[','&#91;')  
		cim = string.gsub(cim,'%]','&#93;')
		cim = string.gsub(cim,'%|','&#124;')
	
		url = string.gsub(url, '%s','%%20') -- az URL átkódolása kell.
		url = string.gsub(url, '\"','%%22')
		url = string.gsub(url, "\'",'%%27')
		url = string.gsub(url, "<",'%%3c')
		url = string.gsub(url, ">",'%%3e')
		url = string.gsub(url, "%[",'%%5b')
		url = string.gsub(url, "%]",'%%5d')
		url = string.gsub(url, "{",'%%7b')
		url = string.gsub(url, "|",'%%7c')
		url = string.gsub(url, "}",'%%7d')
           cim = "[" .. url .. " " .. cim .. "]"
          -- http://mek.oszk.hu/00300/00355/html/ABC11587/12167.htm| Bányadémon és bergmandl: Mi van, ha alcím is van?
  	 end -- nem nil az url


 -- nyelv


local LetezoLansablon = false
  if lan then 
  			if  (lan ~= nil ) and  (cim==nil)  --ha nincs cím akkor értelmetlen 
             	then -- hiba_jelzes = hiba_jelzes..' '..error("nyelv cím nélkül")..' ' 
             	else  
             			if lans[lan] ~= nil then  -- ha fenn van a listánkon, akkor nem jöhet PARANCSFÁJL HIBA
             				     LetezoLansablon = frame:callParserFunction{ name = '#ifexist',args = { 'lan', lan }}
			                     if LetezoLansablon then nyelv = frame:expandTemplate{ title = lan, args = {lan } } ..' 'end
						--frame:expandTemplate{ title = 'template', args = { 'arg1', 'arg2', name = 'arg3' } }
						else -- különben mi magunk kiírjuk , mert így beszédesebb
								  nyelv = lan -- legyen maga a megadott paraméter pl. "krixkrax"
							      --hiba_jelzes = hiba_jelzes..' '..error("ismeretlen nyelvkód")..' '
						end
			 end	
   end 

 
 
 -- elérés dátuma 

if accd then -- ha van elérés
    	local outaccd
    	local nyom=''
	local nyom,dou= ds.datumszuro(accd)
	--pop("a dátumszűrés eredménye",nyom)
	if dou 
		then outaccd = ds.honapnevesdate(dou)
		accd = "Hozzáférés: "..outaccd ..' '	
		else hiba_jelzes = hiba_jelzes..' '..error(false,"hibás elérési dátum")
	end  -- if dou  	 	
end	-- if accd


-- az output összeállítása
 
 s=''
	if szerzo then s = s.. szerzo  end
	if cim  then s = s..cim  end
	if nyelv  then s = s..nyelv  end 
	if periodika  then s = s..periodika  end 
	if evfolyam  then s = s..evfolyam  end 
	if volume   then s = s..volume  end 
    if evszam  then s = s..evszam  end 
    if oldal  then s = s..oldal  end 
	if archd  then s = s..archd  end 
	if issn  then s = s..issn  end 
	if doi  then s = s..doi  end 
	if accd  then s = s..accd  end 
	if misc  then s = s..misc  end

	--if ou  then s = s..ou  end  --ez csak nyomkövetésnél kell, de akkor nagyon
	if hibavan then s = s ..' '..hiba_jelzes..' 'end
    if kategorizalas_van then s = s .. "[[Kategória:Hibás paraméterezésű CitPer-t tartalmazó lapok]]" end  
  return s
 end 

function 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 _citper(frame)
end

local p = {
	run = run, -- semmi mást nem adunk át, csak a futást indító rutint

}

return p