12 releases

0.2.4 Nov 16, 2020
0.2.3 Aug 10, 2020
0.2.2 Jul 31, 2020
0.1.6 Jul 27, 2020

#366 in Template engine

MIT/Apache

26KB
521 lines

Simple Html Template

Crates.io Documentation

This is essentially a fork of far, with some additions:

  • a cache for re-use, as well as a higher-level cache for lookup by name
  • macro to make safe html variables.
  • (optional, disabled by default) helpers to work with the DOM in a wasm context

The html_map! and html_map_strong! macros use the htmlescape crate, which you must add as a dependency (or else compilation will fail when calling these macros)

Note that, like far, this crate does not deal with escaping the keys or replacements in any way. e.g. if for some reason you need the template to have a ${} literal.

The value of the HashMap which is passed to Template::render() must be AsRef<str>

Examples:


Provided with a string and a map, simple-html-template will attempt to find all the keys (delimited with ${}) in the template and replace them with the corresponding value in the map. For example:

let template = Template::new("${capitalized specific} are my favorite ${category}.")?;

let args = html_map!{
    "capitalized specific" => "Cats",
    "category" => "animal",
};

let s = template.render(&args)?;

assert_eq!(s, "Cats are my favorite animal.");

If it fails for some reason, an explanation of why will be returned:

let template = Template::new("${capitalized specific} are my favorite ${category}.")?;

let args = html_map!{
    "capitalized specific" => "Cats",
    // Note the typo here
    "catglory" => "animal",
};


match template.render(&args) {
    Ok(_) => panic!(),
    Err(e) => {
        assert_eq!(
            format!("{}", e),
            r#"missing key: "category"; extraneous key: "catglory""#
        );
    }
}

Note that if html is in the variable, it is escaped:

let template = Template::new("${capitalized specific} are my favorite ${category}.")?;

let args = html_map!{
    "capitalized specific" => "<b>Cats</b>",
    "category" => "<i>animal</i>",
};

let s = template.render(&args)?;

assert_eq!(s, "&lt;b&gt;Cats&lt;/b&gt; are my favorite &lt;i&gt;animal&lt;/i&gt;.");

Additional examples and weird edge-case behaviors can be found in src/tests.

License

This project is licensed under either of

Dependencies

~0–2MB
~40K SLoC