Allow natural multi-line code evaluation in templates.

By escaping `\r`, `\n`, and `\t` earlier, we can unescape
them along with backslashes and single quotes allowing
for the inclusion of single line comments and code without
a terminating semicolon.
This commit is contained in:
Brad Dunbar
2012-03-11 12:39:13 -04:00
parent 34305bc85d
commit 414fafb1f4
3 changed files with 29 additions and 11 deletions

View File

@@ -905,7 +905,15 @@
// Within an interpolation, evaluation, or escaping, remove HTML escaping
// that had been previously added.
var unescape = function(code) {
return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
return code.replace(/\\(\\|'|r|n|t)/g, function(match, char) {
switch (char) {
case '\\': return '\\';
case "'": return "'";
case 'r': return '\r';
case 'n': return '\n';
case 't': return '\t';
}
});
};
// JavaScript micro-templating, similar to John Resig's implementation.
@@ -917,18 +925,18 @@
'with(obj||{}){__p.push(\'' +
str.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.escape || noMatch, function(match, code) {
return "',_.escape(" + unescape(code) + "),'";
})
.replace(c.interpolate || noMatch, function(match, code) {
return "'," + unescape(code) + ",'";
})
.replace(c.evaluate || noMatch, function(match, code) {
return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
})
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
.replace(c.escape || noMatch, function(match, code) {
return "',_.escape(" + unescape(code) + "),\n'";
})
.replace(c.interpolate || noMatch, function(match, code) {
return "'," + unescape(code) + ",\n'";
})
.replace(c.evaluate || noMatch, function(match, code) {
return "');" + unescape(code) + ";\n__p.push('";
})
+ "');}return __p.join('');";
var func = new Function('obj', '_', tmpl);
if (data) return func(data, _);