Extension:LoopFunctions
![]() Release status: stable |
|
---|---|
Implementation | Parser function |
Description | Provides limited looping functionality in wikitext |
Author(s) | |
Latest version | 2020-03-26 |
MediaWiki | 1.35+ |
PHP | 5.3+ |
Database changes | No |
License | GNU General Public License 2.0 or later |
Download | |
Translate the LoopFunctions extension if it is available at translatewiki.net | |
The LoopFunctions extension will enable limited looping functionality in the wikitext, where a variable ($n$ by default) is replaced by the current iteration number of the loop. The variable can be used in a plain text or link. Also the result of the whole loop can be put in an expression, e.g. to compute a factorial. However, the loop body is evaluated before replacing the variable, so e.g. a computation inside the loop body, depending on the value of the variable, is not possible.
Per standard the number of iterations is limited to 100 iterations per session.
Functions[edit]
#for[edit]
{{ #for:n | text
}} {{ #for:n | text | replacement parameter
}}
where n is the count of iteration and the text is the text to be repeated. If, after expansion of templates, parser functions, and variables, the text contains the text $n$ or what is defined by the third parameter, that will be replaced by the current iteration, starting with 1.
Examples[edit]
calling the template {{ foo: |n=4 | list1=a | list2=b | list3=c | list4=d
}}
using the template foo, containing: {{ #for: {{{n}}} | {{{list$n$}}}<br/>
}}
will result in the text
a<br/>b<br/>c<br/>d<br/>
- Sum of squares 1^2 through 5^2: {{#expr:{{#for:5|+$n$*$n$}}}} gives 55.
- Factorial 6 (6!): {{#expr:1{{#for:6|*$n$}}}} gives 720.
Compare, using m:Template:for and m:Template:plus square: {{#expr:{{for|call=plus square|pv=1|1|2|3|4|5}}}} gives 55.
For a list of squares it seems that we can only use "for", not "#for".
Limitation[edit]
In the loop body, templates, parser functions, and variables are expanded before replacing the index variable by its values.
Examples:
Parameter of a parser function depending on the index variable:
- {{#for:3|{{lc:Ab$n$}} }} gives ab1ab2ab3; the result is in this case the same as when the repetition was done first, and then the evaluation of each item.
- {{#for:3|{{uc:Ab$n$}} }} gives AB$N$AB$N$AB$N$; the result is in this case not the same, because $n$ is changed to $N$, and therefore not treated as index variable.
- Applying #expr to an expression containing the index variable does not work: expansion of #expr in e.g. {{#expr:2*$n$}} gives the text "Expression error: Unrecognised punctuation character "$"", so this text will be repeated.
Template name depending on the index variable:
- {{#for:3|{{a$n$}} }} gives:
- if the template with the literal name Template:a$n$ does not exist: Template:a1 Template:a2 Template:a3 (the loop body is evaluated as Template:a$n$, after which the loop function repeats that, substituting $n$).
- if the template with the literal name Template:a$n$ does exist: the result of {{a$n$}}{{a$n$}}{{a$n$}}, i.e., the content is repeated unchanged.
Limitation in combination with Extension:Variables[edit]
Within the loop a variable can be assigned a value depending on the loop variable, and the value of this variable can be retrieved.
However, it seems that within the loop the variable cannot be assigned a new value depending on its own current value. Instead the value on entering the loop is taken.
#foreach[edit]
{{ #foreach:mask | text
}} {{ #foreach:mask | text | replacement parameter
}}
The mask is a string in the format prefix$n$suffix where $n$ can be changed via the replacement parameter. The function #foreach, called inside a template, will produce the text for $n$ = 1, 2, 3,... as long as prefix$n$suffix is a template parameter defined in the template call. If the text contains the text $n$ or what is defined by the third parameter, that will be replaced by the current value of $n$.
It seems that the whole call of #foreach is ignored if the loop body contains a template call or a parser function call, or if the loop body does not contain {{{$n$}}}.
Examples[edit]
Calling the template {{foo|foo2_bar=a | foo1_bar=b | a=12 | 6 |foo4_bar=c}}
using the template foo, containing: {{ #foreach: foo$n$_bar | foo$n$_bar = {{{foo$n$_bar}}}<br/>
}}
will result in the expanded wikitext
foo1_bar = b<br/>foo2_bar = a<br/>
and hence the output
foo1_bar = b
foo2_bar = a
Since foo3_bar is not defined, foo4_bar is not listed either; neither are a and 1, the parameter names which exist but do not match the pattern.
Example without prefix or suffix:
The call {{showpars | abc | de | w=fgh | ijk }} of Template:Showpars containing {{ #foreach: $n$ | $n$ = {{{$n$}}}<br/> }} gives:
1 = abc
2 = de
3 = ijk
Content of a template that links to the pages given by the values of the unnamed parameters:
{{#foreach:$n$|[[{{{$n$}}}]]<nowiki> </nowiki>}}
Installation[edit]
- Download and place the file(s) in a directory called
LoopFunctions
in yourextensions/
folder. - Add the following code at the bottom of your
LocalSettings.php
:wfLoadExtension( 'LoopFunctions' );
Done – Navigate to Special:Version on your wiki to verify that the extension is successfully installed.
To users running MediaWiki 1.30 or earlier:
The instructions above describe the new way of installing this extension using wfLoadExtension()
.
If you need to install this extension on these earlier versions (MediaWiki 1.30 and earlier), instead of wfLoadExtension( 'LoopFunctions' );
, you need to use:
require_once "$IP/extensions/LoopFunctions/LoopFunctions.php";