模板解析语法
defaults.parser = function (code, options) {
// var match = code.match(/([\w\$]*)(\b.*)/);
// var key = match[1];
// var args = match[2];
// var split = args.split(' ');
// split.shift(); code = code.replace(/^\s/, '');
var split = code.split(' ');
var key = split.shift();
var args = split.join(' '); switch (key) { case 'if':
code = 'if(' + args + '){';
break; case 'else':
if (split.shift() === 'if') {
split = ' if(' + split.join(' ') + ')';
} else {
split = '';
} code = '}else' + split + '{';
break; case '/if':
code = '}';
break; case 'each':
var object = split[0] || '$data';
var as = split[1] || 'as';
var value = split[2] || '$value';
var index = split[3] || '$index'; var param = value + ',' + index; if (as !== 'as') {
object = '[]';
} code = '$each(' + object + ',function(' + param + '){';
break; case '/each':
code = '});';
break; case 'echo':
code = 'print(' + args + ');';
break; case 'print':
case 'include':
code = key + '(' + split.join(',') + ');';
break; default:
// 过滤器(辅助方法)
// {{value | filterA:'abcd' | filterB}}
// >>> $helpers.filterB($helpers.filterA(value, 'abcd'))
// TODO: {{ddd||aaa}} 不包含空格
if (/^\s*\|\s*[\w\$]/.test(args)) {
var escape = true;
// {{#value | link}}
if (code.indexOf('#') === 0) {
code = code.substr(1);
escape = false;
} var i = 0;
var array = code.split('|');
var len = array.length;
var val = array[i++]; for (; i < len; i ++) {
val = filtered(val, array[i]);
} code = (escape ? '=' : '=#') + val; // 即将弃用 {{helperName value}}
} else if (template.helpers[key]) {
code = '=#' + key + '(' + split.join(',') + ');'; // 内容直接输出 {{value}}
} else {
code = '=' + code;
} break;
} return code;
};