Modul:TemplatePar: Unterschied zwischen den Versionen

2.244 Bytes hinzugefügt ,  6. Mai 2013
update
wp>PerfektesChaos
(update)
wp>PerfektesChaos
(update)
Zeile 1: Zeile 1:
--[=[ TemplatePar 2013-05-05
--[=[ TemplatePar 2013-05-06
Template parameter utility
Template parameter utility
* check
* check
* count
* count
* valid
* valid
* verify
* TemplatePar()
* TemplatePar()
]=]
]=]
Zeile 17: Zeile 18:
     dupOpt      = "#invoke:TemplatePar * repeated optional parameter",
     dupOpt      = "#invoke:TemplatePar * repeated optional parameter",
     dupRule    = "#invoke:TemplatePar * parameter conflict key/pattern",
     dupRule    = "#invoke:TemplatePar * parameter conflict key/pattern",
     empty      = "Error in template: undefined value for mandatory",
     empty      = "Error in template * undefined value for mandatory",
     invalid    = "Error in template: invalid parameter",
     invalid    = "Error in template * invalid parameter",
     invalidPar  = "#invoke:TemplatePar * invalid parameter",
     invalidPar  = "#invoke:TemplatePar * invalid parameter",
     minmax      = "#invoke:TemplatePar * min > max",
     minmax      = "#invoke:TemplatePar * min > max",
    noErrorCat  = "#invoke:TemplatePar * noError and missing category",
     noname      = "#invoke:TemplatePar * missing parameter name",
     noname      = "#invoke:TemplatePar * missing parameter name",
     tooLong    = "Error in template: parameter too long",
     tooLong    = "Error in template * parameter too long",
     tooShort    = "Error in template: parameter too short",
     tooShort    = "Error in template * parameter too short",
     undefined  = "Error in template: mandatory parameter missing",
     undefined  = "Error in template * mandatory parameter missing",
     unknown    = "Error in template: unknown parameter name",
     unknown    = "Error in template * unknown parameter name",
     unknownRule = "#invoke:TemplatePar * unknown rule"
     unknownRule = "#invoke:TemplatePar * unknown rule"
}
}
Zeile 32: Zeile 34:
     dupOpt      = "#invoke:TemplatePar * Optionsparameter wiederholt",
     dupOpt      = "#invoke:TemplatePar * Optionsparameter wiederholt",
     dupRule    = "#invoke:TemplatePar * Parameterkonflikt key/pattern",
     dupRule    = "#invoke:TemplatePar * Parameterkonflikt key/pattern",
     empty      = "Fehler bei Vorlage: Pflichtparameter ohne Wert",
     empty      = "Fehler bei Vorlage * Pflichtparameter ohne Wert",
     invalid    = "Fehler bei Vorlage: Parameter ungültig",
     invalid    = "Fehler bei Vorlage * Parameter ungültig",
     invalidPar  = "#invoke:TemplatePar * Ungültiger Parameter",
     invalidPar  = "#invoke:TemplatePar * Ungültiger Parameter",
     minmax      = "#invoke:TemplatePar * min > max",
     minmax      = "#invoke:TemplatePar * min > max",
    noErrorCat  = "#invoke:TemplatePar * noError und keine Kategorie",
     noname      = "#invoke:TemplatePar * Parametername nicht angegeben",
     noname      = "#invoke:TemplatePar * Parametername nicht angegeben",
     tooLong    = "Fehler bei Vorlage: Parameter zu lang",
     tooLong    = "Fehler bei Vorlage * Parameter zu lang",
     tooShort    = "Fehler bei Vorlage: Parameter zu kurz",
     tooShort    = "Fehler bei Vorlage * Parameter zu kurz",
     undefined  = "Fehler bei Vorlage: Pflichtparameter fehlt",
     undefined  = "Fehler bei Vorlage * Pflichtparameter fehlt",
     unknown    = "Fehler bei Vorlage: Parametername unbekannt",
     unknown    = "Fehler bei Vorlage * Parametername unbekannt",
     unknownRule = "#invoke:TemplatePar * Unbekannte Regel"
     unknownRule = "#invoke:TemplatePar * Unbekannte Regel"
}
}
Zeile 164: Zeile 167:
     end
     end
     if suspect then
     if suspect then
         r = r .. " " .. suspect
         r = r .. ": " .. suspect
     end
     end
     return r
     return r
Zeile 177: Zeile 180:
     --    key    -- string or number; to be appended
     --    key    -- string or number; to be appended
     -- Postcondition:
     -- Postcondition:
     --   Return string; extended
     --     Return string; extended
     local r
     local r
     local s
     local s
Zeile 201: Zeile 204:
     --    needle    -- any; identifier
     --    needle    -- any; identifier
     -- Postcondition:
     -- Postcondition:
     --   Return true iff found
     --     Return true iff found
     local k, v
     local k, v
     for k, v in pairs( haystack ) do
     for k, v in pairs( haystack ) do
Zeile 213: Zeile 216:




local function fetch()
local function fetch( low )
     -- Return regular table with all template transclusion parameters
     -- Return regular table with all template transclusion parameters
    -- Precondition:
    --    low  -- true: template transclusion;  false: #invoke
     -- Postcondition:
     -- Postcondition:
     --   Return table; whitespace-only values as false
     --     Return table; whitespace-only values as false
     -- Uses:
     -- Uses:
     --    mw.getCurrentFrame()
     --    mw.getCurrentFrame()
Zeile 222: Zeile 227:
     local k, v
     local k, v
     local r = { }
     local r = { }
     local t = mw.getCurrentFrame():getParent()
     local t = mw.getCurrentFrame()
    if low then
        t = t:getParent()
    end
     local o = t.args
     local o = t.args
     for k, v in pairs( o ) do
     for k, v in pairs( o ) do
Zeile 247: Zeile 255:
     --    specified  -- string or nil; requested parameter set
     --    specified  -- string or nil; requested parameter set
     -- Postcondition:
     -- Postcondition:
     --   Return sequence table
     --     Return sequence table
     -- Uses:
     -- Uses:
     --    mw.text.split()
     --    mw.text.split()
Zeile 278: Zeile 286:
     -- Postcondition:
     -- Postcondition:
     --    Return string or false
     --    Return string or false
    -- Uses:
    --    factory()
     local r = false
     local r = false
     if submit then
     if submit then
Zeile 287: Zeile 297:
         end
         end
         if opt.noError then
         if opt.noError then
             r = false
             if not opt.cat then
                r = submit .. " " .. factory( "noErrorCat" )
            end
         else
         else
             r = "<span class='error'>" .. submit .. "</span>"
            r = submit
        end
        if r then
             r = "<span class='error'>" .. r .. "</span>"
         end
         end
         s = opt.cat
         s = opt.cat
Zeile 315: Zeile 330:
     --    needle    -- any; key name
     --    needle    -- any; key name
     -- Postcondition:
     -- Postcondition:
     --   Return true iff found
     --     Return true iff found
     local i
     local i
     for i = 1, #haystack do
     for i = 1, #haystack do
Zeile 372: Zeile 387:




local function fix( valid, duty, options )
local function fix( valid, duty, got, options )
     -- Perform transclusion parameter analysis
     -- Perform parameter analysis
     -- Precondition:
     -- Precondition:
     --    valid    -- table; unique sequence of known parameters
     --    valid    -- table; unique sequence of known parameters
     --    duty    -- table; sequence of mandatory parameters
     --    duty    -- table; sequence of mandatory parameters
    --    got      -- table; sequence of current parameters
     --    options  -- table or nil; optional details
     --    options  -- table or nil; optional details
     -- Postcondition:
     -- Postcondition:
     --    Return string as configured; empty if valid
     --    Return string as configured; empty if valid
     -- Uses:
     -- Uses:
    --    fetch()
     --    finder()
     --    finder()
     --    fault()
     --    fault()
Zeile 387: Zeile 402:
     --    fed()
     --    fed()
     local k, v
     local k, v
     local r   = false
     local r = false
    local got = fetch()
     for k, v in pairs( got ) do
     for k, v in pairs( got ) do
         if not finder( valid, k ) then
         if not finder( valid, k ) then
Zeile 420: Zeile 434:
     return r
     return r
end -- fix()
end -- fix()
local function fold( low , options )
    -- Run parameter analysis on current environment
    -- Precondition:
    --    low      -- true: template transclusion;  false: #invoke
    --    options  -- table or nil; optional details
    --                options.mandatory
    --                options.optional
    -- Postcondition:
    --    Return string with error message as configured;
    --            false if valid
    -- Uses:
    --    fit()
    --    failure()
    --    fetch()
    --    fix()
    --    finalize()
    local duty, r
    if type( options ) == "table" then
        if type( options.mandatory ) == "table" then
            duty = options.mandatory
        else
            duty = { }
        end
        if type( options.optional ) ~= "table" then
            options.optional = { }
        end
        r = fit( duty, options.optional )
    else
        duty = { }
        r    = { }
    end
    if type( r ) == "string" then
        r = failure( "dupOpt", r, options )
    else
        local got = fetch( low )
        r = fix( r, duty, got, options )
    end
    return finalize( r, options )
end -- fold()




Zeile 521: Zeile 577:


TemplatePar.check = function ( options )
TemplatePar.check = function ( options )
     -- Run parameter analysis
     -- Run parameter analysis on current template environment
     -- Precondition:
     -- Precondition:
     --    options  -- table or nil; optional details
     --    options  -- table or nil; optional details
Zeile 528: Zeile 584:
     -- Postcondition:
     -- Postcondition:
     --    Return string with error message as configured;
     --    Return string with error message as configured;
     --            false if valid or no answer permitted
     --            false if valid
     -- Uses:
     -- Uses:
     --    fit()
     --    fold()
    --    failure()
     return fold( true, options )
    --    fix()
    --    finalize()
    local duty, r
    if type( options ) == "table" then
        if type( options.mandatory ) == "table" then
            duty = options.mandatory
        else
            duty = { }
        end
        if type( options.optional ) ~= "table" then
            options.optional = { }
        end
        r = fit( duty, options.optional )
    else
        duty = { }
        r    = { }
    end
    if type( r ) == "string" then
        r = failure( "dupOpt", r, options )
    else
        r = fix( r, duty, options )
    end
     return finalize( r, options )
end -- TemplatePar.check()
end -- TemplatePar.check()


Zeile 562: Zeile 595:
     -- Return number of template parameters
     -- Return number of template parameters
     -- Postcondition:
     -- Postcondition:
     --   Return number, starting at 0
     --     Return number, starting at 0
     -- Uses:
     -- Uses:
     --    mw.getCurrentFrame()
     --    mw.getCurrentFrame()
Zeile 605: Zeile 638:
     return finalize( r, options )
     return finalize( r, options )
end -- TemplatePar.valid()
end -- TemplatePar.valid()
TemplatePar.verify = function ( options )
    -- Perform #invoke parameter analysis
    -- Precondition:
    --    options  -- table or nil; optional details
    -- Postcondition:
    --    Return string with error message as configured;
    --            false if valid
    -- Uses:
    --    fold()
    return fold( false, options )
end -- TemplatePar.verify()




Zeile 620: Zeile 667:
     --    Return string with error message or ""
     --    Return string with error message or ""
     -- Uses:
     -- Uses:
    --    fold()
     --    fill()
     --    fill()
    --    TemplatePar.check()
     local options = { optional  = { "1",
     local options = { mandatory = fill( frame.args[ 1 ] ),
                                    "2",
                      optional  = fill( frame.args[ 2 ] ),
                                    "cat",
                      cat      = frame.args.cat,
                                    "noError",
                      noError  = frame.args.noError,
                                    "template" }
                      template  = frame.args.template
                     }
                     }
     return TemplatePar.check( options ) or ""
     local r = fold( false, options )
    if not r then
        options = { mandatory = fill( frame.args[ 1 ] ),
                    optional  = fill( frame.args[ 2 ] ),
                    cat      = frame.args.cat,
                    noError  = frame.args.noError,
                    template  = frame.args.template
                  }
        r      = fold( true, options )
    end
    return r or ""
end -- .check()
end -- .check()


Zeile 651: Zeile 708:
     --    Return string with error message or ""
     --    Return string with error message or ""
     -- Uses:
     -- Uses:
    --    fold()
     --    trim()
     --    trim()
     --    mw.ustring.gsub()
     --    mw.ustring.gsub()
     --    TemplatePar.valid()
     --    TemplatePar.valid()
    local r = false
     local options = { mandatory = { "1" },
    local s
                       optional = { "2",
     local options = { cat      = frame.args.cat,
                                    "cat",
                       noError = frame.args.noError,
                                    "max",
                      template = frame.args.template
                                    "min",
                                    "noError",
                                    "template" }
                     }
                     }
     s = trim( frame.args[ 2 ] )
     local r = fold( false, options )
    if type( s ) == "string" then
    if not r then
        local sub = s:match( "^/(.*%S)/$" )
        local s = trim( frame.args[ 2 ] )
        if type( sub ) == "string" then
        options = { cat      = frame.args.cat,
            sub = sub:gsub( "%%!", "|" )
                    noError  = frame.args.noError,
            sub = sub:gsub( "%%%(%(", "{{" )
                    template = frame.args.template
            sub = sub:gsub( "%%%)%)", "}}" )
                  }
            options.pattern = sub
        if type( s ) == "string" then
         else
            local sub = s:match( "^/(.*%S)/$" )
             options.key = s
            if type( sub ) == "string" then
                sub = sub:gsub( "%%!", "|" )
                sub = sub:gsub( "%%%(%(", "{{" )
                sub = sub:gsub( "%%%)%)", "}}" )
                options.pattern = sub
            else
                options.key = s
            end
         end
        if type( frame.args.min ) == "string" then
            s = frame.args.min:match( "^%s*([0-9]+)%s*$" )
             if s then
                options.min = tonumber( s )
            else
                r = failure( "invalidPar",
                            "min=" .. frame.args.min,
                            options )
            end
         end
         end
    end
        if type( frame.args.max ) == "string" then
    if type( frame.args.min ) == "string" then
            s = frame.args.max:match( "^%s*([1-9][0-9]*)%s*$" )
        s = frame.args.min:match( "^%s*([0-9]+)%s*$" )
            if s then
        if s then
                options.max = tonumber( s )
            options.min = tonumber( s )
            else
        else
                r = failure( "invalidPar",
            r = failure( "invalidPar",
                            "max=" .. frame.args.max,
                        "min=" .. frame.args.min,
                            options )
                        options )
            end
         end
         end
    end
         if r then
    if type( frame.args.max ) == "string" then
             r = finalize( r, options )
        s = frame.args.max:match( "^%s*([1-9][0-9]*)%s*$" )
         if s then
             options.max = tonumber( s )
         else
         else
             r = failure( "invalidPar",
             s = frame.args[ 1 ] or ""
                        "max=" .. frame.args.max,
            r = TemplatePar.valid( s, options )
                        options )
         end
         end
     end
     end
     if r then
     return r or ""
        r = finalize( r, options )
    else
        s = frame.args[ 1 ] or ""
        r = TemplatePar.valid( s, options ) or ""
    end
    return r
end -- .valid()
end -- .valid()


Anonymer Benutzer