4个版本
0.2.6 | 2019年7月29日 |
---|---|
0.2.5 | 2019年7月26日 |
0.2.3 | 2019年6月12日 |
0.2.2 | 2019年6月7日 |
#9 in #pre-compiled
11KB
192 行
erst
一个用于创建字符串模板的小型库,类似于eRuby和JSP(使用尖括号百分号标签:<%= expr %>
)。
模板预先编译以提高速度和安全性,但启用dynamic
标志时提供部分动态渲染(需要一些配置)。
使用方法
use erst::Template;
#[derive(Template)]
#[template(path = "simple.erst", type = "html")]
pub struct Container<'a> {
pub collection: Vec<&'a str>,
}
fn main() {
println!("{}", Container { collection: vec!["Hello", "<>", "World"] });
}
当simple.erst
看起来像
<div>
<p>Hello!</p>
<%
let desc = format!("Here is your list of {} items:", self.collection.len());
-%>
<p><%= desc %></p>
<ul>
<% for x in &self.collection { -%>
<li><%= x %></li>
<%- } %>
</ul>
</div>
默认情况下,模板的path
将解析为当前项目上下文中的templates
目录内的文件(即,CARGO_MANIFEST_DIR
)。如果您需要更改此设置,可以将ERST_TEMPLATES_DIR
环境变量设置为适当的路径。请注意,这仅在构建时才是一个问题;由于模板已编译到您的二进制文件中,因此运行编译的二进制文件时不需要此结构/环境变量。
请注意,与Askama
和其他许多模板系统不同,您需要在模板文件中使用self
引用您的Template
项的任何成员。模板文件基本上是函数的主体,该函数接收&self
(其中self
是链接的Container
对象)。
请注意,与Askama和其他预先编译的模板系统一样,您可以引用您crate中可用的任何项(结构、函数等)。
目前,仅支持html
类型(或无),具有非常基本的HTML转义。要在模板文件中取消HTML内容的转义,请将内容包装在Raw中,例如。
erst::Raw("<p>Hello</p>")
动态
此库还提供了一种避免(重新)编译模板的静态/非Rust部分的方法。
要启用此功能,请在您的Cargo.toml
中添加以下内容:
[dependencies]
erst = { version = "0.2", features = ["dynamic"] }
[build-dependencies]
erst = { version = "0.2", features = ["dynamic"] }
还需要添加一个包含以下行的 build.rs
文件
fn main() {
// This function is a no-op when the `dynamic` feature is not enabled.
// It is safe to leave this in `build.rs` even when not using `dynamic`
erst::rerun_if_templates_changed().unwrap();
}
同时,您还必须安装一个辅助二进制文件,erst-prepare
cargo install erst-prepare
erst-prepare 是一个小型二进制文件,它将模板的代码部分复制到 $XDG_CACHE_HOME
,这样构建脚本就可以在模板代码部分发生更改时重新运行。
然后像这样运行您的项目
erst-prepare && cargo run
如果您有独特的设置,可能需要使用 --pkg-name
和 --templates-dir
标志来运行 erst-prepare
erst-prepare --pkg-name my-project --templates-dir /path/to/your/templates/dir
如果您使用的是 dynamic
并在构建之前没有运行 erst-prepare
,则您的模板可能无法正确渲染。
许可证:MIT
依赖关系
~5–7MB
~128K SLoC