#templating #template #jinja #cli #handlebars

templar_macros

轻量级、快速且强大的模板引擎

1个不稳定版本

0.5.0 2021年1月18日

#28 in #jinja

每月25次下载
templar中使用

MIT/Apache

14KB
312

Templar

Continuous Build GitHub release Crate Book API Docs Crates.io

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 循环始终进入一个新的作用域。
  • 注释使用{# #}语法,并将从输出中删除。
  • 可以通过在上述任何块中添加一个-来控制空白字符,例如{{- '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