Modul:Vorlage:FormatDate
Version vom 2. August 2013, 01:52 Uhr von 79.202.51.182 (Diskussion)
local p = {}
-- Trennen der Parameter local function Split(str) local Datum = {} local Teil="" local pos = 0 Datum.y = 0 Datum.m = 0 Datum.d = 0 pos = mw.ustring.find(str,'-',1,true); if pos == 1 then -- Minuszeichen am Anfang - nochmal suchen pos = mw.ustring.find(str,'-',2,true); end if not pos then Datum.y = tonumber(str) or 'x' return false, Datum -- Kein Wert erkennbar end Teil = mw.ustring.sub(str,1,pos-1) Datum.y = tonumber(Teil) or 'x' str = mw.ustring.sub(str,pos+1, -1) pos = mw.ustring.find(str,'-',1,true); if not pos or pos == 0 then return true, Datum -- Nur Jahr end Teil = mw.ustring.sub(str,1,pos-1) Datum.m = tonumber(Teil) or 0 Teil = mw.ustring.sub(str,pos+1, -1) if #Teil == 0 then return true, Datum -- Nur Jahr und Monat end if Datum.m == 0 then Datum.d = 0 else Datum.d = tonumber(Teil) or 0 end return true, Datum end --
local function CheckDate(Date) if ( Date.m == 4 or Date.m == 6 or Date.m == 9 or Date.m == 11) and Date.d > 30 then return false; end if Date.m == 2 then -- Die greg. Sonderregeln werden ignoriert. if Date.y % 4 ~= 0 and Date.d > 28 then return false; end if Date.y % 4 == 0 and Date.d > 29 then return false; end end -- Hier nur noch 31-Tage-Monate übrig. if Date.d > 31 then return false; end return true; end --
local function Run(Args) local T_F = {"Januar","Februar", "März", "April", "Mai","Juni", "Juli", "August","September","Oktober","November","Dezember","Jänner"} local T_M = {"Jan.","Feb.", "März", "Apr.", "Mai","Juni", "Juli", "Aug.","Sep.","Okt.","Nov.","Dez.","Jän."} local T_S = {"Jan.","Feb.", "Mrz", "Apr.", "Mai","Jun.", "Jul.", "Aug.","Sep.","Okt.","Nov.","Dez.","Jän."} local Text = ""; local AT = false; local NBSP = false; local LINK = false; local VCHR = ""; local STIL = 'F'; local IsOk = true local Tbl = {} local SortIt = false; local Numstr = ""; local SortTag= ""; local Arg2 = mw.ustring.lower(mw.text.trim(Args[2] or "")); local Arg3 = mw.ustring.lower(mw.text.trim(Args[3] or "")); local Arg4 = mw.ustring.lower(mw.text.trim(Args[4] or "")); if Arg2 == "nbsp" or Arg3 == "nbsp" or Arg4 == "nbsp" then NBSP = true; end if Arg2 == "link" or Arg3 == "link" or Arg4 == "link" then LINK = true; end if Arg2 == "m" or Arg3 == "m" or Arg4 == "m" then STIL = 'M'; end if Arg2 == "s" or Arg3 == "s" or Arg4 == "s" then STIL = 'S'; end if mw.ustring.lower(mw.text.trim(Args['AT'] or "")) == "ja" then AT = true; end if mw.ustring.lower(mw.text.trim(Args['Sort'] or "")) ~= "" then SortIt = true; end
IsOk, Tbl = Split(Args[1])
if Tbl.y == 'x' then Text = 'Vorlage:FormatDate: Ungültiger Wert für Jahr!' return Text end if Tbl.m > 12 or Tbl.m < 0 then Text = 'Vorlage:FormatDate: Ungültiger Wert für Monat!' return Text end if Tbl.y <= 0 then Tbl.y = 1 - Tbl.y VCHR = " v. Chr."; end if Tbl.d > 0 then if CheckDate(Tbl) then Text = tostring(Tbl.d) .. '. ' else Text = 'Vorlage:FormatDate: Ungültiges Datum!'.. table.concat(Tbl,'.')..'' return Text end end if Tbl.m > 0 then if LINK then if Tbl.d == 0 then Linkziel =T_F[Tbl.m] else Linkziel = tostring(Tbl.d) .. ". " .. T_F[Tbl.m] end end if AT and Tbl.m == 1 then Tbl.m = 13 end if STIL == 'M' then Text = Text .. T_M[Tbl.m] elseif STIL == 'S' then Text = Text .. T_S[Tbl.m] else Text = Text .. T_F[Tbl.m] end if LINK then Text = "" .. Text .. "" end if NBSP then Text = Text .. " " else Text = Text .. " " end end if LINK then Text = Text .. "" .. tostring(Tbl.y) .. VCHR .. "" else Text = Text .. tostring(Tbl.y) .. VCHR end if SortIt then if Tbl.m == 13 then Tbl.m = 1 end if tonumber(Tbl.y) and tonumber(Tbl.m) and tonumber(Tbl.d) then if VCHR ~= "" then Tbl.y = 1 - Tbl.y end Numstr = string.format('%d%2.2d%2.2d',5000+Tbl.y,Tbl.m,Tbl.d) SortTag=' ' Text = SortTag .. Text end end
return Text end --
function p.Execute(frame) local FR = frame:getParent() return Run(FR.args) end
function p.Sort(frame) local FR = frame:getParent() FR.args.Sort='1' return Run(FR.args) end
return p