SimpleTemplateEngine builds a template from a
String, and then
make(bindings) replaces placeholders with values from the hash.
As advertised in the documentation, placeholders are given in JSP or GString style, so the problem is: how do we escape JSP and GString delimiters? That is, how can we insert a plain
$foo or a literal
<%=bar%> without the engine complaining about missing keys when binding?
First, the GString part. Your first bet would be using a backslash to escape the dollar. The intuition is right, but the implementation is tricky. For example using:
won’t work, because the backslash is taken from the GString before converting to String, and then you have a
"$foo" which can be evaluated as a GString placeholder from the template engine. We need to keep the backslash in that String, and the solution is a triple backslash:
\\ is a literal
\$ is a literal
$, so the engine receives a
\$foo, and won’t attempt to do any substitution. If you don’t like the triple escape, another option is:
which, to my understanding, means that the code will be evaluated as a GString, but instead of the name of a variable it finds a literal string, so doesn’t look for a value for the given name.