עיבוד בסגנון Go html/template ב-Rust

go_html_template הוא crate ל-Rust שמחקה את תזרימי העבודה העיקריים של Go html/template. הוא תומך בתחביר תבניות, pipelines, escaping תלוי-context וחסימת סכימות URL לא בטוחות מסוג javascript:, תוך שמירה על צורת API מוכרת.

API לתבניות בסגנון Go

השתמשו ב-Template::new(...).parse(...).execute(...) עם יכולות define/template/range/with/pipeline.

Escaping מודע ל-context

מיישם escaping תלוי־context עבור טקסט HTML, attributes, URL attributes והקשרים של script/style, וחוסם כתובות 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 שלכם.