Modul:Vorlage:FormatDate: Unterschied zwischen den Versionen

Aus FreeWiki
Wechseln zu: Navigation, Suche
te>Antonsusi
K
K (52 Versionen importiert)
 
(10 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
local p = {}
 
local p = {}
-- Trennen der Parameter
+
-- Trennen der Parameter
 
local function Split(str)
 
local function Split(str)
 
local Datum = {}
 
local Datum = {}
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);
 +
 
if not pos or pos == 0 then
 
if not pos or pos == 0 then
return true, Datum; -- Nur Jahr
+
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
 
end
 +
 
Teil  = mw.ustring.sub(str,1,pos-1)
 
Teil  = mw.ustring.sub(str,1,pos-1)
 
Datum.m = tonumber(Teil) or 0
 
Datum.m = tonumber(Teil) or 0
 
Teil  = mw.ustring.sub(str,pos+1,  -1)
 
Teil  = mw.ustring.sub(str,pos+1,  -1)
if #Teil == 0 then
+
Datum.d = tonumber(Teil) or 0;
return true, Datum-- Nur Jahr und Monat
+
if math.floor(Datum.m) ~= Datum.m then
 +
return false, Datum -- Eine Dezimalzahl ist Unsinn
 
end
 
end
if Datum.m == 0 then
+
if math.floor(Datum.d) ~= Datum.d then
Datum.d = 0;
+
return false, Datum -- Eine Dezimalzahl ist Unsinn
else
 
Datum.d = tonumber(Teil) or 0;
 
 
end
 
end
 
return true, Datum;
 
return true, Datum;
Zeile 63: Zeile 73:
 
if Date.d > 31  then return false; end
 
if Date.d > 31  then return false; end
 
return true;
 
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
 
end
 
--
 
--
Zeile 69: Zeile 165:
 
local T_L  = {"Januar","Februar", "März", "April", "Mai","Juni", "Juli", "August","September","Oktober","November","Dezember","Jänner"}
 
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_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 T_S  = {"Jan.","Feb.",  "Mrz.", "Apr.", "Mai","Jun.", "Jul.", "Aug.","Sep.","Okt.","Nov.","Dez.","Jän."}
 
local Text = "";
 
local Text = "";
 
local TextYear  = "";
 
local TextYear  = "";
Zeile 80: Zeile 176:
 
local VCHR = "";
 
local VCHR = "";
 
local STIL = 'L';
 
local STIL = 'L';
local IsOk = true
+
local IsOk = true;
 
local Tbl = {}
 
local Tbl = {}
 
local SortIt = false;
 
local SortIt = false;
 +
local Zero = false;
 
local Numstr = "";
 
local Numstr = "";
 
local SortTag= "";
 
local SortTag= "";
Zeile 88: Zeile 185:
 
local Arg3 = mw.ustring.lower(mw.text.trim(Args[3] or ""));
 
local Arg3 = mw.ustring.lower(mw.text.trim(Args[3] or ""));
 
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 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 94: Zeile 193:
 
if Arg2 == "s"    or Arg3 == "s"    or Arg4 == "s"    then STIL = 'S'; 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['AT'] or "")) == "ja" then AT = true; end
if mw.ustring.lower(mw.text.trim(Args['Sort'] or "")) ~= "" then SortIt = 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])
 
IsOk, Tbl = Split(Args[1])
 
if not  IsOk then
 
if not  IsOk then
Zeile 101: Zeile 201:
 
return Text
 
return Text
 
end
 
end
--Tag ohne Monat nicht erlaubt: Auch Tag auf Null setzen (= nur Jahr)
+
--Tage ohne Monat: Tage in Monat und Tag umrechnen
if Tbl.m == 0 then
+
if Tbl.m == 0 and Tbl.d ~= 0  then
Tbl.d = 0;
+
IsOk, Tbl = TageInMonate(Tbl)
 +
end
 +
if not  IsOk then
 +
Text = '<span class="error">[[Vorlage:FormatDate]]: Kein gültiges ISO-Datum!</span>'
 +
return Text
 
end
 
end
 
Tbl.y = tonumber(Tbl.y) or 0;
 
Tbl.y = tonumber(Tbl.y) or 0;
Zeile 123: Zeile 227:
 
if Tbl.d > 0 then -- Tag angegeben, String erstellen
 
if Tbl.d > 0 then -- Tag angegeben, String erstellen
 
TextDay =  tostring(Tbl.d) .. '.&nbsp;'
 
TextDay =  tostring(Tbl.d) .. '.&nbsp;'
if Tbl.d < 10 and SortIt then
+
if Tbl.d < 10 and Zero then
TextDay = '&nbsp;' .. TextDay;
+
TextDay = '<span style="visibility:hidden;">0</span>' .. TextDay;
 
end
 
end
 
else
 
else
Zeile 177: Zeile 281:
 
Tbl.y = 0 - Tbl.y
 
Tbl.y = 0 - Tbl.y
 
end
 
end
Numstr = string.format('%d%2.2d%2.2d',5000+Tbl.y,Tbl.m,Tbl.d)
+
-- Begrenzung auf 3000 v Chr. bis 6999 n. Chr. Vierstellige Sortierung reicht aus
SortTag='<span style="display:none" class="sortkey">' .. Numstr .. '</span>'
+
if Tbl.y > 6999 then
Text = SortTag .. Text
+
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
 
end
 
return Text
 
return Text
 
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 195: 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

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 .. "&nbsp;"; 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) .. '.&nbsp;'
			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 = '&nbsp;' .. 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