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 = { "<": "<", ">": ">", '"': """, "'": "'", "&": "&" }; 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;