arTemplate解析语法

模板解析语法

defaults.parser = function (code, options) {
    // var match = code.match(/([w$]*)(.*)/);
    // 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;
};
请把你的疑问评论在下方。
原文地址:https://www.cnblogs.com/zzcit/p/5603108.html