Skip to content

Instantly share code, notes, and snippets.

@blakeblackshear
Created December 28, 2011 01:08
Show Gist options
  • Save blakeblackshear/1525686 to your computer and use it in GitHub Desktop.
Save blakeblackshear/1525686 to your computer and use it in GitHub Desktop.
Improved doT
var doTnew = (function() {
var templateSettings = {
evaluate: /\{\{([\s\S]+?)\}\}/g,
interpolate: /\{\{=([\s\S]+?)\}\}/g,
encode: /\{\{!([\s\S]+?)\}\}/g,
varname: 'it',
strip : true,
concat: false
};
var ampRe = /&/g,
ltRe = /</g,
gtRe = />/g,
aposRe = /'/g,
quoteRe = /"/g;
function escape(str) {
return str.replace(ampRe,'&amp;')
.replace(ltRe,'&lt;')
.replace(gtRe,'&gt;')
.replace(aposRe, '&#39;')
.replace(quoteRe, "&quot;");
};
function replaceQuotesAndWhiteSpace(str){
return str.replace(/\\'/g, "'").replace(/\\\\/g,"\\").replace(/[\r\t\n]/g, ' ')
}
function createTemplateFn(tmpl) {
c = templateSettings;
var o = [4];
o[0]= "var u=this.u;var t=this.t;"
o[1]= c.concat ? "var out='';function p(str){out+=str};p('":"var count=0;var out=[500];function p(str){out[count++] = str;};p('";
o[2]=((c.strip) ? tmpl.replace(/\s*<!\[CDATA\[\s*|\s*\]\]>\s*|[\r\n\t]|(\/\*[\s\S]*?\*\/)/g, ''): tmpl)
.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.interpolate, function(match, code) {
return ["');p(",replaceQuotesAndWhiteSpace(code),");p('"].join('');
})
.replace(c.encode, function(match, code) {
return ["');p(","u.escape(",replaceQuotesAndWhiteSpace(code),"));p('"].join('');
})
.replace(c.evaluate, function(match, code) {
return ["');",replaceQuotesAndWhiteSpace(code),"p('"].join('');
});
o[3]=c.concat ? "');return out;":"');return out.join('');";
var str = o.join('')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
.replace(/\r/g, '\\r')
.replace(/p\(''\);/g, '');
try {
return new Function(c.varname, str);
} catch (e) {
if (typeof console !== 'undefined') console.log("Could not create a template function: " + str);
throw e;
}
};
var utils = {
escape: escape
};
var templates = {
};
return {
settings: templateSettings,
register: function(name, tmpl){
templates[name] = createTemplateFn(tmpl);
},
render: function(name, data){
return templates[name].call({u: utils, t: templates}, data);
}
};
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment