在 Rust 中实现 Go html/template 风格渲染。

go_html_template 是一个 Rust crate,用来复现 Go html/template 的主要工作流。它支持模板语法、pipeline、上下文感知转义,以及对不安全 URL scheme 的阻止,同时保持熟悉的 API 形态。

类 Go 模板 API

可使用 Template::new(...).parse(...).execute(...),并支持 define/template/range/with/pipeline 等特性。

上下文感知转义

针对 HTML 文本、属性、URL 属性以及 script/style 上下文应用上下文感知转义,并阻止不安全的 javascript: URL。

web-rust 模式

启用 web-rust 功能后,parse_files/parse_glob/parse_fs 会被禁用,以便强制仅从内存加载模板。

安装与基本用法

先添加 crate,然后验证一个最小化的 parse + execute_to_string 流程。在 web-rust 环境中,请使用内存中的模板字符串,而不是基于文件的加载 API。

安装

cargo add go_html_template

Rust 示例

src/main.rs
use go_html_template::{Template, Value};

fn main() -> Result<(), Box<dyn std::error::Error>> {
  let tpl = Template::new("page")
    .parse(r#"<h1>{{.Title}}</h1>\n<p>{{.Body | safe_html}}</p>"#)?;

  let out = tpl.execute_to_string(&serde_json::json!({
    "Title": "go_html_template",
    "Body": "<em>trusted</em>"
  }))?;

  println!("{out}");
  Ok(())
}
兼容性状态

go_html_template 当前 已经实现核心工作流,并在持续补齐兼容性差距 。它还不是与 Go html/template 严格 1:1 兼容的目标,因此请在生产模板中自行验证行为。