控制语句

If语句

通过判断表达式的真假来决定输出哪一分支,语法关键字:ifelseelifendififendif是必须并且成对出现。

{% if price < 10 or always_show %}
   Price is {{ price }}.
{% elif price > 1000 and not rich %}
   That's expensive!
{% else %}
    N/A
{% endif %}

未定义的变量被认为是假,所以在if语句中用来测试变量是否定义而不会引发错误。

{% if my_var %}
    {{ my_var }}
{% else %}
    Sorry, my_var isn't defined.
{% endif %}

For语句

循环列表中的没每一项,语法关键字:forendfor,必须成对出现。

{% for product in products %}
  {{loop.index}}. {{product.name}}
{% endfor %}

或者字符串中每一个字符

{% for letter in name %}
  {% if loop.index % 2 == 0%}
    <span style="color:red">{{ letter }}</span>
  {% else %}
    <span style="color:blue">{{ letter }}</span>
  {% endif %}
{% endfor %}

循环体内预定义了对象变量loop,有以下属性可用:

  • loop.index:当前循环的次序,从1开始
  • loop.index0:当前循环的次序,从0开始
  • loop.first:是否为第一次循环
  • loop.last:是否为最后一次循环

Include语句

include语句可以包含其他模板,语法:include 模板路径,路径始终从模板根目录开始查找,前面不能加 /,暂不支持相对路径。

{% include "included.html" %}

路径可以是字符串表达式

{% include "partials/" ~ name ~ ".html" %}

被包含的模板:

  • 共享当前的上下文数据
  • 新赋值的变量,仅在其内有效

未找到模板时会报错,可以使用optional关键字,在模板不存在时忽略。

{% include "header.html" optional %}

include语句支持路径列表,最先存在的模板被包含,其他忽略,同时支持optional

{% include ["custom/header.html", "header.html"] %}
{% include ["special_sidebar.html", "sidebar.html"] optional %}

Macros语句

宏可以认为是一种特殊的函数形式,其内部上下文通过参数传递,与外界隔离,宏的渲染输出作为整体返回。

{% macro input(label, type="text") %}
    <label>
        {{ label }}
        <input type="{{type}}" />
    </label>
{% endmacro input %}

其参数支持常量默认值。参数值可是有效变量、过滤器以及函数。

宏需要定义在一个单独的模板文件中,使用时导入并指定命名空间:

{% import "macros.html" as macros %}

调用形式如下:

{{ macros::input(label="Name", type="text") }}

宏定义文件中,当需要使用内部其他宏模块时,请使用self命名空间,借助self还可以实现递归调用,注意判断何时结束

{% macro factorial(n) %}
  {% if n > 1 %}{{ n }} - {{ self::factorial(n=n-1) }}{% else %}1{% endif %}
{% endmacro factorial %}

宏模块支持除block, extends外的所有语法。