Bearbeiten von „Modul:TemplUtl

Zur Navigation springen Zur Suche springen
Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden. Ein eigenes Benutzerkonto hat eine ganze Reihe von Vorteilen.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 1: Zeile 1:
local TemplUtl = { suite  = "TemplUtl",
local TemplUtl = { suite  = "TemplUtl",
                   serial = "2019-11-20",
                   serial = "2017-04-24" };
                  item  = 52364930 };
local Failsafe = TemplUtl;
 
 
 
local fallible = function ( adjust, ahead )
    -- Check for leading character disturbing syntax
    -- Precondition:
    --    adjust  -- string; trimmed wikitext
    --    ahead  -- true, if leading syntax shall start on new line
    -- Postcondition:
    --    Returns string, modified if necessary
    local r = adjust;
    local c = r:byte( 1, 1 );
    if c <= 59  and
      ( c==35 or c==42 or c==58 or c==59 ) then
        if ahead then
            r = "\n" .. r;
        else
            r = mw.text.nowiki( r:sub( 1, 1 ) )  ..  r:sub( 2 );
        end
    elseif ahead then
        local c2 = r:byte( 2, 1 );
        if ( c==123 and c2==124 )  or
          ( c==124 and c2==45 ) then
            r = "\n" .. r;
        end
    end
    return r;
end -- fallible()




Zeile 39: Zeile 9:
     --    accept  -- string; trimmed title
     --    accept  -- string; trimmed title
     -- Postcondition:
     -- Postcondition:
     --   Returns string with pattern
     --     Returns string with pattern
     local start = mw.ustring.sub( accept, 1, 1 );
     local start = mw.ustring.sub( accept, 1, 1 );
     local r;
     local r;
Zeile 63: Zeile 33:
local framing = function ( frame )
local framing = function ( frame )
     if not TemplUtl.frame then
     if not TemplUtl.frame then
         if type( frame ) == "table" then
         if frame then
             TemplUtl.frame = frame;
             TemplUtl.frame = frame;
         else
         else
Zeile 69: Zeile 39:
         end
         end
     end
     end
    return TemplUtl.frame;
end -- framing()
end -- framing()






TemplUtl.faculty = function ( analyze, another )
TemplUtl.faculty = function ( analyze, another, frame )
     -- Test template arg for boolean
     -- Test template arg for boolean
     --    analyze  -- string, boolean, number or nil
     --    analyze  -- string, boolean, number or nil
     --    another  -- fallback: string, boolean, or nil
     --    another  -- fallback: string, boolean, or nil
    --    frame    -- object, or nil
     -- Returns boolean
     -- Returns boolean
     local s = type( analyze );
     local s = type( analyze );
Zeile 84: Zeile 54:
         r = mw.text.trim( analyze );
         r = mw.text.trim( analyze );
         if r == ""  then
         if r == ""  then
             r = TemplUtl.faculty( another, nil );
             r = TemplUtl.faculty( another, nil, frame );
         elseif r:find( "1", 1, true )  and
         elseif r == "1" then
              r:match( "^[0%-]*1[01%-]*$") then
             r = true;
             r = true;
         elseif r:match( "^[0%-]+$") then
         elseif r == "0" then
             r = false;
             r = false;
         else
         else
             r = r:lower();
             r = r:lower();
             if r == "y"  or
             if r == "y"  or r == "yes"  or r == "true" then
              r == "yes"  or
              r == "true"  or
              r == "on" then
                 r = true;
                 r = true;
             elseif r == "n"  or
             elseif r == "n"  or r == "no"  or r == "false" then
                  r == "no"  or
                  r == "false"  or
                  r == "off" then
                 r = false;
                 r = false;
             else
             else
                 if not TemplUtl.boolang then
                 if not TemplUtl.L10N then
                     -- TODO: page language
                     local lucky;
                     local l, d = pcall( mw.ext.data.get, "i18n/01.tab" );
                     s = string.format( "Module:%s/local",
                     if type( d ) == "table"  and
                                      TemplUtl.suite );
                      type( d.data ) == "table" then
                     lucky, TemplUtl.L10N = pcall( mw.loadData, s );
                        local f = function ( at )
                end
                                  local e = d.data[ at ];
                if type( TemplUtl.L10N ) == "table" then
                                  l = e[ 1 ];
                    local entry;
                                  s = e[ 2 ];
                    if not TemplUtl.lang then
                                  if type( l ) == "boolean"  and
                        -- TODO: page language
                                    type( s ) == "string" then
                         TemplUtl.lang =
                                      s = mw.text.split( s, "|" );
                              mw.language.getContentLanguage():getCode();
                                      for i = 1, #s do
                                          TemplUtl.boolang[ s[ i ] ] = l;
                                      end -- for i
                                  end
                              end
                         TemplUtl.boolang = { };
                        f( 1 );
                        f( 2 );
                    else
                        TemplUtl.boolang = true;
                     end
                     end
                end
                    entry = TemplUtl.L10N[ TemplUtl.lang ];
                if type( TemplUtl.boolang ) == "table" then
                    if type( entry ) == "table" then
                    s = TemplUtl.boolang[ r ];
                        s = entry[ r ];
                    if type( s ) == "boolean" then
                        if type( s ) == "boolean" then
                        r = s;
                            r = s;
                        end
                     end
                     end
                else
                    TemplUtl.L10N = true;
                 end
                 end
                 if type( r ) ~= "boolean" then
                 if type( r ) ~= "boolean" then
                     s = type( another );
                     if type( another ) ~= "nil" then
                    if s == "nil" then
                        r = TemplUtl.faculty( another );
                    else
                         r = true;
                         r = true;
                    elseif s == "boolean" then
                        r = another;
                    else
                        r = TemplUtl.faculty( another );
                     end
                     end
                 end
                 end
Zeile 157: Zeile 110:




TemplUtl.failure = function ( alert, always, addClass, frame )
TemplUtl.failure = function ( alert, always )
     -- Format error message, mostly hidden
     -- Format error message, mostly hidden
     --    alert     -- string: message
     --    alert   -- string
     --    always   -- boolean, or nil: do not hide
     --    always -- do not hide: boolean, or nil
    --    addClass  -- string, or nil: add classes to element
    --    frame    -- object, or nil
     -- Returns string
     -- Returns string
    local max  = 1000000000;
    local id  = math.floor( os.clock() * max );
    local sign = string.format( "error_%d", id );
     local err  = mw.html.create( "span" )
     local err  = mw.html.create( "span" )
                         :addClass( "error" )
                         :addClass( "error" )
                        :attr( "id", sign )
                         :wikitext( alert );
                         :wikitext( alert );
     local live = ( framing( frame ):preprocess( "{{REVISIONID}}" )
     local btn  = mw.html.create( "span" );
                  == "" );
    local top  = mw.html.create( "div" );
    if type( addClass ) == "string" then
    -- TODO: LTR
        err:addClass( addClass )
    btn:css( { ["background"]      = "#FFFF00",
    end
              ["border"]          = "#FF0000 3px solid",
    if live then
              ["font-weight"]    = "bold",
        local max  = 1000000000;
              ["padding"]        = "2px",
        local id  = math.floor( os.clock() * max );
              ["text-decoration"] = "none" } )
        local sign = string.format( "error_%d", id );
      :wikitext( "&gt;&gt;&gt;" )       ;
        local btn  = mw.html.create( "span" );
    sign = string.format( "[[#%s|%s]]",  sign,  tostring( btn ) );
        local top  = mw.html.create( "div" );
    top:wikitext( sign, "&#160;", alert );
        err:attr( "id", sign );
     if not always then
        -- TODO: LTR
         err:css( { ["display"]    = "inline-block",
        btn:css( { ["background"]      = "#FFFF00",
                  ["line-height"] = "0",
                  ["border"]          = "#FF0000 3px solid",
                  ["max-height"]  = "0",
                  ["font-weight"]    = "bold",
                  ["max-width"]  = "0",
                  ["padding"]        = "2px",
                  ["visibility"]  = "hidden" } );
                  ["text-decoration"] = "none" } )
          :wikitext( "&gt;&gt;&gt;" );
        sign = string.format( "[[#%s|%s]]",  sign,  tostring( btn ) );
        top:wikitext( sign, "&#160;", alert );
        mw.addWarning( tostring( top:attr( "role", "alert" ) ) );
     elseif not always then
         err:css( { ["display"]    = "none" } );
--      err:css( { ["display"]    = "inline-block",
--                ["line-height"] = "0",
--                ["max-height"]  = "0",
--                ["max-width"]  = "0",
--                ["visibility"]  = "hidden" } );
     end
     end
    mw.addWarning( tostring( top ) );
     return tostring( err );
     return tostring( err );
end -- TemplUtl.failure()
end -- TemplUtl.failure()
TemplUtl.fake = function ( access )
    -- Simulation of template transclusion
    -- Precondition:
    --    access  -- string; page name (template)
    if type( access ) == "string" then
        local s = mw.text.trim( access );
        if s ~= "" then
            local t = mw.title.new( s, 10 );
            if not mw.title.equals( mw.title.getCurrentTitle(), t )  and
              t.exists then
                t:getContent();
            end
        end
    end
end -- TemplUtl.fake()
TemplUtl.fakes = function ( array, frame, ahead, answer )
    -- Simulation of template transclusions
    -- Precondition:
    --    array  -- table, with template title strings
    --    frame  -- object, or nil
    --    ahead  -- string, or nil, with common prefix
    --    answer  -- true, or nil, for list creation
    -- Postcondition:
    --    Returns string, if answer requested
    local e = framing( frame );
    local f = function ( a )
                  e:expandTemplate{ title = a };
              end
    local s = ahead or "";
    local r;
    for k, v in pairs( array ) do
        if type( k ) == "number" and
          type( v ) == "string" then
            v = s .. mw.text.trim( v );
            pcall( f, v );
            if answer then
                if r then
                    r = r .. "\n";
                else
                    r = "";
                end
                r = string.format( "%s* [[Template:%s|%s]]", r, v, v );
            end
        end
    end -- for k, v
    return r;
end -- TemplUtl.fakes()




Zeile 260: Zeile 151:
     --    address  -- string; what to inspect, URL presumed
     --    address  -- string; what to inspect, URL presumed
     -- Postcondition:
     -- Postcondition:
     --   Returns true, if URL beginning
     --     Returns true, if URL beginning
     local start, r = address:match( "^%s*((%a*:?)//)" );
     local start, r = address:match( "^%s*((%a*:?)//)" );
     if start then
     if start then
Zeile 290: Zeile 181:
     --    after  -- true, if only to search for "}}"
     --    after  -- true, if only to search for "}}"
     -- Postcondition:
     -- Postcondition:
     --   Returns
     --     Returns
     --          -- number; byte position in area
     --          -- number; byte position in area
     --            -- before "|" or "}}", may be at end
     --            -- before "|" or "}}", may be at end
Zeile 427: Zeile 318:
     --    at    -- optional number; byte position in area of "{{"
     --    at    -- optional number; byte position in area of "{{"
     -- Postcondition:
     -- Postcondition:
     --   Returns
     --     Returns
     --          -- table
     --          -- table
     --              [0]      -- template, page, parser function name
     --              [0]      -- template, page, parser function name
Zeile 494: Zeile 385:
     --    ask  -- string; parameter name
     --    ask  -- string; parameter name
     -- Postcondition:
     -- Postcondition:
     --   Returns string with trimmed parameter value, or nil
     --     Returns string with trimmed parameter value, or nil
     --    Does not return value if template inside
     --    Does not return value if template inside
     local r;
     local r;
Zeile 525: Zeile 416:
     --                                no colon (:)
     --                                no colon (:)
     -- Postcondition:
     -- Postcondition:
     --   Returns ustring position of "{{" in area, or false
     --     Returns ustring position of "{{" in area, or false
     -- Requires:
     -- Requires:
     --    fiatTitleRegExp()
     --    fiatTitleRegExp()
Zeile 591: Zeile 482:
--      3 4 5 6
--      3 4 5 6
--        more like 2
--        more like 2
TemplUtl.firstbreak = function ( adjust )
    -- Precede leading character with newline if specific syntax
    -- Precondition:
    --    adjust  -- string; trimmed wikitext
    -- Postcondition:
    --    Returns string, modified if necessary
    return fallible( adjust, true );
end -- TemplUtl.firstbreak()




Zeile 608: Zeile 488:
     -- Remove syntax elements that hide effective syntax only
     -- Remove syntax elements that hide effective syntax only
     -- Precondition:
     -- Precondition:
     --    area  -- string; unparsed wikitext to be reduced
     --    area  -- string; wikitext to be reduced
     -- Postcondition:
     -- Postcondition:
     --   Returns cleared wikitext
     --     Returns cleared wikitext
     local delimiters = { { "<%s*NOWIKI%s*>", "<%s*/%s*NOWIKI%s*>" },
     local delimiters = { { "<%s*NOWIKI%s*>", "<%s*/%s*NOWIKI%s*>" },
                         { "<!--", "-->", true },
                         { "<!--", "-->", true },
Zeile 674: Zeile 554:
     return r;
     return r;
end -- TemplUtl.flat()
end -- TemplUtl.flat()
TemplUtl.nowiki1 = function ( adjust )
    -- HTML-escape leading character if disturbing syntax
    -- Precondition:
    --    adjust  -- string; trimmed wikitext
    -- Postcondition:
    --    Returns string, modified if necessary
    return fallible( adjust, false );
end -- TemplUtl.nowiki1()
Failsafe.failsafe = function ( atleast )
    -- Retrieve versioning and check for compliance
    -- Precondition:
    --    atleast  -- string, with required version or "wikidata" or "~"
    --                or false
    -- Postcondition:
    --    Returns  string  -- with queried version, also if problem
    --              false  -- if appropriate
    local last  = ( atleast == "~" )
    local since = atleast
    local r
    if last  or  since == "wikidata" then
        local item = Failsafe.item
        since = false
        if type( item ) == "number"  and  item > 0 then
            local entity = mw.wikibase.getEntity( string.format( "Q%d",
                                                                item ) )
            if type( entity ) == "table" then
                local seek = Failsafe.serialProperty or "P348"
                local vsn  = entity:formatPropertyValues( seek )
                if type( vsn ) == "table"  and
                  type( vsn.value ) == "string"  and
                  vsn.value ~= "" then
                    if last  and  vsn.value == Failsafe.serial then
                        r = false
                    else
                        r = vsn.value
                    end
                end
            end
        end
    end
    if type( r ) == "nil" then
        if not since  or  since <= Failsafe.serial then
            r = Failsafe.serial
        else
            r = false
        end
    end
    return r
end -- Failsafe.failsafe()




Zeile 737: Zeile 562:
function p.faculty( frame )
function p.faculty( frame )
     return TemplUtl.faculty( frame.args[ 1 ],
     return TemplUtl.faculty( frame.args[ 1 ],
                             frame.args[ 2 ] )  and  "1"
                             frame.args[ 2 ],
                            frame )  and  "1"
           or  "";
           or  "";
end -- p.faculty
end -- p.faculty()


function p.failure( frame )
function p.failure( frame )
     local scream = mw.text.trim( frame.args[ 1 ]  or  "" );
     local scream = mw.text.trim( frame.args[ 1 ]  or  "" );
     local loud  = frame.args[ 2 ];
     local loud  = frame.args[ 2 ];
    local select = frame.args.class;
     if scream == "?????????" then
     if scream == "" then
        scream = "";
        scream = "?????????";
     end
     end
     if loud then
     if loud then
         loud = TemplUtl.faculty( loud, nil );
         loud = TemplUtl.faculty( loud, nil, frame );
    end
    return TemplUtl.failure( scream, loud, select, frame );
end -- p.failure
 
function p.fake( frame )
    TemplUtl.fake( frame.args[ 1 ]  or  "", frame );
    return "";
end -- p.fake
 
function p.fakes( frame )
    local list = ( frame.args.list == "1" );
    local r    = TemplUtl.fakes( frame.args,
                                frame,
                                frame.args.prefix,
                                list );
    return r or "";
end -- p.fakes
 
function p.firstbreak( frame )
    local r = ( frame.args[ 1 ] );
    if r then
        r = mw.text.trim( r );
        if r ~= "" then
            r = TemplUtl.firstbreak( r );
        end
     end
     end
     return r or "";
     return TemplUtl.failure( scream, loud );
end -- p.firstbreak
end -- p.failure()


function p.from( frame )
function p.failsafe()
    local r = frame:getParent():getTitle();
     return TemplUtl.serial;
    if r then
end -- p.failsafe()
        r = string.format( "&#123;&#123;%s&#125;&#125;", r );
    end
    return r or "";
end -- p.from
 
function p.isRedirect()
     return mw.title.getCurrentTitle().isRedirect and "1"  or  "";
end -- p.isRedirect
 
function p.nowiki1( frame )
    local r = ( frame.args[ 1 ] );
    if r then
        r = mw.text.trim( r );
        if r ~= "" then
            r = TemplUtl.nowiki1( r );
        end
    end
    return r or "";
end -- p.nowiki1
 
p.failsafe = function ( frame )
    -- Versioning interface
    local s = type( frame )
    local since
    if s == "table" then
        since = frame.args[ 1 ]
    elseif s == "string" then
        since = frame
    end
    if since then
        since = mw.text.trim( since )
        if since == "" then
            since = false
        end
    end
    return Failsafe.failsafe( since )  or  ""
end -- p.failsafe


p.TemplUtl = function ()
p.TemplUtl = function ()

Bitte beachte, dass alle Beiträge im Regiowiki von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können. Reiche hier keine Texte ein, falls Du nicht willst, dass diese ohne Einschränkung geändert werden können.

Mit dem Speichern dieser Seite stimmst Du den Nutzungsbedingungen zu und versicherst, dass Du den Beitrag selbst verfasst hast bzw. dass er keine fremden Rechte verletzt, und willigst ein, ihn unter der Creative Commons Attribution/Share-Alike Lizenz 3.0 zu veröffentlichen. Übertrage ohne Genehmigung keine urheberrechtlich geschützten Inhalte!

Du stimmst einer Autorennennung mindestens durch URL oder Verweis auf den Artikel zu. Wenn Du nicht möchtest, dass Dein Text weiterbearbeitet und weiterverbreitet wird bzw. den Nutzungsbedingungen nicht zustimmst, dann speichere ihn nicht.

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)

[] [[]] | {{}} {{{}}} “” ‘’ «» ‹› „“ ‚‘ · × ° § ~~~~ <s></s> <small></small> <sup></sup> <sub></sub> <tt></tt> <code></code> <pre></pre> &nbsp; [[Kategorie:]] [[Datei:]] [[Media:]] {{DEFAULTSORT:}} {{NAMESPACE}} {{PAGENAME}} #REDIRECT[[]] <gallery></gallery> <!-- --> <nowiki></nowiki> <code><nowiki></nowiki></code> <includeonly></includeonly> <noinclude></noinclude> <onlyinclude></onlyinclude> <translate></translate> <tvar|></> <languages/>

Die folgende Vorlage wird auf dieser Seite verwendet: