Table of Contents
- What is it: templater
- Syntax: twig, jinja, django, liquid
- Language: Lua 5.1+
- Dependency: none
- Compiler: simple tokenizer + AST
- Unittest: busted
Limitations #
- New (local) variables cannot be called by the following names (by internal limitation):
and
,break
,do
,else
,elseif
,end
,false
,for
,function
,if
,in
,local
,nil
,not
,or
,repeat
,return
,then
,true
,until
,while
. These keywords generate error during compile.
Working with keys #
Keys sequence a.b.c
returns nil
if variable a
or any other keys (b
or c
) doesn’t exits.
The sequence of keys {{ a.b.c }}
may be represented as lua code
if a and is_table(a) and a.b and is_table(a.b) and a.b.c then
return a.b.c
else
return nil
end
Working with strings #
In case the value should be converted to a string.
{{ data }}
Value | String evaluation | Info |
---|---|---|
nil |
empty string | |
cjson.null | empty string | see cjson |
cbson.null() | empty string | see cbson |
lyaml.null | empty string | see lyaml |
yaml.null | empty string | see yaml |
ngx.null | empty string | see ngx_lua |
msgpack.null | empty string | see msgpack |
box.NULL | empty string | see tarantool box |
other value | tostring(...) |
You may configure empty-string behavior.
Working with numbers #
- for math operations
- in case the value should be converted to a number.
{{ data + 2 }}
Value | Number evaluation | Info |
---|---|---|
empty string | 0 | |
string “0” or ‘0’ | 0 | |
false | 0 | |
true | 1 | |
any table | 0 | |
nil | 0 | |
userdata | tonumber(tostring(...)) |
if result is nil then 0 will be used |
string | tonumber(...) |
if result is nil then 0 will be used |
You may configure number behavior.
Working with booleans #
The rules to determine if an expression is true
or false
are (edge cases):
{% if data %}
...
{% endif %}
Value | Boolean evaluation | Info |
---|---|---|
empty string | false | |
other string | true | |
numeric zero | false | |
whitespace-only string | true | |
string “0” or ‘0’ | true | |
nil | false | |
table with __toboolean |
__toboolean() |
|
table with __len |
__len() ~= 0 |
|
empty table | false | |
non-empty table | true | |
cjson.null | false | see cjson |
cjson.empty_array | false | see cjson |
cbson.null() | false | see cbson |
cbson.null() | false | see cbson |
cbson.array() | false | see cbson |
lyaml.null | false | see lyaml |
yaml.null | false | see yaml |
ngx.null | false | see ngx_lua |
msgpack.null | false | see msgpack |
box.NULL | false | see tarantool box |
userdata with __toboolean |
__toboolean() |
|
userdata with __len |
__len() ~= 0 |
Functions __toboolean()
and __len()
should be a part of the metatable.
You may configure false
behavior.
Working with cycles #
Aspect supports iterators from Lua 5.2+ versions for Lua 5.1 and LuaJIT versions.
{% for key, value in data %}
...
{% endfor %}
Value | Action |
---|---|
string | not iterate |
empty table | not iterate |
number | not iterate |
nil | not iterate |
true/false | not iterate |
userdata with __pairs |
iterate with __pairs() |
userdata | not iterate |
table with __pairs |
iterate with __pairs() instead of pairs() |
other table | iterate with pairs() |
The function __pairs()
should be a part of the metatable
and compatible with basic function pairs()
(returns iterator
, key
, value
)
Working with counting #
When it is necessary to count the number of elements (filter length
or variable loop.length
).
{{ data|length }}
Value | Number evaluation |
---|---|
string | string.len(...) |
empty table | 0 |
number | 0 |
nil | 0 |
true/false | 0 |
userdata | 0 |
table with __len |
__len(...) |
table with __pairs |
invoke __pairs() and count elements |
other tables | count of keys |
userdata with __len |
__len(...) |
userdata with __pairs |
invoke __pairs() and count elements |