diff --git a/mustache.js b/mustache.js index 6f2bb52..7dc75a6 100644 --- a/mustache.js +++ b/mustache.js @@ -10,11 +10,11 @@ var Mustache = function() { var Renderer = function() {}; - + Renderer.prototype = { otag: "{{", ctag: "}}", - + render: function(template, context) { // fail fast if(template.indexOf(this.otag) == -1) { @@ -25,18 +25,6 @@ var Mustache = function() { return this.render_tags(html, context); }, - create_context: function(_context) { - if(this.is_object(_context)) { - return _context; - } else { - return {'.': _context}; - } - }, - - is_object: function(a) { - return a && typeof a == 'object' - }, - /* Tries to find a partial in the global scope and render it */ @@ -67,18 +55,17 @@ var Mustache = function() { // for each {{#foo}}{{/foo}} section do... return template.replace(regex, function(match, name, content) { - var value = that.find(name, context); - if(that.is_array(value)) { // Enumerable, Let's loop! - return value.map(function(row) { - return that.render(content, that.merge(context, that.create_context(row))); - }).join(''); - } else if(value) { // boolean section - return that.render(content, context); - } else { - return ""; - } + var value = that.find(name, context); + if(that.is_array(value)) { // Enumerable, Let's loop! + return value.map(function(row) { + return that.render(content, that.merge(context, that.create_context(row))); + }).join(''); + } else if(value) { // boolean section + return that.render(content, context); + } else { + return ""; } - ); + }); }, /* @@ -86,12 +73,10 @@ var Mustache = function() { */ render_tags: function(template, context) { var lines = template.split("\n"); - + var new_regex = function() { - return new RegExp(that.otag + - "(=|!|<|\\{)?([^\/#]+?)\\1?" + - that.ctag + "+", - "g"); + return new RegExp(that.otag + "(=|!|<|\\{)?([^\/#]+?)\\1?" + + that.ctag + "+", "g"); }; // tit for tat @@ -99,27 +84,25 @@ var Mustache = function() { var regex = new_regex(); for (var i=0; i < lines.length; i++) { - lines[i] = lines[i].replace(regex, - function (match,operator,name) { - switch(operator) { - case "!": // ignore comments - return match; - case "=": // set new delimiters, rebuild the replace regexp - that.set_delimiters(name); - regex = new_regex(); - // redo the line in order to get tags with the new delimiters on the same line - i--; - return ""; - case "<": // render partial - return that.render_partial(name, context); - case "{": // the triple mustache is unescaped - return that.find(name, context); - default: // escape the value - return that.escape(that.find(name, context)); - }}, - this); + lines[i] = lines[i].replace(regex, function (match,operator,name) { + switch(operator) { + case "!": // ignore comments + return match; + case "=": // set new delimiters, rebuild the replace regexp + that.set_delimiters(name); + regex = new_regex(); + // redo the line in order to get tags with the new delimiters on the same line + i--; + return ""; + case "<": // render partial + return that.render_partial(name, context); + case "{": // the triple mustache is unescaped + return that.find(name, context); + default: // escape the value + return that.escape(that.find(name, context)); + } + },this); }; - return lines.join("\n"); }, @@ -177,7 +160,7 @@ var Mustache = function() { }, /* - Merges all properties of object `b` into object `a`. + Merges all properties of object `b` into object `a`. `b.property` overwrites a.property` */ merge: function(a, b) { @@ -195,6 +178,18 @@ var Mustache = function() { return _new; }, + create_context: function(_context) { + if(this.is_object(_context)) { + return _context; + } else { + return {'.': _context}; + } + }, + + is_object: function(a) { + return a && typeof a == 'object' + }, + /* Thanks Doug Crockford JavaScript — The Good Parts lists an alternative that works better with