#tera-templates #template #tera #markup #jinja2 #multi-template

terarium

用于模板分组和模板批量渲染的 Tera 模板系统的包装器

3 个版本 (破坏性更新)

0.3.0 2023 年 12 月 28 日
0.2.0 2023 年 12 月 28 日
0.1.0 2023 年 12 月 16 日

#14#tera

每月 24 次下载

MIT 许可证

32KB
442

Terarium

Tests

Terarium 是一个库,用于使用 Tera 模板库渲染模板组。

安装

cargo install terarium

用法

要创建 Terarium 实例,使用 TerariumBuilder。此构建器可以配置模板和分组,当您添加所有项目后,调用 build() 方法以检索 Terarium 实例。在准备 Template 实例时,您可以添加多个内容。每个内容绑定到一个语言键。但语言键可以分配多个内容。

实例就绪后,调用 render_templaterender_group 来渲染由其键定义的单个模板或模板组。由于库支持多语言,必须传递语言键和可选的回退语言键。回退语言用于找不到模板的主语言版本时。

单个模板渲染的结果是 Result<String, TerariumError>,其中 String 是渲染的内容。

模板组渲染的结果是 Result<HashMap<String, String>, TerariumError>,其中 HashMap 包含数据。哈希表的关键是组成员键,值是它们的渲染内容。

示例

use tera::Context;
use terarium::{Content, Template, TemplateGroupBuilder, TerariumBuilder};

/// The Terarium can create logical template groups and render them together,
fn main() {
  let mut builder = TerariumBuilder::default();

  builder.add_template(
    "greet_subject".to_owned(),
    Template::new(vec![
      Content::new("Greetings from {{sender}}".to_owned(), vec!["en".to_owned()]),
      Content::new("Pozdrav od {{sender}}".to_owned(), vec!["cs".to_owned()]),
    ]).unwrap(),
  ).unwrap();
  builder.add_template(
    "greet_text".to_owned(),
    Template::new(vec![
      Content::new("Hello {{username}}".to_owned(), vec!["en".to_owned()]),
      Content::new("Nazdar {{username}}".to_owned(), vec!["cs".to_owned()]),
    ]).unwrap(),
  ).unwrap();
  builder.add_template(
    "greet_html".to_owned(),
    Template::new(vec![
      Content::new("<p>Hello {{username}}</p>".to_owned(), vec!["en".to_owned()]),
      Content::new("<p>Nazdar {{username}}</p>".to_owned(), vec!["cs".to_owned()]),
    ]).unwrap()
  ).unwrap();

  builder.add_group(
    "greet_email".to_string(),
    TemplateGroupBuilder::default()
            .add_member("subject".to_owned(), "greet_subject".to_owned())
            .add_member("text".to_owned(), "greet_text".to_owned())
            .add_member("html".to_owned(), "greet_html".to_owned())
            .build(),
  ).unwrap();
  let terarium = builder.build().unwrap();

  let mut ctx = Context::new();
  ctx.insert("sender", "Jara Cimrman");
  ctx.insert("username", "Karel Capek");

  let rendered_group_en = terarium.render_group(&ctx, "greet_email", "en", None).unwrap();
  let rendered_group_cs = terarium.render_group(&ctx, "greet_email", "cs", None).unwrap();

  println!("\nEnglish");
  println!("=======\n");
  rendered_group_en.iter().for_each(|(member_key, content)| println!("{}: {}", member_key, content));

  println!("\nCzech");
  println!("=====\n");
  rendered_group_cs.iter().for_each(|(member_key, content)| println!("{}: {}", member_key, content));
}

输出

English
=======

text: Hello Karel Capek
subject: Greetings from Jara Cimrman
html: <p>Hello Karel Capek</p>

Czech
=====

html: <p>Nazdar Karel Capek</p>
subject: Pozdrav od Jara Cimrman
text: Nazdar Karel Capek

在项目的仓库中查看更多示例。

注意

这个库的名称没有错别字。双 r 可能会与 Terra 库混淆,后者完全超出了这个库的范围。:-)

0.3 版本中的变更

  • Template::add_content()TerariumBuilder::add_template()TerariumBuilder::add_group()方法不再可链式调用。(注意:这是不良的设计 - 当方法失败时,实例被消耗且无法恢复)。
  • Template::new()构造函数部分替代了已删除的链式API。

完整变更日志请参阅CHANGELOG.md。

依赖项

约7-16MB
约208K SLoC