diff --git a/underscore.js b/underscore.js index e183d070a..1b2058f82 100644 --- a/underscore.js +++ b/underscore.js @@ -816,6 +816,11 @@ for (var i = 0; i < n; i++) iterator.call(context, i); }; + // Escape string for HTML + _.escape = function(string) { + return (''+string).replace(/&(?!\w+;|#\d+;|#x[\da-f]+;)/gi, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/'); + }; + // Add your own custom functions to the Underscore object, ensuring that // they're correctly added to the OOP wrapper as well. _.mixin = function(obj) { @@ -836,7 +841,8 @@ // following template settings to use alternative delimiters. _.templateSettings = { evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g + interpolate : /<%=([\s\S]+?)%>/g, + encode : /<%==([\s\S]+?)%>/g }; // JavaScript micro-templating, similar to John Resig's implementation. @@ -848,6 +854,9 @@ 'with(obj||{}){__p.push(\'' + str.replace(/\\/g, '\\\\') .replace(/'/g, "\\'") + .replace(c.encode, function(match, code) { + return "',_.escape(" + code.replace(/\\'/g, "'") + "),'"; + }) .replace(c.interpolate, function(match, code) { return "'," + code.replace(/\\'/g, "'") + ",'"; })