Template code Chunk output
{#example_1}
{!--
  -- SYNTAX
  --
  -- If statements come in two flavors, compact and standard:
  --
  -- compact syntax:  {.if (cond) }...{/if}     nice for one-liners.
  -- standard syntax: {% if (cond) %}...{% endif %}  easier to read.
  --
  -- From 3.1.0 on, outer parens are now optional:
  --   {% if $x == $y %} ... {% endif %}
  --
  -- Quoting static strings with no whitespace is optional.
  --   {% if ($x == "bob") %} is the same as {% if ($x == bob) %}
  --
  -- Chunk's conditional expressions are useful but somewhat
  -- limited.  The lightweight parser can only handle the
  -- simple string value tests listed below.
  --    string equality:      ==
  --    string inequality:    !=
  --    regex match:          =~
  --    regex negative match: !~
  --
  -- Starting in 3.3.0, conditional expressions may be
  -- grouped with parens and joined using || and && operators.
  --
  -- LIMITATIONS
  --
  -- Tag values are coerced to strings for template output in an
  -- earlier step.  This means that when if-expressions are
  -- evaluated for true/false, all value comparisons are
  -- string comparisons *only*, never numeric equivalence
  -- nor any notion of java-style equality.
  --
  -- Booleans map to the string "TRUE" or null/undefined, so
  -- they will be interpreted as expected in a simple if-test
  -- for existence:
  --   {% if ($x.is_active) } ... {% endif %}
  --
  -- String equality/inequality can handle either a static string
  -- or a $tag expression on the right hand side of the operator.
  -- However, the left side *must* be a tag expression and may
  -- not be a simple string.
  --    "Yoda" style IS NOT OK: {% if (bob == $x|lower) %}
  --    OK: {% if ($x|lower == bob) %}
  --    OK: {% if ($x|lower == $y|lower) %}
  --
  -- "if" comparisons do not include greater-than or less-than
  -- tests (eg: > < <= gt lt etc) but there is a workaround.
  --
  -- Starting in 3.1.1, numeric comparison is possible via the
  -- comp filter.
  --  {% if $n|comp(< 0) %} ... {% endif %}
  --}

<ol>

{!-- existence --}
 <li>{.if ($flag) }Flag is defined{/if}</li>
 <li>{.if (!$flag) }Flag is not defined{/if}</li>

{!-- equality / inequality --}
 <li>{.if ($tag == apples) }Tag was apples{/if}</li>
 <li>{.if ($tag != apples) }Tag was not apples{/if}</li>
 <li>{.if ($tag == "apples") }Tag was "apples"{/if}</li>
 <li>{.if ($tag != "apples") }Tag was not "apples"{/if}</li>
 <li>{.if ($tag_a == $tag_b) }Tag A equals Tag B{/if}</li>
 <li>{.if ($tag_a != $tag_b) }Tag A does not equal Tag B{/if}</li>

{!-- perl-style pattern matching --}
 <li>{.if ($tag =~ /apples|oranges/) }Tag is apples or oranges{/if}</li>
 <li>{.if ($tag !~ /apples|oranges/) }Tag is neither apples nor oranges{/if}</li>

</ol>

{#}
Theme theme = new Theme("examples");

// Fetch template from this file: themes/examples/ifelse.chtml
// Inside that file there is a template "snippet" named #example_1
Chunk html = theme.makeChunk("ifelse#example_1");

html.set("flag", "TRUE");
html.set("tag", "apples");

html.set("tag_a", "apples");
html.set("tag_b", "oranges");

buffer.append( "FIRST RUN:\n" );
buffer.append( html.toString() );

// The same Chunk can be re-used with different tag values
html.resetTags();

// note: not setting a value for "flag" this time
html.set("tag", "bananas");

html.set("tag_a", "kumquat");
html.set("tag_b", "kumquat");

buffer.append( "SECOND RUN:\n" );
buffer.append( html.toString() );
FIRST RUN:

<ol>

 <li>Flag is defined</li>
 <li></li>

 <li>Tag was apples</li>
 <li></li>
 <li>Tag was "apples"</li>
 <li></li>
 <li></li>
 <li>Tag A does not equal Tag B</li>

 <li>Tag is apples or oranges</li>
 <li></li>

</ol>

SECOND RUN:

<ol>

 <li></li>
 <li>Flag is not defined</li>

 <li></li>
 <li>Tag was not apples</li>
 <li></li>
 <li>Tag was not "apples"</li>
 <li>Tag A equals Tag B</li>
 <li></li>

 <li></li>
 <li>Tag is neither apples nor oranges</li>

</ol>


FIRST RUN:
  1. Flag is defined
  2. Tag was apples
  3. Tag was "apples"
  4. Tag A does not equal Tag B
  5. Tag is apples or oranges
SECOND RUN:
  1. Flag is not defined
  2. Tag was not apples
  3. Tag was not "apples"
  4. Tag A equals Tag B
  5. Tag is neither apples nor oranges
Template code Chunk output
{#example_2}

<p>{$state} is a

{% if ($color == red) %}
  Conservative
{% elseIf ($color == blue) %}
  Liberal
{% else %}
  Centrist
{% endif %}

state.</p>

{#}
Theme theme = new Theme("examples");

// Fetch template from this file: themes/examples/ifelse.chtml
// Inside that file there is a template "snippet" named #example_2
Chunk html = theme.makeChunk("ifelse#example_2");

html.set("state", "Texas");
html.set("color", "red");

html.render( out );

<p>Texas is a

  Conservative

state.</p>


Texas is a Conservative state.

Template code Chunk output
{#example_3}
{!-- Nest your conditionals, no problem. --}

<p>{$state} is a

{% if ($color == red) %}
  {% if ($radical) %}
    Tea Party
  {% else %}
    Conservative
  {% endif %}
{% elseIf ($color == blue) %}
  {% if ($radical) %}
    Green
  {% else %}
    Liberal
  {% endif %}
{% else %}
  Centrist
{% endif %}

state.</p>

{#}
Theme theme = new Theme("examples");

// Fetch template from this file: themes/examples/ifelse.chtml
// Inside that file there is a template "snippet" named #example_3
Chunk html = theme.makeChunk("ifelse#example_3");

html.set("state", "Vermont");
html.set("color", "blue");
html.set("radical", "TRUE");

html.render( out );

<p>Vermont is a

    Green

state.</p>


Vermont is a Green state.

Template code Chunk output
{#example_4}
{!-- From 3.3.0 on, compound logical expressions are permitted --}

{% if ($can_edit && $can_admin) || ($name == Harry) %}
<button>All-Powerful Admin Button</button>
{% endif %}

{#}
Theme theme = new Theme("examples");

// Fetch template from this file: themes/examples/ifelse.chtml
// Inside that file there is a template "snippet" named #example_4
Chunk html = theme.makeChunk("ifelse#example_4");

html.set("name", "Harry");

html.render( out );

<button>All-Powerful Admin Button</button>