This is what the template format looks like
Code Block | ||
---|---|---|
| ||
<p>$NAME$ has $$$ID$ - $Life$ - Everybody wishes they had more $$$$$</p>$ |
$ characters can be represented by a double string. In programming web applications is often useful to be able to have a templating function.
This is a templating function (rather a library) that aligns with avoiding complexity, safety by design and separation of concerns.
This is how one would use such a template:
Code Block | breakoutMode | wide|
---|---|---|
| ||
var MAINtemplate=/*html*/`<p>$NAME$ `<p>$Name$ has $$$ID$$$$Amount$ -in $Life$their - Everybody wishes they had more $$$$$</p>$`bank account.</p>$ <p>----</p> `; function MAINrun(){ var Body = document.querySelector('body'); var Data = [{IDAmount : 55, NAMEName : " Fred <the knife>" }, {IDAmount : 45 , NAMEName : "Mary"}]; Body.innerHTML = TEMexpand(Data, MAINtemplate); } READYevent(MAINrun); |
This is the code for the TEMexpand functioncode would produce:
Code Block |
---|
function TEMconvertString(V){
if (!V) { return ''} else { return V.toString(); }
}
function TEMexpandLine(Tokens, Row, Array){
console.log(Tokens);
for (var i =0; i < Tokens.length-1; i+=2){
Array.push(Tokens[i]);
Array.push(TEMconvertString(Row[Tokens[i+1]]).replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"))
}
Array.push(Tokens[Tokens.length-1]);
}
function TEMexpand(Data, Template){
var Array = [];
var Tokens = Template.replaceAll("$$", "_FuNkYDolARAM").split('$');
for (var i =0; i < Data.length; i++){
TEMexpandLine(Tokens, Data[i], Array);
}
console.log(Array);
return Array.join('').replaceAll("_FuNkYDolARAM", "$");
} |
What are the advantages compared to using a more fully featured templating system like Mustache.
All data is automatically escaped for special HTML characters. This eliminates cognitive load of having to pick whether or not to escape data and eliminates a lot of bugs.
The library is small - you can see exactly what it does in one screenful of code. No big mysteries as to what it does
Zero fancy features - nothing whatsoever resembling a language with if conditionals and so on. Therefore zero danger of the templating library becoming a crappy language.
There are no fancy callback features to tempt developers to write complicated code. It’s only going to work with an array of data.
No caching or other unnecessary pre-mature optimizations - simple code will be faster anyway.
Putting the responsibility elsewhere for handling logic in absence of data etc. Encouraging separation of concerns.
The code does use some techniques which are worth understanding:
...
We use an array of string and concatenate them at the end for performance.
...
We escape characters like & < and > to translate into HTML entities so that data can be not mis-interpreted and HTML markup.
...
Fred has $55 in their bank account.
----
Mary has $45 in their bank account.
---- |
TEMexpand is implemented couple of dozen lines of code. You can get the source here.
So why use this instead of a fully featured templating system like Mustache?