Difference between revisions of "Module:Check for unknown parameters"
m (1 revision imported) |
|||
(One intermediate revision by one other user not shown) | |||
Line 16: | Line 16: | ||
local pargs = frame:getParent().args | local pargs = frame:getParent().args | ||
local ignoreblank = isnotempty(frame.args['ignoreblank']) | local ignoreblank = isnotempty(frame.args['ignoreblank']) | ||
− | local | + | local checkpos = isnotempty(frame.args['checkpositional']) |
local knownargs = {} | local knownargs = {} | ||
local unknown = frame.args['unknown'] or 'Found _VALUE_, ' | local unknown = frame.args['unknown'] or 'Found _VALUE_, ' | ||
local preview = frame.args['preview'] | local preview = frame.args['preview'] | ||
− | |||
local res = {} | local res = {} | ||
local regexps = {} | local regexps = {} | ||
+ | local comments = {} | ||
+ | local commentstr = '' | ||
+ | |||
+ | local ispreview = frame:preprocess( "{{REVISIONID}}" ) == "" and 1 or 0 | ||
-- create the list of known args, regular expressions, and the return string | -- create the list of known args, regular expressions, and the return string | ||
Line 38: | Line 41: | ||
elseif preview == nil then | elseif preview == nil then | ||
preview = unknown | preview = unknown | ||
+ | end | ||
+ | if ispreview == 1 then | ||
+ | unknown = preview | ||
+ | ignoreblank = false | ||
+ | end | ||
+ | |||
+ | -- adds one result to the output tables | ||
+ | local function addresult(k) | ||
+ | if k == '' then | ||
+ | -- Fix odd bug for | = which gets stripped to the empty string and | ||
+ | -- breaks category links | ||
+ | k = ' ' | ||
+ | end | ||
+ | local r = unknown:gsub('_VALUE_', k) | ||
+ | table.insert(res, r) | ||
+ | table.insert(comments, '"' .. k .. '"') | ||
end | end | ||
Line 52: | Line 71: | ||
if not knownflag and ( not ignoreblank or isnotempty(v) ) then | if not knownflag and ( not ignoreblank or isnotempty(v) ) then | ||
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?') | k = mw.ustring.gsub(k, '[^%w\-_ ]', '?') | ||
− | + | addresult(k) | |
end | end | ||
− | elseif type(k) == 'number' and | + | elseif checkpos and |
+ | type(k) == 'number' and | ||
knownargs[tostring(k)] == nil and | knownargs[tostring(k)] == nil and | ||
− | ( | + | ( not ignoreblank or isnotempty(v) ) |
then | then | ||
− | + | addresult(k) | |
− | |||
− | |||
− | |||
end | end | ||
end | end | ||
− | + | if #comments > 0 then | |
− | if # | + | commentstr = '<!-- Module:Check for unknown parameters results: ' .. |
− | + | table.concat(comments, ', ') .. '-->' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | table. | ||
− | |||
end | end | ||
− | + | ||
− | return table.concat(res) | + | return table.concat(res) .. commentstr |
end | end | ||
return p | return p |
Latest revision as of 19:58, 31 January 2018
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
This module may be appended to a template to check for uses of unknown parameters.
Contents
Usage
Basic usage
{{#invoke:check for unknown parameters|check |unknown=[[Category:Some tracking category]] |arg1|arg2|...|argN}}
or to sort the entries in the tracking category by parameter with a preview error message
{{#invoke:check for unknown parameters|check |unknown=[[Category:Some tracking category|_VALUE_]] |preview=unknown parameter "_VALUE_" |arg1|arg2|...|argN}}
or for an explicit red error message
{{#invoke:check for unknown parameters|check |unknown=<span class="error">Sorry, I don't recognize _VALUE_</span> |arg1|arg2|...|argN}}
or to use hidden error messages which can be viewed in the HTML source and a preview error message
{{#invoke:check for unknown parameters|check |unknown=<span class="error" style="display:none">HIDDEN ERROR: Usage of "_VALUE_" is not recognized</span> |preview=unknown parameter "_VALUE_" |arg1|arg2|...|argN}}
Here, arg1
, arg2
, ..., argN
, are the known parameters. Any parameter which is used, but not on this list, will cause the module to return whatever is passed with the unknown
parameter. The _VALUE_
keyword, if used, will be changed to the name of the parameter. This is useful for either sorting the entries in a tracking category, or for provide more explicit information.
By default, the module makes no distinction between a defined-but-blank parameter and a non-blank parameter. To only track non-blank parameters use |ignoreblank=1
.
Regular expressions
This module supports regular expressions, which are useful when there are many known parameters which use a systematic pattern. For example, template:infobox3cols uses
| regexp1 = header[%d][%d]* | regexp2 = label[%d][%d]* | regexp3 = data[%d][%d]*[abc]? | regexp4 = class[%d][%d]*[abc]? | regexp5 = rowclass[%d][%d]* | regexp6 = rowstyle[%d][%d]* | regexp7 = rowcellstyle[%d][%d]*
to match all parameters of the form headerNUM
, labelNUM
, dataNUM
, dataNUMa
, dataNUMb
, dataNUMc
, ..., rowcellstyleNUM
, where NUM is a string of digits.
Example
{{Infobox | above = {{{name|}}} | label1 = Height | data1 = {{{height|}}} | label2 = Weight | data2 = {{{weight|}}} | label3 = Website | data3 = {{{website|}}} }}<!-- end infobox, start tracking -->{{#invoke:Check for unknown parameters|check | unknown = [[Category:Some tracking category|_VALUE_]] | preview = unknown parameter "_VALUE_" | name | height | weight | website }}
Templates invoking this module
The following is a list of templates which invoke this module, with the associated category for each.
See also
- module:TemplatePar (originally from dewiki)
- Template:Parameters and Module:Parameters – generates a list of parameter names for a given template
-- This module may be used to compare the arguments passed to the parent -- with a list of arguments, returning a specified result if an argument is -- not on the list local p = {} local function trim(s) return s:match('^%s*(.-)%s*$') end local function isnotempty(s) return s and trim(s) ~= '' end function p.check (frame) local args = frame.args local pargs = frame:getParent().args local ignoreblank = isnotempty(frame.args['ignoreblank']) local checkpos = isnotempty(frame.args['checkpositional']) local knownargs = {} local unknown = frame.args['unknown'] or 'Found _VALUE_, ' local preview = frame.args['preview'] local res = {} local regexps = {} local comments = {} local commentstr = '' local ispreview = frame:preprocess( "{{REVISIONID}}" ) == "" and 1 or 0 -- create the list of known args, regular expressions, and the return string for k, v in pairs(args) do if type(k) == 'number' then v = trim(v) knownargs[v] = 1 elseif k:find('^regexp[1-9][0-9]*$') then table.insert(regexps, '^' .. v .. '$') end end if isnotempty(preview) then preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>' elseif preview == nil then preview = unknown end if ispreview == 1 then unknown = preview ignoreblank = false end -- adds one result to the output tables local function addresult(k) if k == '' then -- Fix odd bug for | = which gets stripped to the empty string and -- breaks category links k = ' ' end local r = unknown:gsub('_VALUE_', k) table.insert(res, r) table.insert(comments, '"' .. k .. '"') end -- loop over the parent args, and make sure they are on the list for k, v in pairs(pargs) do if type(k) == 'string' and knownargs[k] == nil then local knownflag = false for i, regexp in ipairs(regexps) do if mw.ustring.match(k, regexp) then knownflag = true break end end if not knownflag and ( not ignoreblank or isnotempty(v) ) then k = mw.ustring.gsub(k, '[^%w\-_ ]', '?') addresult(k) end elseif checkpos and type(k) == 'number' and knownargs[tostring(k)] == nil and ( not ignoreblank or isnotempty(v) ) then addresult(k) end end if #comments > 0 then commentstr = '<!-- Module:Check for unknown parameters results: ' .. table.concat(comments, ', ') .. '-->' end return table.concat(res) .. commentstr end return p