diff --git a/mustache.js b/mustache.js index 4441d73..ade8120 100644 --- a/mustache.js +++ b/mustache.js @@ -42,6 +42,7 @@ var Mustache = function() { createParserContext: function(tokens, partials, openTag, closeTag) { return { tokens: tokens, + token: function() { return this.tokens[this.index]; }, index: 0, length: tokens.length, partials: partials, @@ -157,19 +158,19 @@ var Mustache = function() { stateMachine: { text: function(parserContext, contextStack) { - switch (parserContext.tokens[parserContext.index]) { + switch (parserContext.token()) { case parserContext.openTag: this.commandSet.text.call(this); return 'openMustache'; default: - this.send_func(parserContext.tokens[parserContext.index]); + this.send_func(parserContext.token()); return 'text'; } }, openMustache: function(parserContext, contextStack) { - switch (parserContext.tokens[parserContext.index]) { + switch (parserContext.token()) { case '{': parserContext.stack.push({tagType:'unescapedVariable', subtype: 'tripleMustache'}); return 'keyName'; @@ -205,24 +206,24 @@ var Mustache = function() { } }, closeMustache: function(parserContext, contextStack) { - if (this.isWhitespace(parserContext.tokens[parserContext.index])) { + if (this.isWhitespace(parserContext.token())) { return 'closeMustache'; - } else if (parserContext.tokens[parserContext.index]===parserContext.closeTag) { + } else if (parserContext.token()===parserContext.closeTag) { return this.dispatchCommand(parserContext, contextStack); } }, expectClosingMustache: function(parserContext, contextStack) { if (parserContext.closeTag==='}}' && - parserContext.tokens[parserContext.index]==='}}') { + parserContext.token()==='}}') { return 'expectClosingParenthesis'; - } else if (parserContext.tokens[parserContext.index]==='}') { + } else if (parserContext.token()==='}') { return 'closeMustache'; } else { throw new ParserException('Unexpected token encountered.'); } }, expectClosingParenthesis: function(parserContext, contextStack) { - if (parserContext.tokens[parserContext.index]==='}') { + if (parserContext.token()==='}') { return this.dispatchCommand(parserContext, contextStack); } else { throw new ParserException('Unexpected token encountered.'); @@ -253,59 +254,59 @@ var Mustache = function() { } }, simpleKeyName: function(parserContext, contextStack) { - if (this.isWhitespace(parserContext.tokens[parserContext.index])) { + if (this.isWhitespace(parserContext.token())) { return 'simpleKeyName'; } else { - parserContext.stack.push(parserContext.tokens[parserContext.index]); + parserContext.stack.push(parserContext.token()); return 'closeMustache'; } }, setDelimiterStart: function(parserContext, contextStack) { - if (this.isWhitespace(parserContext.tokens[parserContext.index]) || - parserContext.tokens[parserContext.index]==='=') { + if (this.isWhitespace(parserContext.token()) || + parserContext.token()==='=') { throw new ParserException('Syntax error in Set Delimiter tag'); } else { - parserContext.stack.push(parserContext.tokens[parserContext.index]); + parserContext.stack.push(parserContext.token()); return 'setDelimiterStartOrWhitespace'; } }, setDelimiterStartOrWhitespace: function(parserContext, contextStack) { - if (this.isWhitespace(parserContext.tokens[parserContext.index])) { + if (this.isWhitespace(parserContext.token())) { return 'setDelimiterEnd'; - } else if (parserContext.tokens[parserContext.index]==='='){ + } else if (parserContext.token()==='='){ throw new ParserException('Syntax error in Set Delimiter tag'); } else { - parserContext.stack.push(parserContext.stack.pop() + parserContext.tokens[parserContext.index]); + parserContext.stack.push(parserContext.stack.pop() + parserContext.token()); return 'setDelimiterStartOrWhitespace'; } }, setDelimiterEnd: function(parserContext, contextStack) { - if (this.isWhitespace(parserContext.tokens[parserContext.index])) { + if (this.isWhitespace(parserContext.token())) { return 'setDelimiterEnd'; - } else if (parserContext.tokens[parserContext.index]==='=') { + } else if (parserContext.token()==='=') { throw new ParserException('Syntax error in Set Delimiter tag'); } else { - parserContext.stack.push(parserContext.tokens[parserContext.index]); + parserContext.stack.push(parserContext.token()); return 'setDelimiterEndOrEqualSign'; } }, setDelimiterEndOrEqualSign: function(parserContext, contextStack) { - if (parserContext.tokens[parserContext.index]==='=') { + if (parserContext.token()==='=') { return 'setDelimiterExpectClosingTag'; - } else if (this.isWhitespace(parserContext.tokens[parserContext.index])) { + } else if (this.isWhitespace(parserContext.token())) { throw new ParserException('Syntax error in Set Delimiter tag'); } else { - parserContext.stack.push(parserContext.stack.pop() + parserContext.tokens[parserContext.index]); + parserContext.stack.push(parserContext.stack.pop() + parserContext.token()); return 'setDelimiterEndOrEqualSign'; } }, setDelimiterExpectClosingTag: function(parserContext, contextStack) { - if (parserContext.tokens[parserContext.index]===parserContext.closeTag) { + if (parserContext.token()===parserContext.closeTag) { var newCloseTag = parserContext.stack.pop(); var newOpenTag = parserContext.stack.pop(); var command = parserContext.stack.pop(); @@ -337,32 +338,32 @@ var Mustache = function() { }, endSectionScan: function(parserContext, contextStack) { - switch (parserContext.tokens[parserContext.index]) { + switch (parserContext.token()) { case parserContext.openTag: return 'expectSectionOrEndSection'; default: - parserContext.stack[parserContext.stack.length-1].content.push(parserContext.tokens[parserContext.index]); + parserContext.stack[parserContext.stack.length-1].content.push(parserContext.token()); return 'endSectionScan'; } }, expectSectionOrEndSection: function(parserContext, contextStack) { - switch (parserContext.tokens[parserContext.index]) { + switch (parserContext.token()) { case '#': case '^': parserContext.stack[parserContext.stack.length-1].depth++; - parserContext.stack[parserContext.stack.length-1].content.push(parserContext.openTag + parserContext.tokens[parserContext.index]); + parserContext.stack[parserContext.stack.length-1].content.push(parserContext.openTag + parserContext.token()); return 'endSectionScan'; case '/': parserContext.stack.push({tagType:'endSection'}); return 'simpleKeyName'; default: - parserContext.stack[parserContext.stack.length-1].content.push(parserContext.openTag + parserContext.tokens[parserContext.index]); + parserContext.stack[parserContext.stack.length-1].content.push(parserContext.openTag + parserContext.token()); return 'endSectionScan'; } }, discard: function(parserContext, contextStack) { - if (parserContext.tokens[parserContext.index]===parserContext.closeTag) { + if (parserContext.token()===parserContext.closeTag) { return 'text'; } else { return 'discard'; @@ -381,10 +382,8 @@ var Mustache = function() { switch (command.tagType) { case 'section': - parserContext.stack.push({sectionType:'section', key:key, content:[], depth:1}); - return 'endSectionScan'; case 'invertedSection': - parserContext.stack.push({sectionType:'invertedSection', key:key, content:[], depth:1}); + parserContext.stack.push({sectionType:command.tagType, key:key, content:[], depth:1}); return 'endSectionScan'; case 'variable': this.commandSet.variable.call(this, key, contextStack); diff --git a/test/unit.interpreter.js b/test/unit.interpreter.js index 9cf8015..fac0bfd 100644 --- a/test/unit.interpreter.js +++ b/test/unit.interpreter.js @@ -224,7 +224,7 @@ test("'#' (Sections)", function() { }, {} ), - '\n t1\n 0\n t2\n 1\n\n t1\n 0\n t2\n 1\n\n', + '\n t1\n 0\n\n t2\n 1\n\n\n t1\n 0\n\n t2\n 1\n\n', 'Lazy match of Section and Inverted Section' ); @@ -241,7 +241,7 @@ test("'#' (Sections)", function() { }, {} ), - '\n

this is an object

\n

one of its attributes is a list

\n \n', + '\n

this is an object

\n

one of its attributes is a list

\n \n\n', 'Lazy match of Section and Inverted Section' ); }); @@ -522,15 +522,7 @@ test("Demo", function() { } }; - var expected_result = [ - '

Colors

', - ' ', - '' - ].join('\n'); + var expected_result = '

Colors

\n\n \n\n'; equals( Mustache.to_html(