| //! Documentation of TinyTemplate's template syntax. |
| //! |
| //! ### Context Types |
| //! |
| //! TinyTemplate uses `serde_json`'s Value structure to represent the context. Therefore, any |
| //! `Serializable` structure can be used as a context. All values in such structures are mapped to |
| //! their JSON representations - booleans, numbers, strings, arrays, objects and nulls. |
| //! |
| //! ### Values |
| //! |
| //! Template values are marked with `{...}`. For example, this will look up the "name" field in |
| //! the context structure and insert it into the rendered string: |
| //! |
| //! ```text |
| //! Hello, {name}, how are you? |
| //! ``` |
| //! |
| //! Optionally, a value formatter may be provided. One formatter, "unescaped", is provided by |
| //! default. Any other formatters must be registered with the |
| //! [`TinyTemplate.add_formatter`](../struct.TinyTemplate.html#method.add_formatter) |
| //! function prior to rendering or an error will be generated. This will call the formatter function |
| //! registered as "percent_formatter" with the value of the "percentage" field: |
| //! |
| //! ```text |
| //! Give it {percentage | percent_formatter}! |
| //! ``` |
| //! |
| //! The value may be a dotted path through a hierarchy of context objects. This will look up the |
| //! "friend" field in the context structure, then substitute the "name" field from the "friend" |
| //! object. |
| //! |
| //! ```text |
| //! And hello to {friend.name} as well! |
| //! ``` |
| //! |
| //! Additionally, you may use the `@root` keyword to refer to the root object of your context. |
| //! Since TinyTemplate can't normally print complex context objects, this is only useful if the |
| //! context is a simple object like an integer or string. |
| //! |
| //! ### Conditionals |
| //! |
| //! TinyTemplate blocks are marked with `{{...}}` - double-braces where values are single-braces. |
| //! |
| //! Conditionals are denoted by "{{ if path }}...{{ else }}...{{ endif }}". The Else block is |
| //! optional. Else-if is not currently supported. If "path" evaluates to a truthy expression |
| //! (true if boolean, non-zero if numeric, non-empty for strings and arrays, and non-null for |
| //! objects) then the section of the template between "if" and "else" is evaluated, otherwise the |
| //! section between "else" and "endif" (if present) is evaluated. |
| //! |
| //! ```text |
| //! {{ if user.is_birthday }} |
| //! Happy Birthday! |
| //! {{ else }} |
| //! Have a nice day! |
| //! {{ endif }} |
| //! ``` |
| //! |
| //! The condition can be negated by using "{{ if not path }}": |
| //! |
| //! ```text |
| //! {{ if not user.is_birthday }} |
| //! Have a nice day! |
| //! {{ else }} |
| //! Happy Birthday! |
| //! {{ endif }} |
| //! ``` |
| //! |
| //! If desired, the `@root` keyword can be used to branch on the root context object. |
| //! |
| //! ### Loops |
| //! |
| //! TinyTemplate supports iterating over the values of arrays. Only arrays are supported. Loops |
| //! are denoted by "{{ for value_name in value.path }}...{{ endfor }}". The section of the template between |
| //! the two tags will be executed once for each value in the array denoted by "value.path". |
| //! |
| //! ```text |
| //! Hello to {{ for name in guests }} |
| //! {name} |
| //! {{ endfor }} |
| //! ``` |
| //! |
| //! If the iteration value chosen in the "for" tag is the same as that of a regular context value, |
| //! the name in the tag will shadow the context value for the scope of the loop. For nested loops, |
| //! inner loops will shadow the values of outer loops. |
| //! |
| //! ```text |
| //! {{ for person in guests }} |
| //! Hello to {person}{{ for person in person.friends }} and your friend {person}{{ endfor }} |
| //! {{ endfor }} |
| //! ``` |
| //! |
| //! There are three special values which are available within a loop: |
| //! |
| //! * `@index` - zero-based index of the current value within the array. |
| //! * `@first` - true if this is the first iteration of the loop, otherwise false. |
| //! * `@last` - true if this is the last iteration of the loop, otherwise false. |
| //! |
| //! ```text |
| //! Hello to {{ for name in guests -}} |
| //! { @index }. {name}, |
| //! {{- endfor }} |
| //! ``` |
| //! |
| //! |
| //! In case of nested loops, these values refer to the innermost loop which contains them. |
| //! |
| //! If the root context object is an array, the `@root` keyword can be used to iterate over the |
| //! root object. |
| //! |
| //! ### With Blocks |
| //! |
| //! Templates can use with blocks to partially shadows the outer context, the same way that |
| //! for-loops do. These are formed like so: |
| //! |
| //! "{{ with path.to.value as name }}..{{ endwith }}"" |
| //! |
| //! For example: |
| //! |
| //! ```text |
| //! {{ with person.spouse as s }} |
| //! Hello { s.name }! |
| //! {{ endwith }} |
| //! ``` |
| //! |
| //! This looks up "person.spouse" and adds that to the context as "s" within the block. Only the |
| //! name "s" is shadowed within the with block and otherwise the outer context is still accessible. |
| //! |
| //! ### Trimming Whitespace |
| //! |
| //! If a block tag, comment or value tag includes a "-" character at the start, the trailing |
| //! whitespace of the previous text section will be skipped in the output. Likewise, if the tag |
| //! ends with a "-", the leading whitespace of the following text will be skipped. |
| //! |
| //! ```text |
| //! Hello { friend.name -} |
| //! , how are you? |
| //! |
| //! {{- if status.good }} I am fine. {{- endif }} |
| //! ``` |
| //! |
| //! This will print "Hello friend, how are you? I am fine." without the newlines or extra spaces. |
| //! |
| //! ### Calling other Templates |
| //! |
| //! Templates may call other templates by name. The other template must have been registered using |
| //! the [`TinyTemplate.add_template`](../struct.TinyTemplate.html#method.add_template) function |
| //! before rendering or an error will be generated. This is done with the "call" tag: |
| //! |
| //! "{{ call template_name with path.to.context }}" |
| //! |
| //! The call tag has no closing tag. This will look up the "path.to.context" path in the current |
| //! context, then render the "template_name" template using the value at that path as the context |
| //! for the other template. The string produced by the called template is then inserted into the |
| //! output from the calling template. This can be used for a limited form of template code reuse. |
| //! |
| //! ### Comments |
| //! |
| //! Comments in the templates are denoted by "{# comment text #}". Comments will be skipped when |
| //! rendering the template, though whitespace adjacent to comments will not be stripped unless the |
| //! "-" is added. For example: |
| //! |
| //! ```text |
| //! Hello |
| //! |
| //! {#- This is a comment #} world! |
| //! ``` |
| //! |
| //! This will print "Hello world!". |
| //! |
| //! ### Escaping Curly Braces |
| //! |
| //! If your template contains opening curly-braces (`{`), they must be escaped using a leading `\` |
| //! character. For example: |
| //! |
| //! ```text |
| //! h2 \{ |
| //! font-size: {fontsize}; |
| //! } |
| //! ``` |
| //! |
| //! If using a string literal in rust source code, the `\` itself must be escaped, producing `\\{`. |
| //! |
| |
| // There's nothing here, this module is solely for documentation. |