.
Template:Ifexpr
With this template #ifexpr can be used in a way such that it does not strip spaces and newlines from the "then" and "else" part.
Usage
{{ifexpr|2<3| p | q }}gives "{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:2<3|p1|p2}}|p1=p1|p2=p2|if/errmsg}}| p | q |2<3}}"{{ifexpr|2>3| p | q }}gives "{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:2>3|p1|p2}}|p1=p1|p2=p2|if/errmsg}}| p | q |2>3}}"{{ifexpr|2{{=}}3| p | q }}gives "{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:2Template:=3|p1|p2}}|p1=p1|p2=p2|if/errmsg}}| p | q |2Template:=3}}"{{ifexpr||1=2=3| p | q }}gives "{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:2=3|p1|p2}}|p1=p1|p2=p2|if/errmsg}}| p | q |2=3}}"{{ifexpr||1=7=7| ok true | no }}gives "{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:7=7|p1|p2}}|p1=p1|p2=p2|if/errmsg}}| ok true | no |7=7}}"{{ifexpr||1=3*4<=10+1| ok| oh no}}gives "{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:3*4<=10+1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}| ok| oh no|3*4<=10+1}}"
Compare:
{{#ifexpr:2<3| p | q }}gives "{{#ifexpr:2<3| p | q }}"
Note that, unlike parser functions, templates require writing equals signs in values of unnamed parameters by using double-braces, as {{=}}. So, to allow "=" (or "<=" or ">=") then use the named parameter 1, as in: 1={{{x}}}>=7.
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):
{{ifexpr|1234>e3|1|0}}gives {{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1234>e3|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|1|0|1234>e3}}{{#ifexpr:1234>e3|1|0}}gives {{#ifexpr:1234>e3|1|0}}, for e3.{{#ifexpr:1234>1e3|1|0}}gives {{#ifexpr:1234>1e3|1|0}}, because 1,234 > 1e3 (1,000).
Expansion depth limit
13 levels allowed:
{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|a}}}}}}}}}}}}}}}}}}}}}}}}}} gives {{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|a||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}
{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|{{ifexpr|1|a}}}}}}}}}}}}}}}}}}}}}}}}}}}} gives {{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|{{safesubst:{{safesubst:#switch:{{safesubst:#ifexpr:1|p1|p2}}|p1=p1|p2=p2|if/errmsg}}|a||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}||1}}
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 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 {{{1}}}. Templates p1 and p2 ignore {{{1}}}; template if/errmsg is only called in the case of a wrong expression {{{1}}}; it ignores p and q and uses {{{1}}} for display in the error message.
