Modul:Vorlage:FormatDate: Unterschied zwischen den Versionen
te>Antonsusi K (Siehe D-Seite) |
K (52 Versionen importiert) |
||
(5 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 15: | Zeile 15: | ||
Datum.y = tonumber(str); | Datum.y = tonumber(str); | ||
if Datum.y then | 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 | return true, Datum -- Nur eine Jahreszahl | ||
else | else | ||
Zeile 22: | Zeile 25: | ||
Teil = mw.ustring.sub(str,1,pos-1); | Teil = mw.ustring.sub(str,1,pos-1); | ||
Datum.y = tonumber(Teil) or 0; | Datum.y = tonumber(Teil) or 0; | ||
+ | |||
str = mw.ustring.sub(str,pos+1, -1); | str = mw.ustring.sub(str,pos+1, -1); | ||
pos = mw.ustring.find(str,'-',1,true); | pos = mw.ustring.find(str,'-',1,true); | ||
Zeile 28: | Zeile 32: | ||
Datum.m = tonumber(str) or 0 | Datum.m = tonumber(str) or 0 | ||
Datum.d = 0; | Datum.d = 0; | ||
+ | if math.floor(Datum.m) ~= Datum.m then | ||
+ | return false, Datum -- Eine Dezimalzahl ist Unsinn | ||
+ | end | ||
return true, Datum; | return true, Datum; | ||
end | end | ||
− | |||
Teil = mw.ustring.sub(str,1,pos-1) | Teil = mw.ustring.sub(str,1,pos-1) | ||
Zeile 36: | Zeile 42: | ||
Teil = mw.ustring.sub(str,pos+1, -1) | Teil = mw.ustring.sub(str,pos+1, -1) | ||
Datum.d = tonumber(Teil) or 0; | 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; | return true, Datum; | ||
end | end | ||
Zeile 174: | Zeile 186: | ||
local Arg4 = mw.ustring.lower(mw.text.trim(Args[4] or "")); | local Arg4 = mw.ustring.lower(mw.text.trim(Args[4] or "")); | ||
local davor = mw.text.trim(Args['davor'] 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 == "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 == "link" or Arg3 == "link" or Arg4 == "link" then LINK = true; end | ||
Zeile 268: | Zeile 281: | ||
Tbl.y = 0 - Tbl.y | Tbl.y = 0 - Tbl.y | ||
end | end | ||
− | Numstr = string.format('%d%2.2d%2.2d', | + | -- 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>'; | SortTag='<span style="display:none" class="sortkey">' .. Numstr .. '</span>'; | ||
Text = SortTag .. davor .. Text; | Text = SortTag .. davor .. Text; | ||
Zeile 275: | Zeile 296: | ||
end | 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) | function p.Execute(frame) | ||
local FR = frame:getParent() | local FR = frame:getParent() | ||
+ | if frame:callParserFunction('int', 'lang' ) == 'de-at' then | ||
+ | FR.args['AT']='ja'; | ||
+ | end | ||
return Run(FR.args) | return Run(FR.args) | ||
end | end | ||
Zeile 286: | Zeile 358: | ||
return Run(FR.args) | return Run(FR.args) | ||
end | 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
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 = 'Vorlage:FormatDate: Kein gültiges ISO-Datum!' 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 = 'Vorlage:FormatDate: Kein gültiges ISO-Datum!' return Text end Tbl.y = tonumber(Tbl.y) or 0; if Tbl.y == 0 and Tbl.m == 0 and Tbl.d == 0 then Text = 'Vorlage:FormatDate: Ungültiger Wert ("0-0-0") für das Datum! ' 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 = 'Vorlage:FormatDate: Ungültiges Datum!'.. table.concat(Tbl,'.')..'' return Text end
if Tbl.d > 0 then -- Tag angegeben, String erstellen TextDay = tostring(Tbl.d) .. '. ' if Tbl.d < 10 and Zero then TextDay = '
' .. TextDay; end else TextDay = ; endif 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 = '' .. 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='
'; 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