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 模板引擎
每月104次下载
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
表达式代替上面提到的值。