יחידה:ParamValidator: הבדלים בין גרסאות בדף
dumpkopf |
סירוק, פליית כינים, עדכון התיעוד |
||
| שורה 1: | שורה 1: | ||
--[[ | --[[ | ||
this unit contains a single function. | this unit contains a single function. | ||
it retrieves the template's templatedata, and uses it to validate the parameters passed to the template. | |||
if any violations found, it returns am appropriate string. this string will typically include some maintenance category, and/or error message. | |||
the operation of the module is controlled by a single parameter passed to it. this string should be valid JSON describing the actions. | |||
the fields of this structure has the following keys, with string or null value: | |||
* "no-templatedata": no valid tempaltedata was found in tempalte page, or documentation subpage | |||
* "undeclared": parameters with non-empty value, which do not exist in templatedata | |||
* "empty-undeclared": parameters with empty value, which do not exist in templatedata | |||
* "deprecated": parameters with non-empty value, marked as "deprecated" in tempaltedata | |||
* "empty-deprecated": parameters with empty value, marked as "deprecated" in tempaltedata | |||
* "empty-required": parameters marked as "required" in tempaltedata have no value | |||
* "any": at least one of the above properies has non-empty value, and the corresponding error actually exists. | |||
if any of these error-conditions exists, the value associated with the corresponding key, if not empty, will be appended to the output, | |||
after possibly replacing either one of two tokens: | |||
-- "templatename" is replaced with the actual template name, | |||
-- "paramname" is replaced by a comma-separated list of parameters offending the rule. | |||
if the value of some key is null, it means this error condition will be ignored. | |||
in addition, there are several other optional keys of the "options" structure: | |||
* "doc-subpage": if supplied, optional subpage to look for tempaltedata definition. typically it's "Documentation", or a translation | |||
* "ignore": list of parameter names which will be ignored, both in tempaltedata (for "required" and "deprecated" calculation), | |||
or the template, for "undeclared" calculation | |||
< | typically, this JSON structure will be placed in a special template, and retrieved for the module-use like so: | ||
includeonly>{{#invoke: | <includeonly>{{#invoke:ParamValidatoe | validateParams | options = {{PV Default Values}} }}</includeonly> | ||
this code is to be placed at the very beginning of the page of the template whose uses are to be validated. | |||
several such options pages may exist, so the user can decide which validation regime to use with each template, by invoking it and passing | |||
the appropriate one for the "options" parameter. | |||
]] | ]] | ||
function extract_options( frame ) | function extract_options( frame ) | ||
local options | local options | ||
local args = frame.args | local args = frame.args | ||
local options = not empty( args.options ) and mw.text.jsonDecode( args.options ) or {} | local options = not empty( args.options ) and mw.text.jsonDecode( args.options ) or {} | ||
local n = 1 | local n = 1 | ||
while not empty( args['options' .. n] ) do | while not empty( args['options' .. n] ) do | ||
| שורה 130: | שורה 63: | ||
function validateParams( frame ) | function validateParams( frame ) | ||
local options = extract_options( frame ) | local options = extract_options( frame ) | ||
local t_frame = frame:getParent() | local t_frame = frame:getParent() | ||
local t_args, template_name = t_frame.args, t_frame:getTitle() | local t_args, template_name = t_frame.args, t_frame:getTitle() | ||
local td_source = build_namelist( options, template_name ) | local td_source = build_namelist( options, template_name ) | ||
local templatedata = require( 'Module:ReadTd' ).ReadTemplateData( td_source ) | local templatedata = require( 'Module:ReadTd' ).ReadTemplateData( td_source ) | ||
local td_p = templatedata.params -- now we have options, template args, and td params metadata. we can work now. | |||
local report = '' | |||
local wrapreport = function() | local wrapreport = function() | ||
if empty( report ) then return '' end | |||
return ( options['report-prefix'] or "<div class = 'paramvalidator-wrapper'>" ) | |||
.. report | |||
.. ( options['report-suffix'] or "</div>" ) | |||
end | end | ||
| שורה 176: | שורה 113: | ||
return wrapreport() -- from this point on, we know templatedata is valid. | return wrapreport() -- from this point on, we know templatedata is valid. | ||
end | end | ||
-- undeclared and deprecated contains only non-empty parameters. | -- undeclared and deprecated contains only non-empty parameters. | ||
-- empty_undeclared contains undeclared parameters with no value | -- empty_undeclared contains undeclared parameters with no value | ||
local undeclared, empty_undeclared, empty_required, deprecated = {}, {}, {}, {} | local undeclared, empty_undeclared, empty_required, deprecated, empty_deprecated = {}, {}, {}, {}, {} | ||
local undec = { [true] = empty_undeclared, [false] = undeclared } | |||
for p_name, value in pairs( t_args ) do | local dep = { [true] = empty_deprecated, [false] = deprecated } | ||
if | |||
-- if paramete does not appear in TD, add it to undeclared or empty-undeclared. if it does appear, | |||
for p_name, value in pairs( t_args ) do | |||
if not ignore( p_name ) then | |||
local noval = empty( value ) | |||
table.insert( | if not td_p[p_name] then -- fill undeclared or undeclared_empty, depends on noval | ||
table.insert( undec[noval], p_name ) | |||
elseif td_p[p_name].deprecated then | |||
table.insert( dep[noval], p_name ) | |||
end | end | ||
end | end | ||
end | end | ||
| שורה 198: | שורה 136: | ||
-- and optionally (if options.deprecated exists), use of non-empty deprecated parameters. | -- and optionally (if options.deprecated exists), use of non-empty deprecated parameters. | ||
for p_name, param in pairs( td_p ) do | for p_name, param in pairs( td_p ) do | ||
if param.required and empty( t_args[p_name] | if not ignore( p_name ) and param.required and empty( t_args[p_name] ) then | ||
table.insert( empty_required, p_name ) | table.insert( empty_required, p_name ) | ||
end | end | ||
end | end | ||
| שורה 214: | שורה 149: | ||
end | end | ||
if #empty_undeclared ~= 0 then | |||
report_params( 'empty-undeclared', empty_undeclared ) | |||
end | |||
if #deprecated ~= 0 then | if #deprecated ~= 0 then | ||
report_params( 'deprecated', deprecated ) | report_params( 'deprecated', deprecated ) | ||
end | end | ||
if # | if #emptyy_deprecated ~= 0 then | ||
report_params( ' | report_params( 'deprecated', deprecated ) | ||
end | end | ||
if | |||
if not empty( report ) then report_params( 'any' ) end | |||
return wrapreport() | return wrapreport() | ||