Modul:Vorlage:FormatDate: Unterschied zwischen den Versionen
(AZ: Die Seite wurde geleert.) |
|||
Zeile 1: | Zeile 1: | ||
+ | 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 = '<span class="error">[[Vorlage:FormatDate]]: Ungültiger Wert für Jahr!</span>' | ||
+ | return Text | ||
+ | end | ||
+ | if Tbl.m > 12 or Tbl.m < 0 then | ||
+ | Text = '<span class="error">[[Vorlage:FormatDate]]: Ungültiger Wert für Monat!</span>' | ||
+ | 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 = '<span class="error">[[Vorlage:FormatDate]]: Ungültiges Datum!'.. table.concat(Tbl,'.')..'</span>' | ||
+ | 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 = "[[" .. Linkziel .. "|" .. 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='<span style="display:none" class="sortkey">' .. Numstr .. '</span>' | ||
+ | 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 |
Version vom 2. August 2013, 01:52 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
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 = '<span class="error">[[Vorlage:FormatDate]]: Ungültiger Wert für Jahr!</span>'
return Text
end
if Tbl.m > 12 or Tbl.m < 0 then
Text = '<span class="error">[[Vorlage:FormatDate]]: Ungültiger Wert für Monat!</span>'
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 = '<span class="error">[[Vorlage:FormatDate]]: Ungültiges Datum!'.. table.concat(Tbl,'.')..'</span>'
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 = "[[" .. Linkziel .. "|" .. 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='<span style="display:none" class="sortkey">' .. Numstr .. '</span>'
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