Просмотр исходного кода

Merge branch 'compiler' of github.com:thegrandpoobah/mustache.js into compiler

tags/0.5.0-vsc
unknown 16 лет назад
Родитель
Сommit
591c81d533
2 измененных файлов: 34 добавлений и 43 удалений
  1. +31
    -32
      mustache.js
  2. +3
    -11
      test/unit.interpreter.js

+ 31
- 32
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);


+ 3
- 11
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 <h1>this is an object</h1>\n <p>one of its attributes is a list</p>\n <ul>\n <li>listitem1</li>\n <li>listitem2</li>\n </ul>\n',
'\n <h1>this is an object</h1>\n <p>one of its attributes is a list</p>\n <ul>\n \n <li>listitem1</li>\n \n <li>listitem2</li>\n \n </ul>\n\n',
'Lazy match of Section and Inverted Section'
);
});
@@ -522,15 +522,7 @@ test("Demo", function() {
}
};
var expected_result = [
'<h1>Colors</h1>',
' <ul>',
' <li><strong>red</strong></li>',
' <li><a href="#Green">green</a></li>',
' <li><a href="#Blue">blue</a></li>',
' </ul>',
''
].join('\n');
var expected_result = '<h1>Colors</h1>\n\n <ul>\n \n \n <li><strong>red</strong></li>\n \n \n <li><a href=\"#Red\">red</a></li>\n \n \n \n \n <li><a href=\"#Green\">green</a></li>\n \n \n \n \n <li><a href=\"#Blue\">blue</a></li>\n \n \n </ul>\n\n';
equals(
Mustache.to_html(


Загрузка…
Отмена
Сохранить