%META:TOPICINFO{author="TWikiContributor" date="1111929255" format="1.0" version="5"}%

---+ =IF= Statements

The =%<nop>IF%= construct gives TWiki the power to include content in topics based on the value of simple expressions.

=%<nop>IF{"CONDITION" then="THEN" else="ELSE"}%=

In the example above, if CONDITION evaluates to TRUE, then THEN will be included in the topic; otherwise ELSE will be included.

What can be included in the THEN and ELSE parameters is obviously limited by standard TWiki syntax for parameters.

The basic syntax of a condition is as follows:
<verbatim>
expr ::= '(' expr ')' ;
expr ::= andexpr | andexpr 'or' expr ;
andexpr ::= notexpr | notexpr 'and' andexpr ;
notexpr ::= basexpr | 'not' baseexpr ;
basexpr ::= atom | uop atom | atom bop basexpr ;
uop ::= 'context' | 'defined' | '$' ;
bop ::= '=' | '!=' | '>' | '<' | '>=' | '<=' ;
atom ::= context identifier, TWiki variable name, single-quoted string, or configuration item
</verbatim>
| *Operators* ||
| and | True if both sides are true |
| or | True if one or other side is true |
| not | negate the following expression |
| <nop>=, !<nop>= | String comparison |
| &lt;, &gt;, &lt;=, &gt;= | Number comparison (there is no explicit numeric =) |
| context | True if the current context is set (see below) |
| defined | True if a preference variable or url parameter of this name is defined. |
| $ | expands a URL parameter or [[TWikiVariables][TWikiVariable]]. Plugin handlers *are not called*. Built-in variables and user-defined preferences are supported. You can pass a limited subset of parameters to TWiki variables by enclosing the variable name in single quotes; for example, =$ 'VARIABLE{value}'=. The ='VARIABLE{value}'= string may *not* contain quotes (' or "). |
examples:
<verbatim>
TWiki variable defined or not
%IF{"defined WIKINAME" then="WIKINAME is defined" else="WIKINAME is not defined"}%

You are %IF{ "$ WIKINAME='TWikiGuest' and not defined OPEN_DAY" then="not" }% allowed to
%IF{ "context view" then="view" else="edit"}% this TWiki today.

URL parameter
%IF{ "defined search" then="Search: %URLPARAM{search}%" else="No search passed in"}%

Configuration item set or not
%IF{ "{AntiSpam}{HideUserDetails}" then="User details are hidden" }%

url param t is %IF{ "0 < $ t and $ t < 1000" then="in" else="out of"}% range.

Text comparison
%IF{ "$'URLPARAM{scope}'='text'" then="Plain text search" }% 
</verbatim>

*Configuration items* are defined in [[%SCRIPTURLPATH{"configure"}%][configure]]. You cannot see the value of a configuration item, you can only see if the item is set or not.

*Context identifiers* are used in TWiki to label various stages of the rendering process. They are especially useful for [[TWikiSkins][skin]] authors to find out where they are in the rendering process. The following context identifiers are available:
| *id* | *context* |
| absolute_urls | Set if absolute URLs are required |
| authenticated | a user is authenticated |
| body_text  | when the body text is being processed in a view (useful in plugin handlers) |
| can_login | current environment supports login |
| changes | in changes script (see TWikiScripts) |
| command_line | the running script was run from the command line, and not from CGI |
| diff | in rdiff script (see TWikiScripts) |
| edit | in edit script (see TWikiScripts) |
| footer_text | when the footer text is being processed in a view (useful in plugin handlers) |
| header_text | when the header text is being processed in a view (useful in plugin handlers) |
| i18n_enabled | when user interface <nop>I18N support is enabled (i.e., user can choose the language for UI) |
| inactive | if active links such as 'edit' and 'attach' should be disabled |
| mirror | if this is a mirror |
| new_topic | if the topic doesn't already exist |
| oops | in oops script (see TWikiScripts) |
| preview | in preview script (see TWikiScripts) |
| rss | if this is an RSS skin rendering |
| save | in save script (see TWikiScripts) |
| search | in search script (see TWikiScripts) |
| view | in view script (see TWikiScripts) |
| rest | in rest script (see TWikiScripts) |

In addition there is a context identifier for each enabled plugin; for example, if =Gallous<nop>BreeksPlugin= is installed *and enabled*, then the context ID =Gallous<nop>BreeksPluginEnabled= will be set. Other extensions may set additional context identifiers.

The =%<nop>IF%= statement is deliberately kept simple. In particular, note that there is no way to conditionally execute a Set statement. If you need more sophisticated control over formatting, then consider using the SpreadSheetPlugin.
