## Templates syntax

CTPL supports 2 kinds of data:

Raw data | The actual content of your template, or at least most of it: unparsed data that will remain (almost) unchanged.
Template blocks | The instructions that makes the template engine useful.

### Raw data

There is no syntax for the raw data: everything that is not a template block is raw data. The only exception to this rule is that the template-blocks-delimiters `{` and `}` must be escaped using a backslash (`\`), as well as backslashes themselves. For example, to produce an opening bracket, you need to write `\{`, and to produce a backslash you need to write it twice: `\\` (the first one escapes the second).

Even if escaping a character that doesn't need to be escaped works perfectly (thought the escaping backslash doesn't appear), it is recommended not to do so in order to allow future addition of new escaping sequences without changes on your template's output.

### Template blocks

Template blocks are delimited with brackets: they are opened with an unescaped opening bracket (`{`) and closed with an unescaped closing bracket (`}`). All data inside these two brackets is template instructions.

There are 3 instruction types:

The `for` loop

The `for` loop allows to iterate over an expression that expands to an array, and computes the loop body for each element in that array.

The syntax is the following:

    1

    {for <iterator> in <expression>}<loop body>{end}

`iterator` is the variable name referring to the current array's element; `expression` is an expression (see below) that expands to the array over which iterate; `loop body` is the data that will be evaluated on each iteration of the loop, and may contain any elements (raw data or instructions).

The `if` switch

The `if` block is a conditional branching.

The syntax is the following:

    1

    {if <expression>}<if body>[{else}<else body>]{end}

`expression` is an expression (see below) that will be evaluated to a boolean value, `TRUE` or `FALSE`.

If the `expression` evaluates to `TRUE`, the `if body` will be parsed. If the `expression` evaluates to `FALSE`, the `else body` will be parsed if any, or nothing will be done if the `else` is missing.

An expression

An expression that will be replaced by its computation result.

See CtplLexerExpr for details on the syntax of expressions. Basically, it may be any mathematical-like expression that may include reference(s) to variable(s). Variable can also be indexed with a C-like syntax if they expand to an indexable type (basically, an array). The index expression must expand to an integer or compatible.

### Examples

Example 2. Short template

    1
    2
    3

    {for i in array}
      {i}
    {end}

This example will output each item of `array` on a newline. Supposing the array `[1, 2, 3]`, the output will be:

    1
    2
    3
    4
    5

    1

    2

    3

Example 3. Longer template

Here what may be a template for a member list HTML page:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    <html>
      <head>
        <title>Member list</title>
      </head>
      <body>
        <h1>List of our members<h1>
        <ul class="memberlist">
        {for member in members}
          <li>{member}</li>
        {end}
        </ul>
      </body>
    </html>

Example 4. Array indexation

    1

    {array[2]}

This example will output the 3rd element (array indexes starts at zero) of the array named `array`.