#template #fragment #engine #html #tags #path #split

template-fragments

适用于类似jinja的引擎的template-fragments

1个不稳定版本

0.2.0 2023年6月11日

#386模板引擎

MIT 许可证

46KB
1K SLoC

Rust 1K SLoC // 0.0% comments Python 114 SLoC

template-fragments 适用于类似jinja的引擎

使用minijinja(也请参阅 examples/minijinja.rs

use template_fragments::{join_path, split_templates};

let mut source = minijinja::Source::new();

for (path, template) in  [
    ("index.html", include_str!("templates/index.html")),
    ("users.html", include_str!("templates/users.html")),
] {
    for (fragment_name, template_fragment) in split_templates(template)? {
        source.add_template(join_path(path, &fragment_name), &template_fragment)?;
    }
}

lib.rs:

使用片段标签预处理类似Jinja的模板

template_fragments 提供了一种将带有片段标签({% fragment NAME %}{% endfragment %})的模板分割成片段的方法。例如

<body>
# Header
{% fragment items %}
{% for item in items %}
    {% fragment item %}
        <div>{{ item }}</div>
    {% endfragment %}
{% endfor %}
{% endfragment %}
<body>

此模板定义了三个片段

  • "":没有任何片段标记的整个模板
  • "items":遍历所有项的模板
  • "item":最内层的div

template_fragments 提供了两种预处理此类模板的方法

  • [filter_template]:给定一个片段名称,仅返回属于该片段的模板部分。此函数设计用于在模板动态请求时使用
  • [split_templates]:将模板分割成所有其片段。此函数设计用于在应用启动时一次性提取所有模板

语法

  • 片段以 {% fragment NAMES... %}{% fragment-block NAMES %}
  • {% fragment-block NAME %}{% endfragment-block %} 定义片段块:如果包含片段,它们将被渲染为一个块。这相当于用相同名称的片段包裹一个块。
  • 片段以 {% endfragment %}{% endfragment-block %} 结束。
  • 文档中可以出现多个片段。
  • 可以在单个标签中通过在起始标签中使用多个以空格分隔的名称来开始多个片段。
  • 片段标签必须在一行内,且同一行上不能有其他非空白内容。
  • 片段名称可以包含任何字母数字字符和 '-''_'

使用 minijinja 的示例

使用 minijinja 使用片段标签的一种方法是在应用程序启动时构建一个模板源,如下所示

use template_fragments::{split_templates, join_path};

let mut source = minijinja::Source::new();

for (path, template) in [("index.html", include_str!("../examples/templates/index.html"))] {
    for (fragment_name, template_fragment) in split_templates(template)? {
        source.add_template(join_path(path, &fragment_name), &template_fragment)?;
    }
}

注意可以通过请求相关的模板来渲染不同的片段,例如,env.get_template("index.html")env.get_template("index.html#fragment")

无运行时依赖