رندر به سبک Go html/template در Rust

go_html_template یک crate برای Rust است که جریان‌های اصلی Go html/template را بازآفرینی می‌کند. از syntax قالب، pipelineها، escaping وابسته به context و جلوگیری از URLهای ناامن javascript: پشتیبانی می‌کند و در عین حال شکل API آشنا را حفظ می‌کند.

API قالب شبیه Go

از Template::new(...).parse(...).execute(...) همراه با امکانات define/template/range/with/pipeline استفاده کنید.

Escaping وابسته به context

escaping وابسته به context را برای متن HTML، attributeها، URL attributeها و contextهای script/style اعمال می‌کند و URLهای ناامن javascript: را مسدود می‌کند.

حالت web-rust

با feature `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 در حال حاضر جریان‌های اصلی را پیاده‌سازی می‌کند و هم‌زمان شکاف‌های سازگاری را کاهش می‌دهد . هنوز هدف آن سازگاری کاملاً 1:1 با Go html/template نیست، بنابراین رفتار آن را در قالب‌های production خود بررسی کنید.