20个发布版本
0.4.0 | 2023年4月14日 |
---|---|
0.3.3 | 2022年12月1日 |
0.3.2 | 2022年7月28日 |
0.2.0 | 2022年3月22日 |
0.1.1 | 2021年7月30日 |
#130 in 模板引擎
52 每月下载量
42KB
876 行
NaTE — 不是模板引擎
这 不是 一个模板引擎,但类似于PHP中的隐式调用 write!(…)
。唯一的区别是,除非明确选择退出,否则输出将自动进行XML转义。
与其他模板引擎不同,如 Askama、Handlebars、Liquid、Tera 或 Tide,你不需要学习新语言。如果你知道Rust和HTML,你就可以用NaTE实现模板!
例如。
-
templates/greeting.html
<h1>Hello, {{user}}!</h1>
路径相对于项目的Cargo清单目录(找到Cargo.toml的位置)。
-
src/main.rs
use nate::Nate; #[derive(Nate)] #[template(path = "templates/greeting.html")] struct Greetings<'a> { user: &'a str, } fn main() { let mut output = String::new(); let tmpl = Greetings { user: "<World>" }; write!(output, "{}", tmpl).unwrap(); println!("{}", output); }
-
输出
<h1>Hello, <World>!</h1>
不需要新的特性,而是 #[derive(Nate)]
主要通过实现 fmt::Display 来工作。这也使得NaTE模板的嵌套成为可能。
一个更复杂的例子将是
-
src/main.rs
use nate::Nate; #[derive(Nate)] #[template(path = "templates/99-bottles.html")] struct Template { limit: usize, } #[test] fn ninetynine_bottles_of_beer() { print!("{}", Template { limit: 99 }); }
-
templates/99-bottles.txt
{%- for i in (1..=self.limit).rev() { if i == 1 { -%} 1 bottle of beer on the wall. 1 bottle of beer. Take one down, pass it around. {%- } else { -%} {{i}} bottles of beer on the wall. {{i}} bottles of beer. Take one down, pass it around. {% } } -%}
在 {% 代码块 %}
中,你可以编写任何和所有的Rust代码。
{{ value blocks }}
中的值以XML转义的形式打印。
{{{ 原始块 }}}
中的值将按原样打印。
对于位于 {{{{}}}}}
的值,它们的调试信息将按如下方式打印:"{:?}"
。
对于位于 {{{{{}}}}}
的值,它们的调试信息将按如下方式详细打印:"{:#?}"
。
使用 {< include >}
块,你可以包含一个模板文件。然后它就像被复制粘贴到当前文件中一样。如果路径以 "." 或 ".." 开头,文件将在当前文件相对位置查找。否则,将在项目根目录中查找。
在块的开始/结束处使用短横线 -
,块前后空白将被删除。
数据块 {{…}}
到 {{{{{…}}}}}
并包含 {<…>}
必须不为空。代码块 {%…%}
和注释块 {#…#}
可以是空的。
块不需要在文件末尾关闭。
要调试任何错误,你可以添加一个参数,例如 #[template(generated = "some/path/generated.rs")]
。即使Rust代码中有解析错误,生成的代码也存储在此处。路径相对于项目根目录(你的Cargo.toml所在位置)。
功能标志
依赖项
~2–2.8MB
~58K SLoC