Modul:Vorlage:FormatDate: Unterschied zwischen den Versionen
te>Antonsusi K |
Admin (Diskussion | Beiträge) K (52 Versionen importiert) |
||
(36 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | local p = {} | + | 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 -- Bereits am Stringende | |
− | + | Datum.y = tonumber(str); | |
− | + | if Datum.y then | |
− | + | if math.floor(Datum.y) ~= Datum.y then | |
− | + | return false, Datum -- Eine Dezimalzahl ist Unsinn | |
− | + | end | |
− | + | return true, Datum -- Nur eine Jahreszahl | |
− | + | else | |
− | + | return false, Datum -- Kein Wert erkennbar | |
− | + | end | |
− | + | end | |
− | + | Teil = mw.ustring.sub(str,1,pos-1); | |
− | + | Datum.y = tonumber(Teil) or 0; | |
− | + | ||
− | + | str = mw.ustring.sub(str,pos+1, -1); | |
− | + | pos = mw.ustring.find(str,'-',1,true); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if not pos or pos == 0 then | |
− | + | Datum.m = tonumber(str) or 0 | |
− | + | Datum.d = 0; | |
− | + | if math.floor(Datum.m) ~= Datum.m then | |
− | + | return false, Datum -- Eine Dezimalzahl ist Unsinn | |
− | + | end | |
− | + | return true, Datum; | |
− | + | end | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Teil = mw.ustring.sub(str,1,pos-1) | |
− | + | Datum.m = tonumber(Teil) or 0 | |
− | + | Teil = mw.ustring.sub(str,pos+1, -1) | |
− | + | Datum.d = tonumber(Teil) or 0; | |
− | + | if math.floor(Datum.m) ~= Datum.m then | |
− | + | return false, Datum -- Eine Dezimalzahl ist Unsinn | |
− | + | end | |
− | + | if math.floor(Datum.d) ~= Datum.d then | |
− | + | return false, Datum -- Eine Dezimalzahl ist Unsinn | |
− | + | end | |
− | + | return true, Datum; | |
− | + | end | |
− | + | -- | |
− | |||
− | |||
− | |||
− | |||
− | + | local function CheckDate(Date) | |
− | + | -- Monatspruefung | |
− | + | if Date.m == 0 then -- keine Pruefung | |
− | + | return true; | |
− | + | end | |
− | + | if Date.m > 12 or Date.m < 1 then | |
− | + | return false; | |
− | + | end | |
− | + | if Date.d == 0 then -- nur Monat angegeben, keine Tagespruefung | |
+ | return true; | ||
+ | end | ||
+ | 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 TageInMonate(Datum) | ||
+ | Datum.m = 1; | ||
+ | if Datum.d > 31 then -- nach Januar | ||
+ | Datum.m = 2; | ||
+ | Datum.d = Datum.d - 31; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.y % 4 == 0 then -- Die greg. Sonderregeln werden ignoriert. | ||
+ | if Datum.d > 29 then -- nach Februar (Schaltjahr) | ||
+ | Datum.m = 3; | ||
+ | Datum.d = Datum.d - 29; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | else | ||
+ | if Datum.d > 28 then -- nach Februar (Normaljahr) | ||
+ | Datum.m = 3; | ||
+ | Datum.d = Datum.d - 28; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | end | ||
+ | if Datum.d > 31 then -- nach Maerz | ||
+ | Datum.m = 4; | ||
+ | Datum.d = Datum.d - 31; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 30 then -- nach April | ||
+ | Datum.m = 5; | ||
+ | Datum.d = Datum.d - 30; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 31 then -- nach Mai | ||
+ | Datum.m = 6; | ||
+ | Datum.d = Datum.d - 31; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 30 then -- nach Juni | ||
+ | Datum.m = 7; | ||
+ | Datum.d = Datum.d - 30; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 31 then -- nach Juli | ||
+ | Datum.m = 8; | ||
+ | Datum.d = Datum.d - 31; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 31 then -- nach August | ||
+ | Datum.m = 9; | ||
+ | Datum.d = Datum.d - 31; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 30 then -- nach September | ||
+ | Datum.m = 10; | ||
+ | Datum.d = Datum.d - 30; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 31 then -- nach Oktober | ||
+ | Datum.m = 11; | ||
+ | Datum.d = Datum.d - 31; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 30 then -- nach November | ||
+ | Datum.m = 12; | ||
+ | Datum.d = Datum.d - 30; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | if Datum.d > 31 then -- nach Dezember = Fehler | ||
+ | Datum.m = 0; | ||
+ | Datum.d = 0; | ||
+ | return false, Datum; | ||
+ | else | ||
+ | return true, Datum; | ||
+ | end | ||
+ | end | ||
+ | -- | ||
− | + | local function Run(Args) | |
− | + | local T_L = {"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 TextYear = ""; | ||
+ | local TextMonth = ""; | ||
+ | local TextDay = ""; | ||
+ | local idxm = 0 ; -- Wegen der AT-Regel ein Extraindex fuer den Monat. | ||
+ | local AT = false; | ||
+ | local NBSP = false; | ||
+ | local LINK = false; | ||
+ | local VCHR = ""; | ||
+ | local STIL = 'L'; | ||
+ | local IsOk = true; | ||
+ | local Tbl = {} | ||
+ | local SortIt = false; | ||
+ | local Zero = 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 "")); | ||
+ | local davor = mw.text.trim(Args['davor'] or ""); | ||
+ | local display = mw.text.trim(Args['display'] or ""); -- Nur zusammen mit sort sinnvoll | ||
+ | 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 == "l" or Arg3 == "l" or Arg4 == "l" then STIL = 'L'; 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['Zero'] or "")) ~= "" then Zero = true; end | ||
+ | if mw.ustring.lower(mw.text.trim(Args['Sort'] or "")) ~= "" then SortIt = true; Zero = true; end | ||
+ | if davor ~="" then davor = davor .. " "; end | ||
+ | IsOk, Tbl = Split(Args[1]) | ||
+ | if not IsOk then | ||
+ | Text = '<span class="error">[[Vorlage:FormatDate]]: Kein gültiges ISO-Datum!</span>' | ||
+ | return Text | ||
+ | end | ||
+ | --Tage ohne Monat: Tage in Monat und Tag umrechnen | ||
+ | if Tbl.m == 0 and Tbl.d ~= 0 then | ||
+ | IsOk, Tbl = TageInMonate(Tbl) | ||
+ | end | ||
+ | if not IsOk then | ||
+ | Text = '<span class="error">[[Vorlage:FormatDate]]: Kein gültiges ISO-Datum!</span>' | ||
+ | return Text | ||
+ | end | ||
+ | Tbl.y = tonumber(Tbl.y) or 0; | ||
+ | if Tbl.y == 0 and Tbl.m == 0 and Tbl.d == 0 then | ||
+ | Text = '<span class="error">[[Vorlage:FormatDate]]: Ungültiger Wert ("0-0-0") für das Datum! </span>' | ||
+ | return Text | ||
+ | end | ||
+ | if Tbl.y < 0 then -- Jahr Null reserviert fuer "Nur Tag und Monat" | ||
+ | Tbl.y = 0 - Tbl.y | ||
+ | VCHR = ' v. Chr.'; | ||
+ | end | ||
− | + | IsOk = CheckDate(Tbl); | |
− | + | if not IsOk then | |
− | + | Text = '<span class="error">[[Vorlage:FormatDate]]: Ungültiges Datum!'.. table.concat(Tbl,'.')..'</span>' | |
− | + | return Text | |
− | + | end | |
− | |||
− | |||
− | |||
− | + | if Tbl.d > 0 then -- Tag angegeben, String erstellen | |
+ | TextDay = tostring(Tbl.d) .. '. ' | ||
+ | if Tbl.d < 10 and Zero then | ||
+ | TextDay = '<span style="visibility:hidden;">0</span>' .. TextDay; | ||
+ | end | ||
+ | else | ||
+ | TextDay = ''; | ||
+ | end | ||
− | + | if Tbl.m > 0 then -- Monat angegeben, String erstellen | |
− | + | if AT and Tbl.m == 1 then | |
− | + | idxm = 13 | |
− | + | else | |
− | + | idxm = Tbl.m; | |
− | + | end | |
− | |||
− | + | if STIL == 'S' then | |
− | + | TextMonth = T_S[idxm] ; | |
− | + | elseif STIL == 'M' then | |
− | + | TextMonth = T_M[idxm] ; | |
− | + | else | |
− | + | TextMonth = T_L[idxm] ; | |
− | + | end | |
− | + | ||
− | + | Text = TextDay .. TextMonth | |
− | + | if LINK then | |
− | + | if Tbl.d == 0 then | |
− | + | Linkziel =T_L[Tbl.m] | |
− | + | else | |
− | + | Linkziel = tostring(Tbl.d) .. ". " .. T_L[Tbl.m] | |
− | + | end | |
− | + | Text = '[[' .. Linkziel .. '|' .. Text .. ']]'; | |
− | + | end | |
− | + | end | |
− | + | -- hier Tag und Monat zusammen, evtl. verlinkt | |
+ | |||
+ | if Tbl.y ~= 0 then | ||
+ | if LINK then | ||
+ | TextYear = '[[' .. tostring(Tbl.y) .. VCHR .. ']]'; | ||
+ | else | ||
+ | TextYear = tostring(Tbl.y) .. VCHR; | ||
+ | end | ||
+ | if Tbl.m > 0 then | ||
+ | if NBSP then | ||
+ | TextYear = ' ' .. TextYear; | ||
+ | else | ||
+ | TextYear = ' ' .. TextYear; | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | Text = Text .. TextYear; | ||
+ | |||
+ | if SortIt then | ||
+ | if VCHR ~= "" then | ||
+ | Tbl.y = 0 - Tbl.y | ||
+ | end | ||
+ | -- Begrenzung auf 3000 v Chr. bis 6999 n. Chr. Vierstellige Sortierung reicht aus | ||
+ | if Tbl.y > 6999 then | ||
+ | Tbl.y = 6999; | ||
+ | end | ||
+ | -- Nur bei Sortierung sinnvoll: Überschreiben der Textausgabe mit angegebenen String | ||
+ | if display ~= "" then | ||
+ | Text = display; | ||
+ | end | ||
+ | Numstr = string.format('%d%2.2d%2.2d',3000+Tbl.y,Tbl.m,Tbl.d); | ||
+ | SortTag='<span style="display:none" class="sortkey">' .. Numstr .. '</span>'; | ||
+ | Text = SortTag .. davor .. Text; | ||
+ | end | ||
+ | return Text | ||
+ | end | ||
+ | -- | ||
+ | |||
+ | local function GetYear(Args) | ||
+ | local Tbl = {} | ||
+ | local IsOk = true; | ||
+ | local Year = 0; | ||
+ | IsOk, Tbl = Split(Args[1]) | ||
+ | if not IsOk or Tbl.y == 0 then | ||
+ | Year = 0; | ||
+ | return Year; | ||
+ | end | ||
+ | return Tbl.y; | ||
+ | end | ||
+ | |||
+ | local function CountDays(Args) | ||
+ | local Tbl = {} | ||
+ | local IsOk = true; | ||
+ | local Days = 0; | ||
+ | IsOk, Tbl = Split(Args[1]) | ||
+ | if not IsOk or Tbl.y == 0 then | ||
+ | Days = 0; | ||
+ | return Days; | ||
+ | end | ||
+ | if Tbl.m == 0 or Tbl.m == 1 then | ||
+ | Days = Tbl.d; | ||
+ | return Days; | ||
+ | end | ||
+ | if Tbl.m == 2 then | ||
+ | Days = 31 + Tbl.d; | ||
+ | return Days; | ||
+ | end | ||
+ | if Tbl.y % 4 == 0 then | ||
+ | Days = 60 | ||
+ | else | ||
+ | Days = 59; | ||
+ | end | ||
+ | if Tbl.m == 3 then Days = Days + Tbl.d; end | ||
+ | if Tbl.m == 4 then Days = Days + 31 + Tbl.d; end | ||
+ | if Tbl.m == 5 then Days = Days + 61 + Tbl.d; end | ||
+ | if Tbl.m == 6 then Days = Days + 92 + Tbl.d; end | ||
+ | if Tbl.m == 7 then Days = Days + 122 + Tbl.d; end | ||
+ | if Tbl.m == 8 then Days = Days + 153 + Tbl.d; end | ||
+ | if Tbl.m == 9 then Days = Days + 184 + Tbl.d; end | ||
+ | if Tbl.m == 10 then Days = Days + 214 + Tbl.d; end | ||
+ | if Tbl.m == 11 then Days = Days + 245 + Tbl.d; end | ||
+ | if Tbl.m == 12 then Days = Days + 275 + Tbl.d; end | ||
+ | return Days; | ||
+ | end | ||
+ | |||
+ | |||
+ | function p.Execute(frame) | ||
+ | local FR = frame:getParent() | ||
+ | if frame:callParserFunction('int', 'lang' ) == 'de-at' then | ||
+ | FR.args['AT']='ja'; | ||
+ | end | ||
+ | return Run(FR.args) | ||
+ | end | ||
+ | |||
+ | function p.Sort(frame) | ||
+ | local FR = frame:getParent() | ||
+ | FR.args.Sort='1' | ||
+ | return Run(FR.args) | ||
+ | end | ||
+ | |||
+ | function p.DayInYear(frame) | ||
+ | local FR = frame:getParent() | ||
+ | local Number = CountDays(FR.args); | ||
+ | return tostring(Number); | ||
+ | end | ||
+ | |||
+ | function p.YearFromISO(frame) | ||
+ | local FR = frame:getParent() | ||
+ | local Number = GetYear(FR.args); | ||
+ | return tostring(Number); | ||
+ | end | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
return p | return p |
Aktuelle Version vom 6. September 2019, 12:27 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Vorlage:FormatDate/Doku erstellt werden
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 -- Bereits am Stringende
Datum.y = tonumber(str);
if Datum.y then
if math.floor(Datum.y) ~= Datum.y then
return false, Datum -- Eine Dezimalzahl ist Unsinn
end
return true, Datum -- Nur eine Jahreszahl
else
return false, Datum -- Kein Wert erkennbar
end
end
Teil = mw.ustring.sub(str,1,pos-1);
Datum.y = tonumber(Teil) or 0;
str = mw.ustring.sub(str,pos+1, -1);
pos = mw.ustring.find(str,'-',1,true);
if not pos or pos == 0 then
Datum.m = tonumber(str) or 0
Datum.d = 0;
if math.floor(Datum.m) ~= Datum.m then
return false, Datum -- Eine Dezimalzahl ist Unsinn
end
return true, Datum;
end
Teil = mw.ustring.sub(str,1,pos-1)
Datum.m = tonumber(Teil) or 0
Teil = mw.ustring.sub(str,pos+1, -1)
Datum.d = tonumber(Teil) or 0;
if math.floor(Datum.m) ~= Datum.m then
return false, Datum -- Eine Dezimalzahl ist Unsinn
end
if math.floor(Datum.d) ~= Datum.d then
return false, Datum -- Eine Dezimalzahl ist Unsinn
end
return true, Datum;
end
--
local function CheckDate(Date)
-- Monatspruefung
if Date.m == 0 then -- keine Pruefung
return true;
end
if Date.m > 12 or Date.m < 1 then
return false;
end
if Date.d == 0 then -- nur Monat angegeben, keine Tagespruefung
return true;
end
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 TageInMonate(Datum)
Datum.m = 1;
if Datum.d > 31 then -- nach Januar
Datum.m = 2;
Datum.d = Datum.d - 31;
else
return true, Datum;
end
if Datum.y % 4 == 0 then -- Die greg. Sonderregeln werden ignoriert.
if Datum.d > 29 then -- nach Februar (Schaltjahr)
Datum.m = 3;
Datum.d = Datum.d - 29;
else
return true, Datum;
end
else
if Datum.d > 28 then -- nach Februar (Normaljahr)
Datum.m = 3;
Datum.d = Datum.d - 28;
else
return true, Datum;
end
end
if Datum.d > 31 then -- nach Maerz
Datum.m = 4;
Datum.d = Datum.d - 31;
else
return true, Datum;
end
if Datum.d > 30 then -- nach April
Datum.m = 5;
Datum.d = Datum.d - 30;
else
return true, Datum;
end
if Datum.d > 31 then -- nach Mai
Datum.m = 6;
Datum.d = Datum.d - 31;
else
return true, Datum;
end
if Datum.d > 30 then -- nach Juni
Datum.m = 7;
Datum.d = Datum.d - 30;
else
return true, Datum;
end
if Datum.d > 31 then -- nach Juli
Datum.m = 8;
Datum.d = Datum.d - 31;
else
return true, Datum;
end
if Datum.d > 31 then -- nach August
Datum.m = 9;
Datum.d = Datum.d - 31;
else
return true, Datum;
end
if Datum.d > 30 then -- nach September
Datum.m = 10;
Datum.d = Datum.d - 30;
else
return true, Datum;
end
if Datum.d > 31 then -- nach Oktober
Datum.m = 11;
Datum.d = Datum.d - 31;
else
return true, Datum;
end
if Datum.d > 30 then -- nach November
Datum.m = 12;
Datum.d = Datum.d - 30;
else
return true, Datum;
end
if Datum.d > 31 then -- nach Dezember = Fehler
Datum.m = 0;
Datum.d = 0;
return false, Datum;
else
return true, Datum;
end
end
--
local function Run(Args)
local T_L = {"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 TextYear = "";
local TextMonth = "";
local TextDay = "";
local idxm = 0 ; -- Wegen der AT-Regel ein Extraindex fuer den Monat.
local AT = false;
local NBSP = false;
local LINK = false;
local VCHR = "";
local STIL = 'L';
local IsOk = true;
local Tbl = {}
local SortIt = false;
local Zero = 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 ""));
local davor = mw.text.trim(Args['davor'] or "");
local display = mw.text.trim(Args['display'] or ""); -- Nur zusammen mit sort sinnvoll
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 == "l" or Arg3 == "l" or Arg4 == "l" then STIL = 'L'; 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['Zero'] or "")) ~= "" then Zero = true; end
if mw.ustring.lower(mw.text.trim(Args['Sort'] or "")) ~= "" then SortIt = true; Zero = true; end
if davor ~="" then davor = davor .. " "; end
IsOk, Tbl = Split(Args[1])
if not IsOk then
Text = '<span class="error">[[Vorlage:FormatDate]]: Kein gültiges ISO-Datum!</span>'
return Text
end
--Tage ohne Monat: Tage in Monat und Tag umrechnen
if Tbl.m == 0 and Tbl.d ~= 0 then
IsOk, Tbl = TageInMonate(Tbl)
end
if not IsOk then
Text = '<span class="error">[[Vorlage:FormatDate]]: Kein gültiges ISO-Datum!</span>'
return Text
end
Tbl.y = tonumber(Tbl.y) or 0;
if Tbl.y == 0 and Tbl.m == 0 and Tbl.d == 0 then
Text = '<span class="error">[[Vorlage:FormatDate]]: Ungültiger Wert ("0-0-0") für das Datum! </span>'
return Text
end
if Tbl.y < 0 then -- Jahr Null reserviert fuer "Nur Tag und Monat"
Tbl.y = 0 - Tbl.y
VCHR = ' v. Chr.';
end
IsOk = CheckDate(Tbl);
if not IsOk then
Text = '<span class="error">[[Vorlage:FormatDate]]: Ungültiges Datum!'.. table.concat(Tbl,'.')..'</span>'
return Text
end
if Tbl.d > 0 then -- Tag angegeben, String erstellen
TextDay = tostring(Tbl.d) .. '. '
if Tbl.d < 10 and Zero then
TextDay = '<span style="visibility:hidden;">0</span>' .. TextDay;
end
else
TextDay = '';
end
if Tbl.m > 0 then -- Monat angegeben, String erstellen
if AT and Tbl.m == 1 then
idxm = 13
else
idxm = Tbl.m;
end
if STIL == 'S' then
TextMonth = T_S[idxm] ;
elseif STIL == 'M' then
TextMonth = T_M[idxm] ;
else
TextMonth = T_L[idxm] ;
end
Text = TextDay .. TextMonth
if LINK then
if Tbl.d == 0 then
Linkziel =T_L[Tbl.m]
else
Linkziel = tostring(Tbl.d) .. ". " .. T_L[Tbl.m]
end
Text = '[[' .. Linkziel .. '|' .. Text .. ']]';
end
end
-- hier Tag und Monat zusammen, evtl. verlinkt
if Tbl.y ~= 0 then
if LINK then
TextYear = '[[' .. tostring(Tbl.y) .. VCHR .. ']]';
else
TextYear = tostring(Tbl.y) .. VCHR;
end
if Tbl.m > 0 then
if NBSP then
TextYear = ' ' .. TextYear;
else
TextYear = ' ' .. TextYear;
end
end
end
Text = Text .. TextYear;
if SortIt then
if VCHR ~= "" then
Tbl.y = 0 - Tbl.y
end
-- Begrenzung auf 3000 v Chr. bis 6999 n. Chr. Vierstellige Sortierung reicht aus
if Tbl.y > 6999 then
Tbl.y = 6999;
end
-- Nur bei Sortierung sinnvoll: Überschreiben der Textausgabe mit angegebenen String
if display ~= "" then
Text = display;
end
Numstr = string.format('%d%2.2d%2.2d',3000+Tbl.y,Tbl.m,Tbl.d);
SortTag='<span style="display:none" class="sortkey">' .. Numstr .. '</span>';
Text = SortTag .. davor .. Text;
end
return Text
end
--
local function GetYear(Args)
local Tbl = {}
local IsOk = true;
local Year = 0;
IsOk, Tbl = Split(Args[1])
if not IsOk or Tbl.y == 0 then
Year = 0;
return Year;
end
return Tbl.y;
end
local function CountDays(Args)
local Tbl = {}
local IsOk = true;
local Days = 0;
IsOk, Tbl = Split(Args[1])
if not IsOk or Tbl.y == 0 then
Days = 0;
return Days;
end
if Tbl.m == 0 or Tbl.m == 1 then
Days = Tbl.d;
return Days;
end
if Tbl.m == 2 then
Days = 31 + Tbl.d;
return Days;
end
if Tbl.y % 4 == 0 then
Days = 60
else
Days = 59;
end
if Tbl.m == 3 then Days = Days + Tbl.d; end
if Tbl.m == 4 then Days = Days + 31 + Tbl.d; end
if Tbl.m == 5 then Days = Days + 61 + Tbl.d; end
if Tbl.m == 6 then Days = Days + 92 + Tbl.d; end
if Tbl.m == 7 then Days = Days + 122 + Tbl.d; end
if Tbl.m == 8 then Days = Days + 153 + Tbl.d; end
if Tbl.m == 9 then Days = Days + 184 + Tbl.d; end
if Tbl.m == 10 then Days = Days + 214 + Tbl.d; end
if Tbl.m == 11 then Days = Days + 245 + Tbl.d; end
if Tbl.m == 12 then Days = Days + 275 + Tbl.d; end
return Days;
end
function p.Execute(frame)
local FR = frame:getParent()
if frame:callParserFunction('int', 'lang' ) == 'de-at' then
FR.args['AT']='ja';
end
return Run(FR.args)
end
function p.Sort(frame)
local FR = frame:getParent()
FR.args.Sort='1'
return Run(FR.args)
end
function p.DayInYear(frame)
local FR = frame:getParent()
local Number = CountDays(FR.args);
return tostring(Number);
end
function p.YearFromISO(frame)
local FR = frame:getParent()
local Number = GetYear(FR.args);
return tostring(Number);
end
return p