| @@ -10,11 +10,11 @@ | |||||
| var Mustache = function() { | var Mustache = function() { | ||||
| var Renderer = function() {}; | var Renderer = function() {}; | ||||
| Renderer.prototype = { | Renderer.prototype = { | ||||
| otag: "{{", | otag: "{{", | ||||
| ctag: "}}", | ctag: "}}", | ||||
| render: function(template, context) { | render: function(template, context) { | ||||
| // fail fast | // fail fast | ||||
| if(template.indexOf(this.otag) == -1) { | if(template.indexOf(this.otag) == -1) { | ||||
| @@ -25,18 +25,6 @@ var Mustache = function() { | |||||
| return this.render_tags(html, context); | 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 | 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... | // for each {{#foo}}{{/foo}} section do... | ||||
| return template.replace(regex, function(match, name, content) { | 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) { | render_tags: function(template, context) { | ||||
| var lines = template.split("\n"); | var lines = template.split("\n"); | ||||
| var new_regex = function() { | 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 | // tit for tat | ||||
| @@ -99,27 +84,25 @@ var Mustache = function() { | |||||
| var regex = new_regex(); | var regex = new_regex(); | ||||
| for (var i=0; i < lines.length; i++) { | 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"); | 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` | `b.property` overwrites a.property` | ||||
| */ | */ | ||||
| merge: function(a, b) { | merge: function(a, b) { | ||||
| @@ -195,6 +178,18 @@ var Mustache = function() { | |||||
| return _new; | 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 | Thanks Doug Crockford | ||||
| JavaScript — The Good Parts lists an alternative that works better with | JavaScript — The Good Parts lists an alternative that works better with | ||||