การเรนเดอร์สไตล์ Go html/template ใน Rust

go_html_template คือ crate Rust ที่สะท้อนเวิร์กโฟลว์หลักของ Go html/template รองรับไวยากรณ์ของเทมเพลต pipeline การ escape ตาม context และการบล็อก URL scheme ที่ไม่ปลอดภัย โดยยังคงรูปแบบ API ที่คุ้นเคย

Template API แบบ Go

ใช้ Template::new(...).parse(...).execute(...) พร้อมฟีเจอร์ define/template/range/with/pipeline

การ escape ตามบริบท

ใช้การ escape ตาม context สำหรับข้อความ HTML, แอตทริบิวต์, URL attribute และบริบท script/style พร้อมบล็อก URL แบบ javascript: ที่ไม่ปลอดภัย

โหมด 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 รองรับเวิร์กโฟลว์หลักอยู่แล้ว และยังคงปิดช่องว่างด้านความเข้ากันได้เพิ่มเติมต่อไป แต่ยังไม่ใช่เป้าหมายความเข้ากันได้แบบ 1:1 กับ Go html/template ดังนั้นควรตรวจสอบพฤติกรรมในเทมเพลตที่ใช้จริงก่อนนำไปใช้ในโปรดักชัน