Module:Check for unknown parameters: Difference between revisions

From Mirrorplay: Fae
Jump to navigation Jump to search
mpfae>BusterD
m (Changed protection settings for "Module:Check for unknown parameters": Highly visible template; requested at WP:RfPP ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)))
 
m (1 revision imported: Template Data from Wikipedia)
 
(No difference)

Latest revision as of 08:57, 16 June 2024

{{#if:{{#ifeq:Check f|sandbox|1}}{{#ifeq:Check for unknown parameters|doc|1}}||{{#switch:Lua error: First parameter must be one of edit, move, create, upload, undelete, autoreview.|sysop|templateeditor|interfaceadmin=|#default=}}}}

{{#ifeq:Check for unknown parameters|doc|{{#if:|}}|{{#switch:

 {{#if:
 |     
 | {{#ifeq:Module|Module
   | module
   | other
   }}
 }}
| module = {{#ifeq: Check for unknown parameters | Sandbox
    | 
    | {{#switch: Check for unknown parameters
        | doc | sandbox =
        | {{#ifeq:  | true 
            |  
            | {{#switch: p
                | pre-alpha | prealpha | pa =
                | alpha | a =
                | beta | b =
                | release | r | general | g =
                | protected | protect | p =
                | semiprotected | semiprotect | semi =
              }}
          }}
      }}
   }}

| other | #default = Error: {{Module rating}} must be placed in the Module namespace. }}}}

This module may be appended to a template to check for uses of unknown parameters. Unlike many other modules, this module is not implemented by a template.

Usage[edit]

Basic usage[edit]

<syntaxhighlight lang="wikitext">

</syntaxhighlight> or to sort the entries in the tracking category by parameter with a preview error message <syntaxhighlight lang="wikitext">

</syntaxhighlight> or for an explicit red error message <syntaxhighlight lang="wikitext">

</syntaxhighlight> Here, arg1, arg2, ..., argN, are the known parameters. Unnamed (positional) parameters can be added too: |1|2|argname1|argname2|.... 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. That is, both unlisted |{{SAFESUBST:#if:foo|foo=}}x and |{{SAFESUBST:#if:foo|foo=}} are reported. To only track non-blank parameters use |{{SAFESUBST:#if:ignoreblank|ignoreblank=}}1.

By default, the module ignores blank positional parameters. That is, an unlisted |{{SAFESUBST:#if:2|2=}} is ignored. To include blank positional parameters in the tracking use |{{SAFESUBST:#if:showblankpositional|showblankpositional=}}1.

Lua patterns[edit]

This module supports Lua patterns (similar to regular expressions), which are useful when there are many known parameters which use a systematic pattern. For example, Infobox3cols uses <syntaxhighlight lang="lua"> regexp1 = "header[%d]+", regexp2 = "label[%d]+", regexp3 = "data[%d]+[abc]?", regexp4 = "class[%d]+[abc]?", regexp5 = "rowclass[%d]+", regexp6 = "rowstyle[%d]+", regexp7 = "rowcellstyle[%d]+", </syntaxhighlight> to match all parameters of the form headerNUM, labelNUM, dataNUM, dataNUMa, dataNUMb, dataNUMc, ..., rowcellstyleNUM, where NUM is a string of digits.

Example[edit]

<syntaxhighlight lang="wikitext"> {{#switch:

 {{#if:
 | {{{demospace}}}    
 | {{#ifeq:Module|Template
   | template
   | other
   }}
 }}

| template = {{#ifeq:Check for unknown parameters|Infobox||{{#ifeq:Check f|Infobox|}}}} | other | #default = }} </syntaxhighlight>

Call from within Lua code[edit]

See the end of Module:Rugby box for a simple example or Module:Infobox3cols or Module:Flag for more complicated examples.

See also[edit]

{{#if:{{#ifeq:Check f|sandbox|1}}{{#ifeq:Check for unknown parameters|doc|1}}||

}}


-- 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 s:match('%S')
end

local function clean(text)
	-- Return text cleaned for display and truncated if too long.
	-- Strip markers are replaced with dummy text representing the original wikitext.
	local pos, truncated
	local function truncate(text)
		if truncated then
			return ''
		end
		if mw.ustring.len(text) > 25 then
			truncated = true
			text = mw.ustring.sub(text, 1, 25) .. '...'
		end
		return mw.text.nowiki(text)
	end
	local parts = {}
	for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
		pos = remainder
		table.insert(parts, truncate(before) .. '&lt;' .. tag .. '&gt;...&lt;/' .. tag .. '&gt;')
	end
	table.insert(parts, truncate(text:sub(pos or 1)))
	return table.concat(parts)
end

function p._check(args, pargs)
	if type(args) ~= "table" or type(pargs) ~= "table" then
		-- TODO: error handling
		return
	end

	-- create the list of known args, regular expressions, and the return string
	local knownargs = {}
	local regexps = {}
	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

	-- loop over the parent args, and make sure they are on the list
	local ignoreblank = isnotempty(args['ignoreblank'])
	local showblankpos = isnotempty(args['showblankpositional'])
	local values = {}
	for k, v in pairs(pargs) do
		if type(k) == 'string' and knownargs[k] == nil then
			local knownflag = false
			for _, 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
				table.insert(values, clean(k))
			end
		elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
			local knownflag = false
			for _, regexp in ipairs(regexps) do
				if mw.ustring.match(tostring(k), regexp) then
					knownflag = true
					break
				end
			end
			if not knownflag and ( showblankpos or isnotempty(v) ) then
				table.insert(values, k .. ' = ' .. clean(v))
			end
		end
	end

	-- add results to the output tables
	local res = {}
	if #values > 0 then
		local unknown_text = args['unknown'] or 'Found _VALUE_, '

		if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
			local preview_text = args['preview']
			if isnotempty(preview_text) then
				preview_text = require('Module:If preview')._warning({preview_text})
			elseif preview == nil then
				preview_text = unknown_text
			end
			unknown_text = preview_text
		end
		for _, v in pairs(values) do
			-- Fix odd bug for | = which gets stripped to the empty string and
			-- breaks category links
			if v == '' then v = ' ' end

			-- avoid error with v = 'example%2' ("invalid capture index")
			local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
			table.insert(res, r)
		end
	end

	return table.concat(res)
end

function p.check(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	return p._check(args, pargs)
end

return p