This is a documentation subpage for Template:If. It contains usage information, categories and other content that is not part of the original template page. |
This template is used on 134,000+ pages. To avoid major disruption and server load, any changes should be tested in the template's /sandbox or /testcases subpages, or in your own user subpage. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
With this template the parser functions of the ParserFunctions collection with names starting with "#if" can be used in a way such that they do not strip spaces and newlines from the "then" and "else" part. Spaces still do not affect the outcome of the condition. Parameter 1 selects the if-type as "eq", "expr", "exist" or "error" (for #iferror), or empty "||" for a simple if-there (for #if). The template can be repeatedly nested 6 or 7 levels, one inside the other, because the outer-most is completed before running either the then/else inner levels.
This template can be substituted, when the expression or comparison will not change. Functionally, a lead-space character is stored, internally, as a simple blank character. Note, in many cases a null nowiki tag ("<nowiki/>") could be used, without Template:If, to allow a lead-space (such as "<nowiki/> xx") anywhere, but the internal storage puts a 43-character marker for "<nowiki/>" in string length. However, there is no extra expansion depth for a nowiki-tag, such as in trailing space, "zz <nowiki/>".
Usage
Where p is implemented in affirmation of the statement and q is implemented in negation of the statement
- <syntaxhighlight lang="text" inline> p </syntaxhighlight> gives " p ". Notice the pair of vertical bars surrounding the empty first parameter.
- <syntaxhighlight lang="text" inline> p </syntaxhighlight> gives " p "
- <syntaxhighlight lang="text" inline> p </syntaxhighlight> gives " p "
- <syntaxhighlight lang="text" inline> q </syntaxhighlight> gives " q "
- <syntaxhighlight lang="text" inline> p </syntaxhighlight> gives " p "
Compare:
- <syntaxhighlight lang="text" inline>p</syntaxhighlight> gives "p"
- <syntaxhighlight lang="text" inline>p</syntaxhighlight> gives "p"
- <syntaxhighlight lang="text" inline>p</syntaxhighlight> gives "p"
- <syntaxhighlight lang="text" inline>q</syntaxhighlight> gives "q"
- <syntaxhighlight lang="text" inline>p</syntaxhighlight> gives "p"
For example, with a template named Template:Template name containing the code <syntaxhighlight lang="text" inline>q</syntaxhighlight>, entering the code <syntaxhighlight lang="text" inline>parameter=u</syntaxhighlight> into an article gives "p", but <syntaxhighlight lang="text" inline>parameter=v</syntaxhighlight> gives "q".
The text of either the then-clause or else-clause is only processed and expanded when triggered. Hence, any templates in use are only expanded once the then-clause or else-clause is matched, otherwise they are skipped as merely paired braces, "{{" with "}}".
Indentation
If indenting the markup, care must be taken to avoid extra newlines when indenting "}}" on the next line. An extra bar pipe "|" can be added after the else-clause to complete that text, and allow "}}" to then be placed anywhere without adding a newline into the else-clause. For example:
- <syntaxhighlight lang="text">{{ safesubst:p{{ safesubst:#if
:then found parameter 1|1|2}}|else no parameter 1| ← extra "}}</syntaxhighlight >
When the else-clause is indented to the next line, a newline (CR/LF) is added:
- <syntaxhighlight lang="text">{{ safesubst:p{{ safesubst:#if
:then found parameter 1 ← extra newline here |1|2}}|else noparameter 1|
}}</syntaxhighlight>
To indent the else-clause, split an HTML-form comment, as "<!--
" with next line as "-->|else...
". Unless each then-clause and else-clause is carefully tested, to watch for extra newlines, then the results are likely to cause broken lines, with extra line breaks for each newline. For that reason, a global edit with simple search-and-replace of "{#if:
" to "{if||
" is likely to leave newline problems, wherever the original markup was wrapped to indent either the else-clause or "}}" of each if-structure. Indenting the then-clause is not a problem.
Performance considerations
Because Template:If must prepare the parameters for #if, #ifeq, #ifexpr,
(etc.) there is a slight overhead when using it. It has been timed to run at speeds of 290 instances per second, so 29 uses would take only 0.1 s, a tenth of a second to run, to make 29 comparisons. Each nested use adds 5 levels to the template expansion depth, so 7 nested if-templates would use 35 levels (5*7) of the 41-level limit.
Using P-if syntax: A similar if-structure can be coded without Template:If, by using the {{P1}}
and {{P2}}
templates in a "P-if" structure. Template:P1 always returns parameter 1, and P2 returns the 2nd. So, a comparison of 4 versus 3 can be coded using P-if syntax form:
- Example of
#ifexpr
: <syntaxhighlight lang="text" inline>" then 4 greater"</syntaxhighlight> - Result for
#ifexpr
: " then 4 greater" ← the comparison invoked {{P1}}.
- Example of
The expansion depth of a P-if is only 4 levels deep, but nesting of the then-clause or else-clause might be more confusing than using nested levels of Template:if.
- Example of
#if
: <syntaxhighlight lang="text" inline>" then {2} set"</syntaxhighlight> - Result for
#if
: " else {2} empty" ← the comparison invoked {{P2}}.
- Example of
See also
- m:Template:If
- Template:Ifnotempty - for simplicity and to reduce the limitations due to the expansion depth limit, this is a separate template corresponding to #if only.
- Template:Switch, for a default result
- Help:Conditional expressions