Extension:Loops

Category:Extensions without an imageCategory:Extensions without a compatibility policyCategory:GPL licensed extensions
MediaWiki extensions manual
Loops
Release status: stableCategory:Stable extensions
Implementation Parser function Category:Parser function extensions
Description Provides parser functions for performing loops
Author(s)
Latest version 0.5.2 (2019-08-05)
MediaWiki 1.34+Category:Extensions with manual MediaWiki version
PHP 5.6+
Database changes No
License GNU General Public License 2.0 or later
Download Category:Extensions in Wikimedia version control
README
RELEASE-NOTES
Example sandbox.semantic-mediawiki.org
  • $wgLoopsEnabledFunctions
  • $wgLoopsCountLimit
Quarterly downloads 53 (Ranked 66th)
Translate the Loops extension if it is available at translatewiki.net
Issues Open tasks · Report a bug
Category:All extensions

The Loops extension provides Parser functions for performing loops.

Currently, this extension is maintained on a basic level by MGChecker.

Usage

The following examples use the Variables extension and in some cases also the ParserFunctions extension.

#while

{{#while}} performs a loop (i.e. it repeatedly parses a given wiki markup block statement) so long as the condition mark-up evaluates to non-whitespace.

{{#while:
 | <<translate nowrap><!--T:28--> condition text</translate>>
 | <<translate nowrap><!--T:29--> block statement</translate>>
}}
Examples

The wiki markup:

{{#vardefine: i | 0 }}{{#while:
 | {{#ifexpr: {{#var: i }} < 5 | true }}
 | <nowiki />
* {{#var: i }}{{#vardefine: i | {{#expr: {{#var: i }} + 1 }} }}
}}

produces the following:

  • 0
  • 1
  • 2
  • 3
  • 4

{{#while}} can also be used in a template to simulate a numbered array. If the page "Template:Loops Test" contains

{{#vardefine: i | 0 }}{{#while:
 | {{{arg{{#var: i }} |}}}
 | <nowiki />
* {{{arg{{#var: i }} }}}{{#vardefine: i
   | {{#expr: {{#var: i }} + 1 }}
 }}
}}

then the wiki-markup

{{Loops Test
 |arg0=<translate nowrap><!--T:30--> zero</translate>
 |arg1=<translate nowrap><!--T:31--> one</translate>
 |arg2=<translate nowrap><!--T:32--> two</translate>
 |arg3=<translate nowrap><!--T:33--> three</translate>
 |arg4=<translate nowrap><!--T:34--> four</translate>
}}

produces

  • zero
  • one
  • two
  • three
  • four

It's important to note that whitespace, including newlines, tabs, and spaces, is stripped from the beginning and end of all the arguments of these parser functions. If this is not desirable, adding any non-whitespace characters (including the HTML encoding for a whitespace character &#32;) will prevent further stripping (hence the <nowiki> tags in the above examples).

#dowhile

{{#dowhile}} performs exactly like {{#while}}, with the exception that the block statement is guaranteed to be parsed and displayed (if it results in displayable text) at least once. This is done before the condition text is evaluated.

#loop

{{#loop: <variable name>
 | <starting value>
 | <number of loops to be performed>
 | <wiki markup>
}}

{{#loop}} repeatedly parses and displays <wiki markup> a number of times equal to the absolute value of <number of loops to be performed>. <Starting value> is placed in a variable (accessible by Variables extension's {{#var:}} parser function) using the name <variable name>. After each loop, the variable is incremented by one if <number of loops to be performed> is positive, or decremented by one if <number of loops to be performed> is negative.

From all loop functions, #loop should have the best performance since there is no condition which has to be expanded and validated for each cycle.
Examples

The following code:

{{#loop: varname
 | 4
 | 4
 | <nowiki />
* <translate nowrap><!--T:41--> This is round <tvar name=1>{{#var: varname }}</tvar> and we have <tvar name=2>{{#expr: 7 - {{#var: varname }} }}</tvar> more to go</translate>
}}

produces

  • This is round 4 and we have 3 more to go
  • This is round 5 and we have 2 more to go
  • This is round 6 and we have 1 more to go
  • This is round 7 and we have 0 more to go

#forargs ( experimental)

{{#forargs}} is to be used in templates.

It takes arguments that are passed to the template and puts them in variables accessible by Variables extension's {{#var:}} parser function.

{{#forargs: <prefix>
 | <key>
 | <value>
 | <block statement>
}}

This function iterates through each argument whose name begins with <prefix>.

With each iteration it puts the argument name minus <prefix> into <key> as if calling {{#vardefine: <key> }}.

It then takes the value of the argument and puts it into <value> in a similar method.

The block statement is then expanded.

The block statement may contain {{#var: <key> }} and {{#var: <value> }} to access the stored arguments.

Example

If the page "Template:Loops Test" contains

{{#forargs: arg
 | key
 | value
 | <nowiki />
* {{#var: key }} = {{#var: value }}
}}

then the wiki markup

{{Loops Test
 | arg1=val1
 | spam=spammity
 | arg5=val5
 | argument=value
}}

produces

  • 1 = val1
  • 5 = val5
  • ument = value

#fornumargs ( experimental)

{{#fornumargs: <key>
 | <value>
 | <block statement>
}}

{{#fornumargs}} performs similarly to {{#forargs}} with two major differences: It doesn't take a prefix argument, and it only works on numbered arguments whether they're explicitly numbered,

{{Template
 | 1=one
 | 2=two
}}

or implicitly numbered.

{{Template
 | one
 | two
}}

Mixing these methods in a single template call may cause values to get overwritten, so be careful.

Examples

If "Template:Loops Test" is edited to contain:

{{#fornumargs: number
 | value
 | <nowiki />
* {{#var: number }} = {{#var: value }}
}}

then

{{Loops Test
  | Apricot
  | B = Bolognese
  | Caramel slice
  | 5 = Eclair
}}

will result in

  • 1 = Apricot
  • 2 = Caramel slice
  • 5 = Eclair

Installation

Some of the parser functions provided by this extension require the ParserFunctions as well as the Variables extension to be installed first.
  • Download and move the extracted Loops folder to your extensions/ directory.
    Developers and code contributors should install the extension from Git instead, using:cd extensions/
    git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Loops
  • Add the following code at the bottom of your LocalSettings.php file:
    wfLoadExtension( 'Loops' );
    
  • Configure at your convenience
  • Yes Done – Navigate to Special:Version on your wiki to verify that the extension is successfully installed.

Configuration

These configuration variables have to be set in the LocalSettings.php file after the inclusion of this extension.

$egLoopsCountLimit
This parameter sets the maximum number of loops a page is allowed to perform (default 100). Setting it to -1 lets the loops run within the limits of phps environment. This parameter affects neither the {{#forargs:}} nor {{#fornumargs:}} parser functions.
$egLoopsEnabledFunctions
Configuration variable (array) to define which Loops functions should be enabled. By default, all functions are enabled if the Variables extension is installed as well. If the Variables extension is not installed, #loop, #forargs and #fornumargs will be disabled since they do not work without it being installed. To enable the #fornumargs and #forargs functions only, one can use:
$egLoopsEnabledFunctions = array_diff(
    $egLoopsEnabledFunctions, [
        'forargs', 'fornumargs'
        ]
    );

See also

Category:All extensions Category:Extensions in Wikimedia version control Category:Extensions included in BlueSpice Category:Extensions included in Canasta Category:Extensions included in Fandom Category:Extensions included in Miraheze Category:Extensions included in MyWikis Category:Extensions included in ProWiki Category:Extensions included in WikiForge Category:Extensions included in semantic::core Category:Extensions included in wiki.gg Category:Extensions with manual MediaWiki version Category:Extensions without a compatibility policy Category:Extensions without an image Category:GPL licensed extensions Category:ParserClearState extensions Category:ParserFirstCallInit extensions Category:ParserLimitReportPrepare extensions Category:Parser function extensions Category:Stable extensions