3 个版本 (破坏性更新)
0.3.0 | 2023 年 12 月 28 日 |
---|---|
0.2.0 | 2023 年 12 月 28 日 |
0.1.0 | 2023 年 12 月 16 日 |
#14 在 #tera
每月 24 次下载
32KB
442 行
Terarium
Terarium 是一个库,用于使用 Tera 模板库渲染模板组。
安装
cargo install terarium
用法
要创建 Terarium
实例,使用 TerariumBuilder
。此构建器可以配置模板和分组,当您添加所有项目后,调用 build()
方法以检索 Terarium
实例。在准备 Template
实例时,您可以添加多个内容。每个内容绑定到一个语言键。但语言键可以分配多个内容。
实例就绪后,调用 render_template
或 render_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