审查视图

public/assets/libs/art-template/loader/runtime.js 2.3 KB
郭盛 authored
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
function template(content) {
    return compile(content);
};

var String = this.String;

function toString(value, type) {

    if (typeof value !== 'string') {

        type = typeof value;
        if (type === 'number') {
            value += '';
        } else if (type === 'function') {
            value = toString(value.call(value));
        } else {
            value = '';
        }
    }

    return value;

};


var escapeMap = {
    "<": "&#60;",
    ">": "&#62;",
    '"': "&#34;",
    "'": "&#39;",
    "&": "&#38;"
};


function escapeFn(s) {
    return escapeMap[s];
}


function escapeHTML(content) {
    return toString(content)
        .replace(/&(?![\w#]+;)|[<>"']/g, escapeFn);
};


var isArray = Array.isArray || function (obj) {
    return ({}).toString.call(obj) === '[object Array]';
};


function each(data, callback) {
    if (isArray(data)) {
        for (var i = 0, len = data.length; i < len; i++) {
            callback.call(data, data[i], i, data);
        }
    } else {
        for (i in data) {
            callback.call(data, data[i], i);
        }
    }
};


var utils = template.utils = {

    $helpers: {},

    $include: function () {
        throw new Error('art-template/loader: not support `include`.');
    },

    $string: toString,

    $escape: escapeHTML,

    $each: each

};


var helpers = template.helpers = utils.$helpers;


function compile(fn) {
    var render = function (data) {
        try {
            return new fn(data) + '';
        } catch (e) {
            return showDebugInfo(e)();
        }
    };

    render.prototype = fn.prototype = utils;
    render.toString = function () {
        return fn + '';
    };

    return render;
};


function showDebugInfo(e) {

    var type = "{Template Error}";
    var message = e.stack || '';

    if (message) {
        // 利用报错堆栈信息
        message = message.split('\n').slice(0, 2).join('\n');
    } else {
        // 调试版本,直接给出模板语句行
        for (var name in e) {
            message += "<" + name + ">\n" + e[name] + "\n\n";
        }
    }

    return function () {
        if (typeof console === "object") {
            console.error(type + "\n\n" + message);
        }
        return type;
    };
};

template.helper = function (name, helper) {
    helpers[name] = helper;
};

module.exports = template;