Modul:Vorlage:FormatDate

Aus Android Wiki
Wikipedia
Wikipedia
Diese Seite basiert in ihrer ersten oder einer späteren Version auf dem Artikel „Modul:Vorlage:FormatDate“ aus der freien Enzyklopädie Wikipedia und steht unter der GNU Lizenz für freie Dokumentation (inoffizielle Übersetzung aus dem Englischen). In der Wikipedia ist eine Liste der Versionen und Autoren verfügbar.

Skriptfehler: Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status 127.

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
				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;
			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;
		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 "");
		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
			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 .. 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