Template:Ifnotempty

From EVE RP Wiki
Revision as of 11:45, 27 July 2010 by rp>Patrick (copied from Template:If, to be changed into a version specific to ifnotempty to reduce expansion depth)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Documentation

Script error: No such module "Template translation". With this template the parser functions of Extension:ParserFunctions 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. For evaluating the condition spaces and newlines are stripped like with ParserFunctions.

Usage

Compare:

  • 3 parameters:
    • {{#if:x| p | q }} gives "p"
    • {{#ifexpr:2<3| p | q }} gives "p"
    • {{#ifexist: Help:Link | p | q }} gives "q"
    • {{#iferror:<span class="error">x</span>| p | q }} gives "p"
    • {{#iferror: 7 | p | q }} gives "q"
    • {{#iferror: 7 | p | }} gives ""
    • {{#iferror: 7 | p |}} gives ""
    • {{#iferror: 7 | p }} gives "7"
  • 4 parameters:
    • {{#ifeq: u |u| p | q }} gives "p"

Note that, unlike parser functions, templates require writing equals signs in values of unnamed parameters as {{=}}

For full substitution, simply use Template:Cnw or Template:Cnw. If the condition contains a parser function, template, or variable, that should be substituted too. Optionally the "then" or "else" part can also be substituted.

Error messages (examples):

  • {{if|expr|1234>e3|1|0}} gives Template:If
  • {{#ifexpr:1234>e3|1|0}} gives Expression error: Unexpected number.

Expansion depth limit

7 levels allowed:

{{if||x|{{if||x|{{if||x|{{if||x|{{if||x|{{if||x|{{if||x|a}}}}}}}}}}}}}} gives Template:If

{{if||x|{{if||x|{{if||x|{{if||x|{{if||x|{{if||x|{{if||x|{{if||x|a}}}}}}}}}}}}}}}} gives Template:If

{{if||||{{if||||{{if||||{{if||||{{if||||{{if||||{{if||||a}}}}}}}}}}}}}} gives Template:If

{{if||||{{if||||{{if||||{{if||||{{if||||{{if||||{{if||||{{if||||a}}}}}}}}}}}}}}}} gives Template:If

{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|a}}}}}}}}}}}}}} gives Template:If

{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|{{if|expr|1|a}}}}}}}}}}}}}}}} gives Template:If

To allow more levels there is a separate Template:Ifexpr.

Internal technical details

For evaluating the condition the template uses the actual parser functions; however, not directly with p and q, because this strips spaces and newlines from them, but with index values 1 and 2. The result can be 1, 2, or, only in the case of #ifexpr, an error message. Using a switch these are converted to p1, p2, and if/errmsg, respectively. The template with the applicable name is called (Template:P1, Template:P2, or Template:If/errmsg), with as parameters p, q, and {{{2}}}. Templates p1 and p2 ignore {{{2}}}; template if/errmsg is only called in the case of #ifexpr, in the case of a wrong expression {{{2}}}; it ignores p and q and uses {{{2}}} for display in the error message.

Conditions

#if:

Condition: string not empty.

#ifexist:

Condition: page exists (applies also to special pages).

The usual case-sensitivity applies: if a page exists then also a non-canonical name for that page gives a positive result.

Template:Exists gives the same result, except that the result is positive for an interwiki link. You can also handle an interwiki link differently with Template:If interwiki link.

The page A checking existence of page B is listed on Special:Whatlinkshere/B as a page which links to B.

On Wikimedia wikis there is a maximum for the number of distinct pages for which #ifexist is called on a page. A call of #ifexist after a transclusion of the same page does not require an extra database query and is therefore not counted. A call beyond the maximum returns "false". The html-source of each page shows the counted number of calls, as well as the maximum. The maximum is currently 500, see w:Wikipedia:Template limits#Expensive parser function calls.

#ifexpr:

Condition: non-zero.[1]

Empty gives false. Other strings which are not correct numerical or Boolean expressions give an error message[2]:

16 	'pfunc_expr_stack_exhausted' => 'Expression error: Stack exhausted',
17 	'pfunc_expr_unexpected_number' => 'Expression error: Unexpected number',
18 	'pfunc_expr_preg_match_failure' => 'Expression error: Unexpected preg_match failure',
19 	'pfunc_expr_unrecognised_word' => 'Expression error: Unrecognised word "$1"',
20 	'pfunc_expr_unexpected_operator' => 'Expression error: Unexpected $1 operator',
21 	'pfunc_expr_missing_operand' => 'Expression error: Missing operand for $1',
22 	'pfunc_expr_unexpected_closing_bracket' => 'Expression error: Unexpected closing bracket',
23 	'pfunc_expr_unrecognised_punctuation' => 'Expression error: Unrecognised punctuation character "$1"',
24 	'pfunc_expr_unclosed_bracket' => 'Expression error: Unclosed bracket',
25 	'pfunc_expr_division_by_zero' => 'Division by zero',
26 	'pfunc_expr_invalid_argument' => 'Invalid argument for $1: < -1 or > 1',
27 	'pfunc_expr_invalid_argument_ln' => 'Invalid argument for ln: <= 0',
28 	'pfunc_expr_unknown_error' => 'Expression error: Unknown error ($1)',
29 	'pfunc_expr_not_a_number' => 'In $1: result is not a number',

#iferror:

Condition: contains class="error" as attribute of <strong>, <span>, <p>, or <div> tags.[3]

These are generated by #expr, #ifexpr, #time, #rel2abs, some other MediaWiki situations (such as recursive depth and template loop checks), and this template.

If the error condition does not apply and there is no "else" part, the function gives the input wikitext.

#ifeq:

Condition: equal as strings (case-sensitive) or numbers.[4]

  • {{if|eq| 1e3 | 1000 | 1 | 0 }} gives "Template:If".
  • {{#ifeq: 1e3 | 1000 | 1 | 0 }} gives "1".

To force a string-based comparison, add a non-numerical character to both compared arguments.

  • {{if|eq| x1e3 | x1000 | 1 | 0 }} gives "Template:If".
  • {{#ifeq: x1e3 | x1000 | 1 | 0 }} gives "0".

If desired, trim the arguments before adding this non-numerical character, for example with {{#if:x|..}}.

Text between <nowiki> tags is temporarily replaced by a unique code. This affects comparisons:

  • {{if|eq|<nowiki>abc</nowiki> | <nowiki>abc</nowiki> | 1 | 0 }} gives "Template:If".
  • {{#ifeq:<nowiki>abc</nowiki> | <nowiki>abc</nowiki> | 1 | 0 }} gives "0".

See also

  1. Expr.php
  2. ParserFunctions.i18n.php
  3. ParserFunctions_body.php
  4. #ifeq: uses the PHP comparison operator ==.[1]