#template #html #html-templating #no-std #io-write

no-std nate

这不是模板引擎。通过模板推导显示。

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 模板引擎

Download history 5/week @ 2024-03-10 129/week @ 2024-03-31

52 每月下载量

Apache-2.0 WITH LLVM-exception

42KB
876

NaTE — 不是模板引擎

GitHub Workflow Status Crates.io Minimum supported Rust version License

不是 一个模板引擎,但类似于PHP中的隐式调用 write!(…)。唯一的区别是,除非明确选择退出,否则输出将自动进行XML转义。

与其他模板引擎不同,如 AskamaHandlebarsLiquidTeraTide,你不需要学习新语言。如果你知道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, &#60;World&#62;!</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所在位置)。

功能标志

  • std [默认启用] — 启用 std 包中找到的功能,例如打印 MutexGuard 的值

  • alloc [默认启用,由 std 启用] — 启用 alloc 包中找到的功能,例如 io::Write

依赖项

~2–2.8MB
~58K SLoC