Alright, fine. I can't stack ten plates, but I'll stack templated text files like it's nobody's business.
- Me
Tags
Add
Adds together an addend stored in context and a templated addend.
{% set x %}5{% /set %}\
{% add x %}10{% /add %}\
{{ x }}
15
The following other tag(s) were used in this example.
Assert
Verifies that a condition is truthy before continuing, will throw at compile-time otherwise.
{% assert "1" /%}
Call
Processes an external file inline, modifying the existing context along the way.
{# ./functions/header.tenplate #}\
{% fn header(lvl, txt) %}\
<h{{ lvl }}>{{ txt }}</h{{ lvl }}>\
{% /fn %}\
{% call "./functions/header.tenplate" /%}\
{% exec header("2", "Hello") /%}
<h2>Hello</h2>
The following other tag(s) were used in this example.
Comment
Instructs the compiler to skip all content contained within the open/close tags.
{# this is a comment #}
Compile
Processes an external file inline without modifying the existing context.
{# ./set/name.tenplate #}\
{% set name %}Frankie{% /set %}\
{% set name %}Matthew{% /set %}\
{% compile "./set/name.tenplate" /%}{{ name }}
Matthew
The following other tag(s) were used in this example.
Div
Performs division on a dividend in context and a templated divisor.
{% set x %}4{% /set %}\
{% div x %}2{% /div %}
2
The following other tag(s) were used in this example.
Exec
Executes a function already read into the current context. Arguments can be excluded from right-to-left.
{% fn commas(a, b, c) %}\
{{ a }}, {{ b }}{% if c %}, {{ c }}{% /if %}\
{% /fn %}\
{% set d %}foo{% /set %}\
{% set e %}bar{% /set %}\
{% exec commas(d, e, "baz") /%}
{% exec commas(d, e) /%}
foo, bar, baz
foo, bar
The following other tag(s) were used in this example.
Extend
Sets a single file as an outer template to process with the result of the
current file. The context will be passed along and the
content will be assigned to the special context
variable CONTENT
. If the extend tag is used multiple times
within the same template, the last tag used wins.
{# ../papa.tenplate #}\
{% assert name /%}\
{% assert paragraph /%}\
<h1>{{ name }}</h1>
<p>{{ paragraph }}</p>\
{% if CONTENT %}
<hr>
<p>{{ CONTENT }}</p>\
{% /if %}
{% extend "../papa.tenplate" /%}\
{% set name %}Frankie{% /set %}\
{% set paragraph %}This is a paragraph.{% /set %}\
And here is some output content.
<h1>Frankie</h1>
<p>This is a paragraph.</p>
<hr>
<p>And here is some output content.</p>
The following other tag(s) were used in this example.
Fn
Registers a function in context which can be called using the exec tag. A function can have anywhere from 0 to n arguments.
{% fn commas(one, two, three) %}\
{{ one }}, {{ two }}{% if three %}, {{ three }}{% /if %}.\
{% /fn %}\
{% exec commas("First", "Second", "Third") /%}
{% exec commas("First", "Second") /%}
First, Second, Third.
First, Second.
The following other tag(s) were used in this example.
Fordir / Else
Loops through each directory within a given directory. The element
variable will contain the path of the directory. If a name is
given for the loop variable (as dir_loop
in the example below),
the loop context will be stored with the given variable as a
prefix. The optional reversed
keyword can also be used to iterate through the
items backwards. The else
condition is triggered when no elements are found
for the loop.
Assume the following file stucture for the next example.
./
\
a-dir/
\
First/
Second/
Third/
{% fordir d in "./a-dir" as dir_loop %}\
{% if dir_loop.isfirst %}{% else %}, {% /if %}\
"{{ d }}"\
{% else %}\
{# no directories in "./a-dir" #}\
{% /fordir %}
"./a-dir/First", "./a-dir/Second", "./a-dir/Third"
The following other tag(s) were used in this example.
Foreach / Else
Loops through each value in a given variable in context. See
set for info on how a variable can have multiple
values. The optional loop context definition behaves
identically to the fordir tag. The reversed
keyword also behaves
identically to the fordir tag.
The siblings are \
{% set names %}Matthew{% /set %}\
{% set names %}Frankie{% /set %}\
{% set names %}Karina{% /set %}\
{% foreach name in items as name_loop %}\
{% if name_loop.isfirst %}{% else %}, {% /if %}\
{% if name_loop.islast %}and {% /if %}\
{{ name }}\
{% /if %}\
{% if name_loop.islast %}.{% /if %}\
{% else %}\
{# no items #}
{% /foreach %}
The siblings are Matthew, Frankie, and Karina.
The following other tag(s) were used in this example.
Forfile / Else
Loops through each file in a given directory. The element
variable will contain the path. The optional
loop context definition behaves identically to the
fordir tag. The reversed
keyword also behaves identically to the
fordir tag.
Assume the following file stucture and contents for the next example.
./
\
sibling.tenplate
siblings/
\
first.tenplate
second.tenplate
third.tenplate
{# ./sibling.tenplate #}\
{% assert sibling.filepath /%}\
{% call sibling.filepath /%}\
{% assert sibling.name /%}\
{% assert sibling.description /%}\
<tr><td>{{ sibling.name }}</td><td>{{ sibling.description }}.</td></tr>\
{# ./siblings/first.tenplate #}\
{% set sibling.name %}Matthew{% /set %}\
{% set sibling.description %}The elder{% /set %}\
{# ./siblings/second.tenplate #}\
{% set sibling.name %}Frankie{% /set %}\
{% set sibling.description %}The poor middle-child{% /set %}
{# ./siblings/third.tenplate #}\
{% set sibling.name %}Karina{% /set %}\
{% set sibling.description %}Da baby{% /set %}\
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>\
{% set sibsdir %}{% path "./siblings" /%}{% /set %}\
{% set sibtemplate %}{% path "./sibling.tenplate" /%}{% /set %}\
{% forfile sibling.filepath in sibsdir %}
{% compile sibtemplate /%}\
{% else %}\
{# no files in "./a-dir" #}\
{% /fordir %}
</tbody>
</table>
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr><td>Matthew</td><td>The elder.</td></tr>
<tr><td>Frankie</td><td>The poor middle-child.</td></tr>
<tr><td>Karina</td><td>Da baby.</td></tr>
</tbody>
</table>
The following other tag(s) were used in this example.
Forsplit / Else
Loop through sections of a string split on a given delimiter. The
variable will contain the current section. The string value can
be provided literally or from context. The delimiter can be
provided literally or from context as well. The optional
loop context definition behaves identically to the
fordir tag. The reversed
keyword also behaves identically to the
fordir tag.
{% forsplit number in "0,1,2,3,4" on "," reversed %}\
{% set output %}{{ number }}{% /set %}\
{% /forsplit %}\
{% foreach number in output as nloop %}\
{% if nloop.isfirst %}{% else %}, {% /if %}{{ number }}\
{% /foreach %}
4, 3, 2, 1
Get
Gets a value from a variable in context.
{% set msg %}Hi{% /set %}\
{{ msg }}
Hi
The following other tag(s) were used in this example.
If / Else
Compiles one of two code-paths depending on whether the condition
evaluates to true or false. The else
tag is an optional inclusion.
{% if "1" %}\
True\
{% else %}\
False\
{% /if %}
True
Include
Includes a file inline with compilation. Useful for including files which
contain Ten Plates
syntax.
{# ./includes/file.tenplate #}\
{% set name %}Frankie{% /set %}\
{% include "./includes/file.tenplate" /%}
{# ./includes/file.tenplate#}\
{% set name %}Frankie{% /set %}\
The following other tag(s) were used in this example.
Mod
Performs modulo operation on a dividend in context and a templated divisor.
{% set x %}4{% /set %}\
{% mod x %}2{% /mod %}
0
The following other tag(s) were used in this example.
Mul
Performs multiplication on a factor in context and a templated factor.
{% set x %}4{% /set %}\
{% mul x %}2{% /mul %}
8
The following other tag(s) were used in this example.
Nth
Retrieves the n-th element from an array of values.
{% set arr %}One{% /set %}\
{% set arr %}Two{% /set %}\
{% set arr %}Three{% /set %}\
{% nth arr %}1{% /nth %}
Two
The following other tag(s) were used in this example.
Path
Computes the canonical path for a given path. The entry must exist in the file system to avoid throwing an error.
{% path "./file.txt" /%}
/home/user/file.txt
Set
Sets a value for a variable in context. When multiple values are set for a given variable, the previous value is not overwritten, but is masked by the new value. These values can then be iterated over in the order in which they were set using the for-each tag.
{% set v %}1{% /set %}\
{{ v }}
1
The following other tag(s) were used in this example.
Sub
Performs subtraction on a minuend in context and a templated subtracahend.
{% set x %}4{% /set %}\
{% sub x %}2{% /sub %}
2
The following other tag(s) were used in this example.
Conditions
A set of one or more of logical assertions evaluating to true or false. These
can be nested using parenthetical notation or conjoined using the
short-circuiting and or or operators. The values contained within conditions
are evaluated in their string form so Ten Plates
performs boolean casting
on all values.
{# true #}{% assert "1" /%}
{# true #}{% assert "Hello, World!" /%}
{# false #}{% assert "0" /%}
{# false #}{% assert "" /%}
{# false #}{% assert a /%}
{# true #}{% set a %}1{% /set %}
{# true #}{% assert "1" == a /%}
{# true #}{% set b %}0{% /set %}
{# true #}{% assert a || b /%}
{# true #}{% assert (a && b) || "1" /%}
{# true #}{% set d %}500{% /set %}
{# true #}{% assert d > a /%}
{# true #}{% assert "501" > d /%}
{# true #}{% assert "501" >= d /%}
{# true #}{% assert "501" != d /%}
{# true #}{% assert "501" <= d /%}
{# true #}{% assert "501" < d /%}
Glossary
Content: The final output of a tenplate.
Context: Functions, values, and other data currently in-scope and usable.
Function: A block of tenplate keyed with a given name for future retrieval and compilation against an optional set of named arguments.
Variable: A value in context keyed with a given name for future retrieval.