#expressions #mustache #bytecode #interpreter #default-value #compile-time

无 std hairy

编译文本模板(类似于 Mustache 和 Handlebars),支持在模板中包含表达式和自定义函数

6 个版本 (3 个重大更新)

0.4.0 2024年5月3日
0.3.0 2023年12月10日
0.2.1 2023年3月25日
0.1.2 2022年6月18日
0.1.1 2022年5月29日

#76 in 模板引擎

Download history 46/week @ 2024-04-25 202/week @ 2024-05-02 71/week @ 2024-05-09 23/week @ 2024-05-16 51/week @ 2024-05-23 86/week @ 2024-05-30 39/week @ 2024-06-06 47/week @ 2024-06-13 22/week @ 2024-06-20 7/week @ 2024-06-27 17/week @ 2024-07-04 26/week @ 2024-07-11 54/week @ 2024-07-18 33/week @ 2024-07-25 2/week @ 2024-08-01 15/week @ 2024-08-08

每月104次下载

Apache-2.0

625KB
13K SLoC

hairy

hairy crate 提供文本模板,类似于 mustache 和 handlebars(以及早期的 ctemplate 原版),但略有不同。作用域是不同的:变量必须明确指定它们使用的作用域(通过使用 a.b 语法)。这是为了避免变量(意外地)被覆盖时的隐式行为。为了尽早捕获错误,可以可选地添加类型,这些类型将在编译时进行检查。所有错误都视为硬错误并报告。因此,缺失值和类型错误不会静默忽略。此外,模板还支持评估:{{=expression}}。支持的表达式来自 expry crate,它允许在二进制编码的类似 JSON 值上执行表达式(支持定义自定义函数)。自动转义应用于输出,以避免安全问题(如让用户输入作为 JavaScript 执行)。

语法

简要介绍功能和语法

  • 可以在输入文件顶部使用 type key: expry 对(JSON 是有效的 expry)声明变量。 type 可以是 inline(值在模板编译期间被替换)或 default(这是一个默认值,如果键不存在,则添加到评估时间值中)。第一个不可解析的行表示变量的结束。
  • 值可以通过以下格式输出:{{=value}}(支持表达式,见下文)。可以通过以下格式指定转义模式:{{=value:escape_mode}}。值由用户定义的转义器处理,该转义器会考虑转义模式。通常只显示字符串和数字,而 null 值被视为跳过(不会生成错误)。其他值被视为错误,除非使用 sjs(script-js)或 js 转义模式。
  • 使用 {{if value}}contents}{{end}} 进行条件判断。如果值评估为 true,则显示内容。支持 else 结构:{{if value}}foo}{{else}}bar}{{end}}
  • 使用 {{for variable in name}}content}{{end}} 进行迭代器操作,可以用于遍历任何类型的数组。数组的内容在循环体中可用,键为 variable
  • 使用 {{define name}}content}{{end}} 定义模板。模板可以有可选的默认值(在对象中),格式为 {{define name defaults object}}content}{{end}}。默认值在模板编译时解析,使用传递给编译函数的全局上下文;
  • 使用 {{调用名称}}{{调用名称并传递值}} 进行模板实例化。 name 可以是一个表达式。如果名称以 * 开始,则名称可以是一个解析为字符串的表达式(该字符串被视为模板名称)。如果名称以 ** 开始,则名称应该是一个解析为二进制形式模板代码的表达式(由编译函数生成)。如果使用 with 语法,则仅传递 value 中指定的数据(因此当前上下文不会自动传递/合并,要这样做请使用 {...this, key: value} 的值)。这样做是为了避免错误。
  • 错误处理与常规 Mustache 不同:缺失字段始终被视为错误。可以使用 expr ??? alternative 尝试语法(在 expr 中发生错误时,将执行 alternative)。expr ??? null 的简写为 expr ???,它可以在循环中使用 {{for i in someField???}},如果字段未找到则忽略错误。条件语句也是一样。

可以使用 expry 表达式代替上面提到的值。

  • Mustache 和 Handlebars 是灵感的来源,但它们缺乏对复杂情况(例如缺失字段、类型错误)的错误处理,并且不支持表达式。
  • Ramhorns 是 Rust 中的 Mustache 实现(仍然缺少对缺失字段的处理),但它有一个很好的宏,允许使用原生 Rust 数据结构作为模板的输入。
  • Askama 是用 Rust 编写的类型安全编译模板引擎。它具有对缺失字段的检查功能,但不支持动态模板。

依赖关系