Skip to content

Instantly share code, notes, and snippets.

@cliffordfajardo
Forked from Daniel-Hug/templating.js
Created January 18, 2016 03:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cliffordfajardo/ab44544e1c5181257b53 to your computer and use it in GitHub Desktop.
Save cliffordfajardo/ab44544e1c5181257b53 to your computer and use it in GitHub Desktop.
// Make strings safe for innerHTML and attribute insertion (templates):
var escapeHTML = (function() {
var entityMap = {
'&': '&',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;'
},
re = /[&<>"']/g;
return function(str) {
return String(str).replace(re, function (char) {
return entityMap[char];
});
};
})();
// Templating:
var tmp = {};
(function(regExp) {
function evalDots(obj, key) {
var keys = key.split('.');
var nextObj;
return keys.length ?
(nextObj = obj[keys[0]], (keys.length > 1 ?
(keys.shift(), evalDots(nextObj, keys.join('.'))) :
nextObj)) :
obj;
}
[].forEach.call(document.querySelectorAll('script[type="text/tmp"]'), function(el) {
var src = el.innerHTML;
tmp[el.id] = function(data) {
var newSrc = src.replace(regExp, function(match, key) {
var numCurlyBraces = match.length - key.length;
return numCurlyBraces % 2 ? match :
(numCurlyBraces === 6 ? evalDots(data, key) : escapeHTML(evalDots(data, key)));
});
return newSrc;
};
});
})(/{{{?([\w.]+)}}}?/g);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment