1个不稳定版本
0.5.0 | 2021年1月18日 |
---|
#28 in #jinja
每月25次下载
在templar中使用
14KB
312 行
Templar
Templar是一个Rust库,也是一个用于处理模板的CLI工具。其用法和风格受到了Jinja2和Ansible的启发,尽管它并不是这两个工具的克隆。
项目目标是提供快速且灵活的动态模板功能,尤其是用于配置和本地工具。尽管如此,它也可以适应HTML和前端渲染。
示例
考虑到它所基于的框架,模板语法可能很熟悉。例如,一个简单的模板可能看起来像这样
user_name={{ user.name }} {# Replace with the context property 'name' in 'user' #}
full_context={{ . | json("pretty") }} {# Dump the entire context as JSON, '.' is the root node #}
password={{ script('echo hunter2 | md5sum') }} {# Execute a shell command and calculate the MD5 sum #}
除了简单的替换外,还可以使用更复杂的表达式。
The calculated result is {{ 100 * 5 / 10 }} {#- Prints '50' #}
Today's guest list:
{%- for person in ['Bob', 'Joe', 'Jen', 'Amy')] %}
* {{ person }} will come to the party!
{%- endfor %} {#- This will loop everyone in the inline array above, but they array could also come from the context #}
另一个模板框架吗?
嗯...是的。
目前有许多优秀的模板框架,但它们大多是为了网页或HTML渲染而设计的。这在使用其他目的时带来了一些缺点。
- Templar对解析配置文件提供了一级支持。您可以直接从一个使用serde解析的配置中创建上下文,或者用它来模板化serde子元素。
- 您可以选择直接解析表达式,而不是整个模板。
- 上下文值在访问时按需处理。
- 上下文值可以引用其他上下文值。
- 扩展基本功能很容易。
- 支持动态上下文节点,每次访问时都会重新计算。例如,对包含此内容的模板的重复调用
{% if user.isRoot %} } } } } {% end if %}
会在user.isRoot
的值发生变化时改变。
模板语法
许多语法基于令人惊叹的 Jinja2 项目。以下是当前支持的一些功能。
- 可以使用
{{ }}
语法进行值替换。- 支持的字面量包括字符串(单引号、双引号或反引号括起来的)、布尔值、数字(当前解析为i64)、null、数组以及映射。
- 以字母字符开头的标识符可以直接引用,例如:
{{ some.value.path }}
- 可以使用
.
来引用根节点,允许使用如{{ . | json }}
来将整个上下文作为JSON输出。 - 非标准类型的标识符,例如以非字母字符开头、包含空格等,可以使用方括号语法来引用。例如:
{{ .['565'] }}
。这也允许数组访问和非标准类型的标识符(如布尔值)。 - 内联数组:例如
{{ [1,2,3,4] }}
和复杂的嵌套也是可能的,例如:{{ [1,2, script("echo 'hello world!'"), (5 + 5 | base64)] }}
- 内联映射:例如
{{ {'key': 'value', 'otherKey': { 'nested': 'map' } } }}
- 可以使用
{% %}
语法来执行控制流。- if/else if:
{% if 10/2 == 5 %}世界是理智的!{% else if false %}我们在哪个宇宙里?{% end if %}
- 作用域可以手动设置:
{% scope %}我在一个作用域里!{% end scope %}
- for 循环:
{% for thing in lots.of.stuff %} {{ thing['name'] }} {% end for %}
。for 循环始终进入一个新的作用域。
- if/else if:
- 注释使用
{# #}
语法,并将从输出中删除。 - 可以通过在上述任何块中添加一个
-
来控制空白字符,例如{{- 'no whitespace! -}}
。- 可以在标签的左侧或两侧添加空白字符控制。带有
-
的侧面的所有空格、换行符或其他空白将被移除,就像块紧挨着其他元素一样。
- 可以在标签的左侧或两侧添加空白字符控制。带有
由于文档仍在进行中,请参阅厨房水槽以获取模板用法的示例。
表达式语法
标准{{ }}
块内的所有内容都是表达式。每个块恰好包含一个表达式,但该表达式可以通过许多单个操作进行链式调用。简要概述:
- 数学运算:
+ - * / %
这些操作仅对数值类型有效 - 等式:
== != < <= > >= && ||
- 值设置:
=
此操作的左侧必须是某些标识符,例如:{{ some.val.path = 'hello world!' }}
- 字符串连接:
~
例如:{{ 'Hello' ~ ' ' ~ 'world!' }}
将输出 "Hello world!" - 函数:
ident()
例如:{{ env('USER') }}
将检索环境变量 "USER" 的值。 - 过滤器:
|
例如:{{ 'hello world' | upper }}
将使用 'upper' 过滤器打印 "HELLO WORLD"
由于文档仍在进行中,请参阅表达式测试以获取表达式用法的示例。
性能
Templar更注重渲染性能而不是解析性能。虽然你应该对大多数基准测试持保留态度,但简单的模板渲染仅需几微秒。在我的AMD Ryzen 2700U处理器上,我可以在单个线程上每秒渲染大约300,000个简单模板。
尽管模板种类繁多,但调用shell命令或执行其他复杂操作的模板将获得较低的性能。
API
完整的API文档可以在docs.rs上找到。
依赖关系
~1.5MB
~36K SLoC