8个版本
| 0.1.6 | 2023年6月21日 |
|---|---|
| 0.1.5 | 2023年1月5日 |
| 0.1.4 | 2017年7月14日 |
| 0.1.1 | 2017年6月20日 |
| 0.0.1 | 2017年1月7日 |
#20 in #mustache
111 次每月下载
在 5 个crate中使用 (3直接使用)
37KB
1K SLoC
Bart是一个针对Rust的编译时模板语言,灵感来自Mustache。它通过将模板静态编译为高效代码,并在编译时执行完整的变量解析和类型检查,发挥Rust的优势。
Cargo依赖
要使用Bart,请将这些依赖项添加到您的Cargo.toml
[dependencies]
bart = "0.1.4"
bart_derive = "0.1.4"
示例
给定模板文件 hello_world.html
Hello {{name}}
我们可以编写以下程序
#[derive(bart_derive::BartDisplay)]
#[template = "hello_world.html"]
struct HelloWorld<'a> {
name: &'a str,
}
fn main() {
print!("{}", &HelloWorld { name: "World" });
}
要编译此示例程序,您需要在您的Cargo.toml中添加bart和bart_derive作为依赖项。
运行此程序将输出
Hello World
您可以通过克隆此存储库并执行以下命令来运行此示例:cargo run --example hello_world。
逐行分析
#[derive(BartDisplay)]
与 Bart 交互的程序接口是通过在 bart_derive crate 中定义的过程宏实现的,该宏实现了对 #[derive(bart_derive::BartDisplay)] 的支持。它必须作为依赖项添加到您的 Cargo.toml 中。bart_derive 生成的代码依赖于 bart crate,因此您还需要将其作为依赖项引入。
使用 bart_derive::BartDisplay 生成基于下面的模板和结构的 impl 的 Display 特性。
#[template = "hello_world.html"]
bart_derive 将读取 hello_world.html 并使用它来生成模板渲染代码。给定的文件名是相对于 crate 根的相对路径,因此,例如,如果您想将模板放在 src/ 目录中,您必须指定 #[template = "src/hello_world.html"]。
还可以使用 template_string 在行内指定模板: #[template_string = "Hello {{name}}"]。
struct HelloWorld<'a> {
name: &'a str,
}
要在模板中进行插值的值将来自给定的 struct。在这种情况下,{{name}} 将解析为该结构的 name 字段。要插值的字段必须实现 Display 特性。
fn main() {
print!("{}", &HelloWorld { name: "World" });
}
如上所述,bart_derive 已为 HelloWorld 生成了一个 Display 的 impl。这意味着我们可以将 HelloWorld 的实例传递给 print!、write!、format! 等等。模板使用提供的数据进行渲染,生成输出到标准输出的 Hello World。
语言参考
Bart 模板语言受到 Mustache 的启发。(Bart 是挪威语中“胡须”的意思。)
除了标签外,输入将原样复制。标签以 {{ 开始,以 }} 结束。
插值
最简单的标签是插值标签,其中包含数据引用。对于模板 Hello {{name}},{{name}} 被识别为插值标签,而 name 被解析为给定 struct 的字段。此字段必须实现 Display 特性。可以使用 . 来引用嵌套 struct 中的字段;{{name.surname}}。
插值标签是HTML转义的,所以对于模板 Hello {{name}},如果 {{name}} 是 Bobby <tags>,输出将变为 Hello Bobby <tags>。
原始/未转义的插值
有时也很有必要故意包含未转义的HTML内容。使用三重标签,{{{…}}} 来实现此目的:如果 name 是 Bobby <tags>,则 Hello {{{name}}} 将渲染为 Hello Bobby <tags>。
迭代
可以迭代实现 IntoIterator 的任何内容
<ul>
{{#values}}
<li>{{.}}</li>
{{/values}}
</ul>
使用 {{.}} 来引用当前值。例如,如果 values 是一个 Vec<i32>,{{.}} 将依次引用包含的 i32 值。在迭代一组结构时,使用 . 前缀来引用成员
<ul>
{{#people}}
<li>{{.name}} ({{.age}})</li>
{{/people}}
</ul>
可以利用 Option 和 Result 上的 IntoIterator 实现,在 Bart 迭代中使用它们。
作用域
类似于迭代,可以通过指定尾随点进入变量的作用域。
{{#person.}}
{{.name}} ({{.age}})
{{/person}}
还可以完全限定每个引用。
{{person.name}} ({{person.age}})
在嵌套作用域中,使用多个前导点来退出。
{{#department.}}
{{#head.}}
{{.name}}, head of the {{..name}} department.
{{/head}}
{{/department}}
未限定的名称,即没有前导点的名称,将始终在最高作用域中解析。
相同的范围规则也适用于迭代作用域。
依赖项
~2.5MB
~54K SLoC