Modul:Kalenderfunktioner

Från Wikipedia

Dokumentation [visa] [redigera] [historik] [rensa sidcachen]


local p = {}

--[[
 veckostart, ger datum för första dagen (måndagen) en viss vecka ett visst år
 
 parametrar
 ==========
 1: årtal (yyyy)
 2: veckonummer (w)
 3: formateringsinformation, om ingen formateringsinformation anges används fås resultatet med formatet "Vecka w yyyy börjar yyyy-mm-dd"
 
 exempel
 =======
 {{#invoke:Kalenderfunktioner|veckostart|2015|14}}
 ger resultatet
 Vecka 14 2015 börjar 2015-03-30

 {{#invoke:Kalenderfunktioner|veckostart|2015|14|%Y-%m-%d}}
 ger resultatet
  2015-03-30

]]

p.veckostart = function(frame)
  local y = tonumber(frame.args[1]) or 2015
  local w = tonumber(frame.args[2]) or 1
  local f = frame.args[3] or 'Vecka '..w..' '..y..' börjar %Y-%m-%d'
  local t0 = os.time{year=y, month=1, day=1}
  local w0 = os.date("*t", t0)['wday']+1
  if (os.date("*t",t0 + 86400*(w*7-1-w0 % 7))['year']>y) or (w<1) then
     return '<span class="error">Fel veckonummer!</span> (det finns ingen vecka med nummer '..w.. ' som börjar under ' .. y .. ').'
  end
  return os.date(f,t0+86400*(w*7-4-w0 % 7))
end

--[[
 nteveckodag, returnerar datum för den n:te veckodagen av angiven typ i angiven månad och angivet år

 parametrar 
 ==========
 1 (obligatorisk): år, till exempel 2015
 2 (obligatorisk): månad, till exempel 11
 3 (obligatorisk): veckodag 1-7 (1=söndag, 2=måndag, ..., 7=lördag), till exempel 5 (torsdag)
 4 (obligatorisk): n, till exempel 4 

 exempel
 =======
 {{#invoke:Kalenderfunktioner|nteveckodag|2015|11|5|4}}
 ger resultatet
 26
 Den fjärde torsdagen i november månad 2015, Thanksgiving i USA, infaller alltså den 26 november.
]]

p.nteveckodag = function(frame)
   local y = tonumber(frame.args[1])
   local m = tonumber(frame.args[2])
   local w = tonumber(frame.args[3])
   local n = tonumber(frame.args[4])
   local t0 = os.time{year=y, month=m, day=1}
   local w0 = os.date("*t",t0)['wday']
   return tonumber(os.date("%d",t0+86400*(n*7+(w-w0)%7 -7)))
end

--[[
 emanad, returnerar indata med stavning för månad som förekommer med svensk stavning översatt till engelska. 
 Eventuell versaliering av svenska stavningen ignoreras, såväl mars som Mars och maRS översätts till March.
 Den tänkta användningen är att kompensera för att #time inte kan hantera de fyra månaderna mars, juni, juli och augusti med svensk stavning. Se mall Date.

 Begränsningar:
 - Endast strängar med högst en förekomst av månad kan hanteras.
 - Resten av strängen konverteras till gemener som en bieffekt. Det är normalt bara siffror.

 parametrar 
 ==========
 1 (obligatorisk): en sträng med högst ett månadsnamn stavat på svenska 

 exempel
 =======
 {{#invoke:Kalenderfunktioner|emanad|27 mars 2016}}
 ger resultatet
 27 March 2016
]]

function p.emanad(frame)
	local table manader = { januari='January', februari = 'February', mars = 'March', april = 'April', maj = 'May', juni = 'June', juli = 'July', augusti = 'August', september = 'September', oktober = 'October', november = 'November', december = 'December' }
	local manad = string.lower(frame.args[1] or '')
	local nymanad = ''
	for s, e in pairs(manader) do
		nymanad = mw.ustring.gsub(manad,s,e)
		if not (nymanad == manad) then return nymanad end
	end
	return manad
end	

--[[
   Paskdagsdatum, returnerar datum för Påskdagen för ett år eller en följd av år

   Parametrar 
   ==========
   year   (frivillig): anger det första år som datum önskas för. year måste ligga mellan 1800 och 2099. (Standardvärde = innevarande år)
   year2  (frivillig): det sista år som datum önskas för. year2 måste ligga mellan 1800 och 2099. (Standarvärde = samma som första året)
   länkar (frivillig): om parametern anges så fås wikilänkar till datum och till årtal. (Standardvärde = inga länkar)
   prefix (frivillig): text som föregås varje datum. (Standardvärde = inget prefix)
   suffix (frivillig): text som följer efter varje datum. (Standardväde = inget suffix)
   nl     (frivillig): antalet radmatningar efter varje datum. (Standardvärde = 0)
   format (frivillig): om parametern har värdet "ISO 8601" returneras datum på formatet YYYY-MM-DD
]]

function p.Paskdagsdatum(frame)
	local res = '' 
	local year1 = tonumber(frame.args['year'] or os.date('!*t')['year'])
	local year2 = tonumber(frame.args['year2'] or year1)
	local prefix = frame.args['prefix'] or ''
	local suffix = frame.args['suffix'] or ''
	local nl = tonumber(frame.args['nl'] or '0')
	local format = frame.args['format'] or ''
	local links = frame.args['länkar']
	if (year1<1800) or (year1>2099) or (year2<1800) or (year2>2099) then return 'Felaktigt parameter värde i funktionsanrop. År måste vara från 1800 till 2099!' end
	for year=year1,year2 do
		local day, month = 0, ''
		if (year==1802) then day, month = 25, 'april' end
		if (year==1805) then day, month = 21, 'april' end
		if (year==1818) then day, month = 29, 'mars' end
		if (day==0) then
			local a, b, c = math.fmod(year,19), math.fmod(year,4), math.fmod(year,7)
	    	local m, n = 23,4
	    	if (year>=1900) then m, n = 24, 5 end
	    	local d = math.fmod(19*a+m,30)
	    	local e = math.fmod(2*b+4*c+6*d+n,7)
	   		day = 22+d+e
	    	month = 'mars'
	    	if ((d+e)>9) then day, month = d+e-9, 'april' end
	    	if (day==26) and (month=='april') then day = 19 end
	    	if (day==25) and (month=='april') and (d==28) and (e==6) and (math.fmod(11*m+11,30)<19) then day=18 end
    	end
    	if (format == 'ISO 8601') then
    		local monthnumber = '03'
    		if month == 'april' then monthnumber = '04' end
    		local daynumber = string.sub('0'..day,-2)
            if (links) then
               res = res .. prefix .. '[[' .. year .. ']]-' .. '[[' .. day .. ' ' .. month .. '|' .. monthnumber .. '-' .. daynumber ..']]' .. suffix
            else
               res = res .. prefix .. year .. '-' .. monthnumber .. '-' .. daynumber .. suffix
            end
        else
			if (links) then 
				res = res .. prefix .. '[[' .. day .. ' ' .. month .. ']] [[' .. year .. ']]' .. suffix 
			else
				res = res .. prefix .. day .. ' ' .. month .. ' ' .. year .. suffix
			end
		end
		for i=1,nl do res = res .. '\n' end
	end
	return res
end


return p