1 个不稳定版本

0.1.0 2022年12月20日

#431 in 模板引擎

MITAGPL-3.0

10KB
88

simpletemplate

完全用 Rust 编写的模板引擎。

用法

// main.rs
use simpletemplate::render;
use serde_json::{json};

fn main() {
    let data = json!({
        "name": ["Bob Belcher"],
    });
    let content = "{{ name }}";
    let res = render(content, data);
    println!("{}", res); //returns Bob Belcher
}

模板用法

对于变量,使用 {{ variable_name }}

对于数组索引,使用 {{ array_name[index] }}

要遍历数组

{{ for loop_variable in loop_iterable }} 
    loop_body 
{{ endfor }}

要访问索引

{{ for loop_variable in loop_iterable }} 
    {{ index }}
{{ endfor }}

条件语句:如果 condition 不是 nullfalse"false",则渲染 if_body

{{ if condition }} 
    if_body 
{{ else }} 
    else_body 
{{ endif }} 

查看 src/main.rs 了解如何从 HTML 文件中渲染。


lib.rs:

渲染 HTML 模板。

示例

// variables
let data = json!({ "foo": "bar" });
let template = r"{{ foo }}";
let expected = "bar";
assert_eq!(render(template, data), expected);
// logic statements
let data = json!({ "foo": "bar" });
let template = r"{{ if foo }}{{ foo }}{{ else }}foo is not set{{ endif }}";
let expected = "bar";
assert_eq!(render(template, data), expected);
let data = json!({ "foo": null });
let template = r"{{ if foo }}{{ foo }}{{ else }}foo is not set{{ endif }}";
let expected = "foo is not set";
assert_eq!(render(template, data), expected);
// for loop
let data = json!({ "items": ["a", "b", "c"] });
let template = r"{{ for item in items }}{{ item }}{{ endfor }}";
let expected = "abc";
assert_eq!(render(template, data), expected);
let data = json!({ "items": [] });
let template = r"{{ for item in items }}{{ item }}{{ endfor }}";
let expected = "";
assert_eq!(render(template, data), expected);
// accessing by index
let data = json!({ "items": ["a", "b", "c"] });
let template = r"{{ items[0] }}";
let expected = "a";
assert_eq!(render(template, data), expected);
let data = json!({ "items": ["a", "b", "c"] });
let template = r"{{ items[1] }}";
let expected = "b";
assert_eq!(render(template, data), expected);
let data = json!({ "items": ["a", "b", "c"] });
let template = r"{{ items[2] }}";
let expected = "c";
assert_eq!(render(template, data), expected);
// combining logic
let data = json!({
"foo": "bar",
"items": ["a", "b", "c"],
"show_items": true,
"show_foo": false,
});
let template = r"{{ if show_items }}{{ for item in items }}{{ item }}{{ endfor }}{{ endif }}{{ if show_foo }}{{ foo }}{{ endif }}";
let expected = "abc";
assert_eq!(render(template, data), expected);
let data = json!({
"foo": "bar",
"items": ["a", "b", "c"],
"show_items": true,
"show_foo": false,
});
let template = r"{{ if show_items }}{{ for item in items }}{{ item }}{{ endfor }}{{ endif }}{{ if show_foo }}{{ foo }}{{ else }}foo is not set{{ endif }}";
let expected = "abcfoo is not set";
assert_eq!(render(template, data), expected);
// blank template
let data = json!({});
let template = "";
let expected = "";
assert_eq!(render(template, data), expected);
// invalid variable
let data = json!({ "foo": "bar" });
let template = "{{ baz }}";
let expected = "null";
assert_eq!(render(template, data), expected);
// invalid index
let data = json!({ "items": ["a", "b", "c"] });
let template = "{{ items[5] }}";
let expected = "null";
assert_eq!(render(template, data), expected);
// invalid statement
let data = json!({});
let template = "{{ if foo }}{{ endif }}";
let expected = "";
assert_eq!(render(template, data), expected);

依赖项

~2.4–4MB
~70K SLoC