![]() | This is a documentation subpage for Module:Params. It may contain usage information, categories and other content that is not part of the original module page. |
The {{#invoke:params}}
module is designed to be adopted by those templates that want to have a deep control of their parameters. It is particularly useful to variadic templates, to which it offers the possibility to count, list, map and propagate the parameters received without knowing their number in advance.
The module offers elegant shortcuts to non variadic templates as well. Outside templates the module has virtually no applications; hence, if you plan to make experiments, make sure to do them from within a template, or you will not be able to see much.
Among the possibilities that the module offers there is that of performing a series of actions after novel arguments have been concatenated to the template's incoming parameters. As this sometimes makes it necessary to keep the argument slots clean from interferences, instead of named arguments in order to specify options this module uses piping functions (i.e. functions that expect to be piped instead of returning to the caller), or modifiers. This creates a syntax similar to the following example:
{{#invoke:params|[modifier]|[...]|[modifier]|[...]|function|[...]}}
For instance, as the name suggests, the list
function lists the parameters wherewith a template was called; if we imagined a template named {{Example template}}
containing the following wikitext,
{{#invoke:params|list|</dt><dd>|</dd><dt>|<dl><dt>|</dd></dl>}}
and such template were called with the following arguments,
| Beast of Bodmin = A large feline inhabiting Bodmin Moor.
| Morgawr = A sea serpent.
| Owlman = A giant owl-like creature.
}}
the following result would be produced:
- Beast of Bodmin
- A large feline inhabiting Bodmin Moor.
- Morgawr
- A sea serpent.
- Owlman
- A giant owl-like creature.
However, by placing the with_name_matching
modifier before the list
function we would be able to filter some parameters out – such as, for instance, all parameter names that do not end with an “n”:
{{#invoke:params|with_name_matching|n$|list|</dt><dd>|</dd><dt>|<dl><dt>|</dd></dl>}}
Thus, the previous code would produce:
- Beast of Bodmin
- A large feline inhabiting Bodmin Moor.
- Owlman
- A giant owl-like creature.
This mechanism has the intrinsic advantage that it allows to concatenate infinite modifiers. And so, in order to get the accurate result that we want to obtain we could write:
{{#invoke:params|with_name_matching|n$|with_name_matching|^A|non-sequential|with_name_matching|banana|list}}
The two modifiers sequential
and non-sequential
refer to a technical jargon used in wikitext: given a parameter list, the subgroup of sequential parameters is constituted by the largest group of consecutive numerical parameters starting from |1=
– this is known as the parameters' “sequence”. A parameter list that does not have a first parameter specified does not possess a sequence.
Functions
Here follows the list of functions. All modifiers are applicable to all of them (see § Modifiers).
count
- Brief
- Count the number of parameters whereby a template was called
- Syntax
{{#invoke:params|count}}
This function does not take arguments.
value_of
- Brief
- Get the value of a single parameter
- Syntax
{{#invoke:params|value_of|parameter name|[header]|[footer]}}
Without modifiers this function is similar to writing {{{parameter name|}}}
– with optional header and footer to be displayed only when the parameter is found. With modifiers, however, it allows to reach parameters that would be unreachable without knowing their number in advance. For instance, writing
{{#invoke:params|cutting|-2|0|value_of|1}}
will write the value of the second-last sequential parameter, independently of how many parameters the template was called with. If no matching parameter is found this function expands to nothing.
Note: The header (|2=
) and footer (|3=
) arguments are not trimmed of their leading and trailing spaces. The value_of
function name itself and the parameter name (|1=
), on the other hand, will be trimmed of their surrounding spaces.
list
- Brief
- List the template parameters (both their names and their values)
- Syntax
{{#invoke:params|list|[key-value separator]|[argument separator]|[header]|[footer]}}
If no arguments are passed the vertical bar (|
) will be used as parameter separator and the equals sign (=
) will be used as key-value separator, with no header and no footer.
Note: All arguments passed to this function are not trimmed of their leading and trailing spaces. The list
function name itself, however, can be surrounded by spaces.
list_values
- Brief
- List the template parameter values
- Syntax
{{#invoke:params|list_values|[argument separator]|[header]|[footer]}}
If no arguments are passed the vertical bar (|
) will be used as parameter separator, with no header and no footer.
Note: All arguments passed to this function are not trimmed of their leading and trailing spaces. The list_values
function name itself, however, can be surrounded by spaces.
concat_and_call
- Brief
- Prepend user-given numerical arguments to the current parameters, or impose user-given non-numerical arguments; then propagate everything to a custom template
- Syntax
{{#invoke:params|concat_and_call|template name|[prepend 1]|[prepend 2]|[...]|[prepend n]|[named item 1=value 1]|[...]|[named item n=value n]|[...] }}
For example, if our {{Example template}}
had the following code,
{{#invoke:params|concat_and_call|foo bar|elbow|earth|room|7=classy|hello=not today}}
and were called with,
the following call to the {{Foo bar}}
template would be performed:
| elbow
| earth
| room
| 7 = classy
| 8 = one
| 9 = two
| 10 = three
| wind = spicy
| hello = not today
}}
If no other argument besides the template name are provided this function simply echoes the current parameters to another template.
Note: All arguments passed to this function except the template name are not trimmed of their leading and trailing spaces. The concat_and_call
function name itself, however, can be surrounded by spaces.
concat_and_invoke
- Brief
- Prepend user-given numerical arguments to the current parameters, or impose user-given non-numerical arguments; then propagate everything to a custom module
- Syntax
{{#invoke:params|concat_and_invoke|module name|function name|[prepend 1]|[prepend 2]|[...]|[prepend n]|[named item 1=value 1]|[...]|[named item n=value n]|[...] }}
Exactly like concat_and_call
, but invokes a module instead of calling a template.
Note: All arguments passed to this function except the module name and the function name are not trimmed of their leading and trailing spaces. The concat_and_invoke
function name itself, however, can be surrounded by spaces.
call_for_each
- Brief
- For each parameter passed to the caller template, call a custom template with at least two parameters (key and value)
- Syntax
{{#invoke:params|call_for_each|template name|[append 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param n=value n]|[...] }}
All other unnamed parameters following the template name will be appended to the key-value pair. Named parameters will be passed verbatim.
Calling a template for each key-value pair with
{{#invoke:params|sequential|call_for_each|foobar}}
will be more efficient than writing
{{#invoke:params|sequential|for_each|{{foobar|$#|$@}}}}
Furthermore, in the second example the $#
and $@
tokens will be expanded after the template has been called. In most cases this will make no difference, however there are several cases where it will lead to nonsensical results.
Note: All arguments passed to this function except the template name are not trimmed of their leading and trailing spaces. The call_for_each
function name itself, however, can be surrounded by spaces.
invoke_for_each
- Brief
- For each parameter passed to the caller template, invoke a custom module function with at least two arguments (key and value)
- Syntax
{{#invoke:params|invoke_for_each|module name|module function|[append 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param n=value n]|[...]}}
Exactly like call_for_each
, but invokes a module instead of calling a template.
Invoking a module function for each key-value pair with
{{#invoke:params|sequential|invoke_for_each|foobar|main}}
will be more efficient than writing
{{#invoke:params|sequential|for_each|{{foobar|main|$#|$@}}}}
Furthermore, in the second example the $#
and $@
tokens will be expanded after the module function has been called. In most cases this will make no difference, however there are several cases where it will lead to nonsensical results.
Note: All arguments passed to this function except the module name and the function name are not trimmed of their leading and trailing spaces. The invoke_for_each
function name itself, however, can be surrounded by spaces.
call_for_each_value
- Brief
- For each parameter passed to the caller template, call a custom template with at least one parameter (i.e. the parameter's value)
- Syntax
{{#invoke:params|call_for_each_value|template name|[append 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param n=value n]|[...]}}
All other unnamed parameters following the template name will be appended after the value parameter. Named parameters will be passed verbatim.
Calling a template for each value with
{{#invoke:params|sequential|call_for_each_value|foobar}}
will be more efficient than writing
{{#invoke:params|sequential|for_each|{{foobar|$@}}}}
Furthermore, in the second example the $@
token will be expanded after the template has been called. In most cases this will make no difference, however there are several cases where it will lead to nonsensical results.
Note: All arguments passed to this function except the template name are not trimmed of their leading and trailing spaces. The call_for_each_value
function name itself, however, can be surrounded by spaces.
invoke_for_each_value
- Brief
- For each parameter passed to the caller template, invoke a custom module function with at least one argument (i.e. the parameter's value)
- Syntax
{{#invoke:params|invoke_for_each_value|module name|module function|[append 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param n=value n]|[...]}}
Exactly like call_for_each_value
, but invokes a module instead of calling a template.
Invoking a module function for each value with
{{#invoke:params|sequential|invoke_for_each_value|foobar|main}}
will be more efficient than writing
{{#invoke:params|sequential|for_each|{{#invoke|foobar|main|$@}}}}
Furthermore, in the second example the $@
token will be expanded after the module function has been invoked. In most cases this will make no difference, however there are several cases where it will lead to nonsensical results.
Note: All arguments passed to this function except the module name and the function name are not trimmed of their leading and trailing spaces. The invoke_for_each_value
function name itself, however, can be surrounded by spaces.
for_each
- Brief
- For each parameter passed to the caller template, expand all occurrences of
$#
and$@
within a given text as key and value respectively - Syntax
{{#invoke:params|for_each|wikitext|[header]|[footer]}}
Example:
{{#invoke:params|for_each|Arg name: $#, Arg value: $@}}
Note: All arguments passed to this function are not trimmed of their leading and trailing spaces. The for_each
function name itself, however, can be surrounded by spaces.
Modifiers (piping functions)
The following are modifiers, i.e. functions that expect to be piped instead of returning to the caller. Each of them can be followed by either another modifier or a non-piping function.
sequential
- Brief
- Reduce the parameter list to the subgroup of consecutive parameters that follow
|1=
- Syntax
{{#invoke:params|sequential|pipe function name}}
Example:
{{#invoke:params|sequential|count}}
This modifier does not take arguments besides the name of the function that will follow.
Using sequential
together with non-sequential
will generate an error.
non-sequential
- Brief
- Reduce the parameter list by subtracting the subgroup of consecutive parameters that follow
|1=
- Syntax
{{#invoke:params|non-sequential|pipe function name}}
Example:
{{#invoke:params|non-sequential|list|{{=}}|{{!}}|<nowiki>{{</nowiki>foobar{{!}}|<nowiki>}}</nowiki>}}
This modifier does not take arguments besides the name of the function that will follow.
Using non-sequential
together with sequential
will generate an error.
cutting
- Brief
- Remove zero or more parameters from the beginning and the end of the parameter list
- Syntax
{{#invoke:params|cutting|left trim|right trim|pipe function name}}
The first argument indicates how many sequential parameters must be removed from the beginning of the parameter list, the second argument indicates how many sequential parameters must be removed from the end of the parameter list. If any of the two arguments is a negative number its absolute value indicates what must be left on the other side – i.e. {{#invoke:params|cutting|-3|0|list}}
indicates that the last three arguments must be listed.
Example:
{{#invoke:params|cutting|0|2|sequential|call_for_each_value|example template}}
In some cases it might be necessary to concatenate more than one invocation of the cutting
function. For instance, notice the |cutting|1|0|cutting|-1|0
code in the following imaginary {{Foobar see also}}
template in order to properly show the “and” conjunction and possibly an Oxford comma when more than two page names are provided:
{{Hatnote|{{{altphrase|Foobar see also}}}: {{#if:{{{1|}}}
|[[{{{1}}}]]{{#invoke:params|sequential|cutting|1|1|for_each|, [[$@]]}}{{#invoke:params|sequential|cutting|1|0|cutting|-1|0|for_each| and [[$@]]|{{#if:{{{3|}}}|,}}}}
|{{Error|{{tl|Foobar see also}} requires at least one page name}}
}}
}}
Suggestion: Although {{#invoke:params|cutting|-1|1|...}}
de facto gets rid of all sequential parameters, it is clearer and more idiomatic to write {{#invoke:params|non-sequential|...}}
to obtain the same effect. Writing {{#invoke:params|sequential|cutting|-1|1|...}}
will leave zero arguments to show.
with_name_matching
- Brief
- Remove from the parameter list all the parameters whose name does not match the given pattern
- Syntax
{{#invoke:params|with_name_matching|pattern|pipe function name}}
Internally this modifier uses Lua's string.find()
function to find whether parameter names match against a given pattern. For the pattern argument (|1=
) please use the same syntax of Lua patterns.
Example:
{{#invoke:params|with_name_matching|n$|list|</dt><dd>|</dd><dt>|<dl><dt>|</dd></dl>}}
Note: The argument passed to this function is not trimmed of its leading and trailing spaces. The with_name_matching
function name itself, however, can be surrounded by spaces.
with_name_not_matching
- Brief
- Remove from the parameter list all the parameters whose name matches the given pattern
- Syntax
{{#invoke:params|with_name_not_matching|pattern|pipe function name}}
Internally this modifier uses Lua's string.find()
function to find whether parameter names match against a given pattern. For the pattern argument (|1=
) please use the same syntax of Lua patterns.
Example:
{{#invoke:params|with_name_not_matching|n$|count}}
It is possible to use this function to check for unknown parameters:
{{#ifexpr:{{#invoke:params|with_name_not_matching|^hello$|with_name_not_matching|^wind$|count}} > 0
|{{#invoke:Error|error|Error: The only parameters accepted are {{para|hello}} and {{para|wind}}.}}
|Everything is good: do something
}}
For simple cases like this, however, specialized modules are available; you might want to have a look at:
- {{#invoke:Check for unknown parameters|check}}
- {{#invoke:Check for deprecated parameters|check}}
- {{#invoke:Check for clobbered parameters|check}}
- {{#invoke:Parameter validation|function}}
- {{#invoke:TemplatePar|function}}
Note: The argument passed to this function is not trimmed of its leading and trailing spaces. The with_name_not_matching
function name itself, however, can be surrounded by spaces.
with_value_matching
- Brief
- Remove from the parameter list all the parameters whose value does not match the given pattern
- Syntax
{{#invoke:params|with_value_matching|pattern|pipe function name}}
Internally this modifier uses Lua's string.find()
function to find whether parameter values match against a given pattern. For the pattern argument (|1=
) please use the same syntax of Lua patterns.
Example:
{{#invoke:params|with_value_matching|n$|count}}
Note: The argument passed to this function is not trimmed of its leading and trailing spaces. The with_value_matching
function name itself, however, can be surrounded by spaces.
with_value_not_matching
- Brief
- Remove from the parameter list all the parameters whose value matches the given pattern
- Syntax
{{#invoke:params|with_value_not_matching|pattern|pipe function name}}
Internally this modifier uses Lua's string.find()
function to find whether parameter values match against a given pattern. For the pattern argument (|1=
) please use the same syntax of Lua patterns.
Example:
{{#invoke:params|with_value_not_matching|n$|count}}
Note: The argument passed to this function is not trimmed of its leading and trailing spaces. The with_value_not_matching
function name itself, however, can be surrounded by spaces.
See also
- {{#invoke:TemplatePar|function}}
- {{#invoke:ParameterCount|function}}
- {{#invoke:Check for unknown parameters|check}}
- {{#invoke:Check for deprecated parameters|check}}
- {{#invoke:Check for clobbered parameters|check}}
- {{#invoke:Parameter validation|function}}
- {{#invoke:Expand wikitext|main}}
- {{#invoke:Separated entries|main}}
- Project:TemplateData