|
- // 定义模板引擎的语法
-
-
- defaults.openTag = '{{';
- defaults.closeTag = '}}';
-
-
- var filtered = function (js, filter) {
- var parts = filter.split(':');
- var name = parts.shift();
- var args = parts.join(':') || '';
-
- if (args) {
- args = ', ' + args;
- }
-
- return '$helpers.' + name + '(' + js + args + ')';
- }
-
-
- 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;
- };
-
|