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 * (optional, enabled by default) macro to make safe html variables. * (optional, disabled by default) helpers to work with the DOM in a wasm context

The html_map! macro uses the minimal set of escapes (as per The XSS cheatsheet). If you need to have stronger guarantees, i.e. for sending data for attributes, then use html_map_strong! or build the hashmap the usual way and wrap the values with htmlescape::encode_attribute().

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>

The only dependency is the optional htmlescape

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:

```rust 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:

```rust 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) => { asserteq!( format!("{}", e), r#"missing key: "category"; extraneous key: "catglory""# ); } } ```

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

```rust 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, "<b>Cats</b> are my favorite <i>animal</i>."); `` Additional examples and weird edge-case behaviors can be found in src/tests`.

License

This project is licensed under either of