Modul:Vorlage:FormatDate: Unterschied zwischen den Versionen

Aus FreeWiki
Zur Navigation springen Zur Suche springen
(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) .. '.&nbsp;'
 +
                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 .. "&nbsp;"
 +
                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

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 = 'Vorlage:FormatDate: Ungültiger Wert für Jahr!'
               return Text
           end
           if Tbl.m > 12 or Tbl.m < 0 then
               Text = 'Vorlage:FormatDate: Ungültiger Wert für Monat!'
               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 = 'Vorlage:FormatDate: Ungültiges Datum!'.. table.concat(Tbl,'.')..''
                   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 = "" .. 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=''
                   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