8,705 bytes added
, 4 years ago
{{documentation subpage}}
{{Lua|Module:For}}
== Description ==
The template calls a specified template up to 150 times, where one parameter takes each of a list of values; in addition to the variable parameter, for up to 4 parameters a fixed value can be specified.
== Usage ==
(Note the change for the constant values.)
<pre>
{{for
|call=template to call (default: 1x)
|what to separate the entries with (unnamed parameter; required, but can be the empty string)
|pc1n=name of first parameter with constant value (default: the value of parameter u)
|pc1v=first constant value (default: empty)
|pc2n=name of second parameter with constant value (default: the value of parameter u)
|pc2v=second constant value (default: empty)
|pc3n=name of third parameter with constant value (default: the value of parameter u)
|pc3v=third constant value (default: empty)
|pc4n=name of fourth parameter with constant value (default: the value of parameter u)
|pc4v=fourth constant value (default: empty)
|pc5n=name of fifth parameter with constant value (default: the value of parameter u)
|pc5v=fifth constant value (default: empty)
|pv=name of variable parameter (default: 1)
|prefix=constant first part of the value of pv (default: empty)
|postfix=constant last part of the value of pv (default: empty)
|list of 0 to 150 parameter values (without prefixes and postfixes), with separator "|"
(empty parameter values work in the regular way, they are ''not'' ignored like undefined ones)
|u=name of a parameter that is not used in template ''call'' (default: empty; see also below)
}}
</pre>
The separator is unnamed, allowing it to start and/or end with [[Help:newlines and spaces|newlines and spaces]]. This parameter should be put before the list. If a parameter value in the list contains an equals sign the list should use named parameters, at least from that point, where it should be noted that e.g. the third item in the list is parameter 4, because parameter 1 is the separator. If the separator contains an equals sign then represent it with <nowiki>{{=}}</nowiki>, see {{tim|1==}}.
==Examples==
{| class="wikitable", border=1
!Code
!Result
|-
|
<pre>1{{for|, 1|00|01|02|03|04|05|06|07|08|09
|10|11|12|13|14|15|16|17|18|19
|20|21|22|23|24|25|26|27|28|29
|30|31|32|33|34|35|36|37|38|39
|40|41|42|43|44|45|46|47|48|49
|50|51|52|53|54|55|56|57|58|59
|60|61|62|63|64|65|66|67|68|69
|70|71|72|73|74|75|76|77|78|79
|80|81|82|83|84|85|86|87|88|89
|90|91|92|93|94|95|96|97|98|99
|call=1x
}}</pre>
|1{{for|, 1|00|01|02|03|04|05|06|07|08|09
|10|11|12|13|14|15|16|17|18|19
|20|21|22|23|24|25|26|27|28|29
|30|31|32|33|34|35|36|37|38|39
|40|41|42|43|44|45|46|47|48|49
|50|51|52|53|54|55|56|57|58|59
|60|61|62|63|64|65|66|67|68|69
|70|71|72|73|74|75|76|77|78|79
|80|81|82|83|84|85|86|87|88|89
|90|91|92|93|94|95|96|97|98|99
|call=1x
}}
|}
Note that the last part of the separator is used as a prefix; the first prefix needs to be put separately.
----
<nowiki>{{for|-|a|3||c|g}}</nowiki> gives
{{for|-|a|3||c|g}}
<nowiki>{{for|-|a|3||c|g|call=3x}}</nowiki> using {{tim|3x}} gives
{{for|-|a|3||c|g|call=3x}}
<nowiki>{{for|</nowiki>
<nowiki>|a|3||c|g|call=3x}}</nowiki> gives
{{for|
|a|3||c|g|call=3x}}
<pre>
{|class="wikitable sortable"
|-
!Test
|-
| {{for|
{{!}}-
{{!}} |a|b|c|d|e|call=3x}}
|}
</pre>
gives:
{|class="wikitable sortable"
|-
!Test
|-
| {{for|
{{!}}-
{{!}} |a|b|c|d|e|call=3x}}
|}
Using {{tim|table row example}},
<pre>
{| class="wikitable sortable"
|-
!number!!reciprocal
|-
| {{for|
{{!}}-
{{!}} |call=table row example|3|1|5|3|2}}
|}
</pre>
gives
{| class="wikitable sortable"
|-
!number!!reciprocal
|-
| {{for|
{{!}}-
{{!}} |call=table row example|3|1|5|3|2}}
|}
----
<nowiki>{{for| / |call=short DOW|3|1|5|3|2}}</nowiki> using {{tim|short DOW}} gives
:{{for| / |call=short DOW|3|1|5|3|2}}
----
<nowiki>{{for|; |call=t2|pc1n=2|pc1v=constant|abc|def|ghi|postfix=pof}}</nowiki> using {{tim|t2}} gives:
{{for|; |call=t2|pc1n=2|pc1v=constant|abc|def|ghi|postfix=pof}}
----
<nowiki>{{for|, |call=concat and link to w:en:|pc1n=1|pc1v=John_|pv=2||Lennon|Wayne}}
</nowiki> using {{timc|concat and link to w:en:}} gives {{for|, |call=concat and link to w:en:|pc1n=1|pc1v=John_|pv=2||Lennon|Wayne}}
A for-call can give a row or column of choice, see e.g. [[Template:Power]].
A constant parameter is ignored if it is the same as the (implicitly or explicitly given) variable parameter:
<nowiki>{{for|; |call=t2|pc1n=1|pc1v=7|pc2n=2|pc2v=5|abc|def|ghi}}</nowiki> using {{tim|t2}} gives:
{{for|; |call=t2|pc1n=1|pc1v=7|pc2n=2|pc2v=5|abc|def|ghi}}
----
Using {{tim|plus square}}, <nowiki>{{#expr:{{for||call=plus square|pv=1|1|2|3|4|5}}}}</nowiki> gives {{#expr:{{for||call=plus square|pv=1|1|2|3|4|5}}}}.
Semi-recursive: see [[Template talk:Foreach/recursion]]
==Value "undefined"==
If a value in the list of values is "undefined" this value is ignored, just like the unused parameters at the end if there are less than 150 values (see also below):
<code><nowiki>{{for|-|a|3|undefined|c|g|call=3x}}</nowiki></code> gives {{for|-|a|3|undefined|c|g|call=3x}}
==Substitution==
For successive levels of substitution use one or more or the following (the first, the first two, the first three, or all)
*substf=subst: - substitute the parser functions in {{tim|for}}
*substfa=subst: - substitute the call of auxiliary {{tim|for/aux}}
*substa=subst: - substitute the parser functions in for/aux (reduces the number of items from 150 to the actual number)
*substfa=subst: - substitute the calls of the user template
If at least the first three are applied, and the separator contains <nowiki>{{!}}</nowiki>, one can replace it with <nowiki>{{subst:!}}</nowiki> to substitute that too.
For full substitution [[Special:ExpandTemplates]] can also be used.
==Internal technical details==
:''The following needs updating: functionality has been replaced with Lua-module.''
<s>The template calls [[Template:For/aux]].</s> It is necessary for avoiding a newline if the separator starts with one of the characters "#&:;" (In particular the semicolon is a likely character to be at the start of the separator.) This is because of the [[Help:Newlines_and_spaces#Automatic_newline|automatic newline]] if the separator is produced by a template or parser function. Even the workaround of moving the previous item into the then- and else parts would not work in the case that that item is empty. What remains is the workaround of using a parameter tag with the separator as default, and a conditional parameter name which expands to the name of an undefined parameter if the separator is needed (i.e., there is another item), and otherwise expanding to the name of a parameter having the empty string as value. To avoid that users of the template have to put "empty=" as parameter, which would bother them with an internal technical problem, the auxiliary Template:For/aux with this "empty=" is needed. All parameters of Template:for have to be passed on to Template:For/aux.
In addition:
*Undefined parameters in the list are given the value "undefined".<ref>Alternatively the undefinedness could have been preserved, see [[Help:Template#A parameter value depending on parameters]].</ref>
*Other undefined parameters are given their default value.
Pipes and equals signs cannot be conditional inside a template call, they only work if they are explicit. To avoid writing out six template calls, one for each number of parameters with constant value (zero through five), a default is used for the names of these parameters. This default name is the value of parameter u and should not be used by template ''call'', or if it is used, it should be used in such a way that empty and undefined are treated equally, because the default for the values of the parameters with constant value is the empty string, and one may assume that if no name is specified for a parameter with constant value, no corresponding value is specified either. Note that "using a parameter" includes having a parameter tag with a parameter name that is chosen to be one not intended to occur in any call of the template, as is sometimes done for technical reasons. Such designs can make "unlikely" parameter names such as the empty string more likely. Thus the parameter u can be useful. The default value of u is the empty string, not only because it might be unlikely, but also because it minimizes the wikitext on substitution.
==See also==
*{{tim|foreach}}
*{{tim|tblb}}
*{{tiw|for loop}}
*{{tiw|loop}}
*[[mw:Template:Fe]]
*[[Help:Parameter default]]
*[[Help:Array]]
*[[mw:Extension:LoopFunctions]]
{{refs}}
<includeonly>[[Category:Repetition templates]]</includeonly>