forked from yanhaijing/template.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- 大幅优化渲染速度,测试显示提速4倍以上 - 添加对输出变量未定义时的容错处理,不会在报错,而是返回空字符串 - 添加供预编译处理器使用的接口
- Loading branch information
1 parent
e8c934f
commit bff0e52
Showing
9 changed files
with
315 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
{ | ||
"name": "template.js", | ||
"main": "template.js", | ||
"version": "0.5.0", | ||
"version": "0.6.0", | ||
"homepage": "https://github.com/yanhaijing/template.js", | ||
"authors": [ | ||
"yanhaijing <[email protected]>" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,256 @@ | ||
/*! | ||
* template.js v0.6.0 (https://github.com/yanhaijing/template.js) | ||
* API https://github.com/yanhaijing/template.js/blob/master/doc/api.md | ||
* Copyright 2015 yanhaijing. All Rights Reserved | ||
* Licensed under MIT (https://github.com/yanhaijing/template.js/blob/master/MIT-LICENSE.txt) | ||
*/ | ||
;(function(root, factory) { | ||
var template = factory(root); | ||
if (typeof define === 'function' && define.amd) { | ||
// AMD | ||
define('template', function() { | ||
return template; | ||
}); | ||
} else if (typeof exports === 'object') { | ||
// Node.js | ||
module.exports = template; | ||
} else { | ||
// Browser globals | ||
var _template = root.template; | ||
|
||
template.noConflict = function() { | ||
if (root.template === template) { | ||
root.template = _template; | ||
} | ||
|
||
return template; | ||
}; | ||
root.template = template; | ||
} | ||
}(this, function(root) { | ||
'use strict'; | ||
var o = { | ||
sTag: '<%',//开始标签 | ||
eTag: '%>',//结束标签 | ||
compress: false,//是否压缩html | ||
escape: true, //默认输出是否进行HTML转义 | ||
error: function (e) {}//错误回调 | ||
}; | ||
var toString = {}.toString; | ||
|
||
function getType(x) { | ||
if(x === null){ | ||
return 'null'; | ||
} | ||
|
||
var t= typeof x; | ||
|
||
if(t !== 'object'){ | ||
return t; | ||
} | ||
|
||
var c = toString.call(x).slice(8, -1).toLowerCase(); | ||
if(c !== 'object'){ | ||
return c; | ||
} | ||
|
||
if(x.constructor==Object){ | ||
return c; | ||
} | ||
|
||
return 'unkonw'; | ||
} | ||
|
||
function isObject(obj) { | ||
return getType(obj) === 'object'; | ||
} | ||
function extend() { | ||
var target = arguments[0] || {}; | ||
var arrs = Array.prototype.slice.call(arguments, 1); | ||
var len = arrs.length; | ||
|
||
for (var i = 0; i < len; i++) { | ||
var arr = arrs[i]; | ||
for (var name in arr) { | ||
target[name] = arr[name]; | ||
} | ||
|
||
} | ||
return target; | ||
} | ||
function encodeHTML(source) { | ||
return String(source) | ||
.replace(/&/g,'&') | ||
.replace(/</g,'<') | ||
.replace(/>/g,'>') | ||
.replace(/\\/g,'\') | ||
.replace(/"/g,'"') | ||
.replace(/'/g,'''); | ||
}; | ||
function compress(html) { | ||
return html.replace(/\s+/g, ' ').replace(/<!--[\w\W]*?-->/g, ''); | ||
} | ||
function handelError(e) { | ||
var message = 'template.js error\n\n'; | ||
|
||
for (var key in e) { | ||
message += '<' + key + '>\n' + e[key] + '\n\n'; | ||
} | ||
message += '<message>\n' + e.message + '\n\n'; | ||
console && console.error && console.error(message); | ||
|
||
o.error(e); | ||
function error() { | ||
return 'template.js error'; | ||
} | ||
error.toString = function () { | ||
return '__str__ = "template.js error"'; | ||
} | ||
return error; | ||
} | ||
function parse(tpl, opt) { | ||
var code = ''; | ||
var sTag = opt.sTag; | ||
var eTag = opt.eTag; | ||
var escape = opt.escape; | ||
function parsehtml(line) { | ||
// 单双引号转义,换行符替换为空格 | ||
line = line.replace(/('|")/g, '\\$1').replace(/\n/g, ' '); | ||
return ';__code__ += ("' + line + '")\n'; | ||
} | ||
function parsejs(line) { | ||
var html; | ||
if (line.search(/^=/) !== -1) { | ||
//默认输出 | ||
html = line.slice(1); | ||
html = escape ? ('__encodeHTML__(typeof (' + html + ') === "undefined" ? "" : ' + html + ')') : html; | ||
return ';__code__ += (' + html + ')\n'; | ||
} | ||
|
||
if (line.search(/^:h=/) !== -1) { | ||
//HTML转义输出 | ||
html = line.slice(3); | ||
return ';__code__ += (__encodeHTML__(typeof (' + html + ') === "undefined" ? "" : ' + html + '))\n'; | ||
} | ||
|
||
if (line.search(/^:=/) !== -1) { | ||
//不转义 | ||
html = line.slice(2); | ||
return ';__code__ += (typeof (' + html + ') === "undefined" ? "" : ' + html + ')\n'; | ||
} | ||
|
||
if (line.search(/^:u=/) !== -1) { | ||
//URL转义 | ||
html = line.slice(3); | ||
return ';__code__ += (typeof (' + html + ') === "undefined" ? "" : encodeURI(' + html + '))\n'; | ||
} | ||
|
||
//原生js | ||
return ';' + line + '\n'; | ||
} | ||
|
||
var tokens = tpl.split(sTag); | ||
|
||
for (var i = 0, len = tokens.length; i < len; i++) { | ||
var token = tokens[i].split(eTag); | ||
|
||
if (token.length === 1) { | ||
code += parsehtml(token[0]); | ||
} else { | ||
code += parsejs(token[0], true); | ||
if (token[1]) { | ||
code += parsehtml(token[1]); | ||
} | ||
} | ||
} | ||
|
||
return code; | ||
} | ||
function compiler(tpl, opt) { | ||
var mainCode = parse(tpl, opt); | ||
|
||
var headerCode = '\n' + | ||
' var html = (function (__data__, __encodeHTML__) {\n' + | ||
' var __str__ = "", __code__ = "";\n' + | ||
' for(var key in __data__) {\n' + | ||
' __str__+=("var " + key + "=__data__[\'" + key + "\'];");\n' + | ||
' }\n' + | ||
' eval(__str__);\n\n'; | ||
|
||
var footerCode = '\n' + | ||
' ;return __code__;\n' + | ||
' }(__data__, __encodeHTML__));\n' + | ||
' return html;\n'; | ||
|
||
var code = headerCode + mainCode + footerCode; | ||
code = code.replace(/[\r]/g, ' '); // ie 7 8 会报错,不知道为什么 | ||
try { | ||
var Render = new Function('__data__', '__encodeHTML__', code); | ||
Render.toString = function () { | ||
return mainCode; | ||
} | ||
return Render; | ||
} catch(e) { | ||
e.temp = 'function anonymous(__data__, __encodeHTML__) {' + code + '}'; | ||
throw e; | ||
} | ||
} | ||
function compile(tpl, opt) { | ||
opt = extend({}, o, opt); | ||
|
||
try { | ||
var Render = compiler(tpl, opt); | ||
} catch(e) { | ||
e.name = 'CompileError'; | ||
e.tpl = tpl; | ||
e.render = e.temp; | ||
delete e.temp; | ||
return handelError(e); | ||
} | ||
|
||
function render(data) { | ||
try { | ||
var html = Render(data, encodeHTML); | ||
html = opt.compress ? compress(html) : html; | ||
return html; | ||
} catch(e) { | ||
e.name = 'RenderError'; | ||
e.tpl = tpl; | ||
e.render = Render.toString(); | ||
return handelError(e); | ||
} | ||
} | ||
|
||
render.toString = function () { | ||
return Render.toString(); | ||
}; | ||
return render; | ||
} | ||
function template(tpl, data) { | ||
if (typeof tpl !== 'string') { | ||
return ''; | ||
} | ||
|
||
var fn = compile(tpl); | ||
if (!isObject(data)) { | ||
return fn; | ||
} | ||
|
||
return fn(data); | ||
} | ||
|
||
template.config = function (option) { | ||
if (isObject(option)) { | ||
o = extend(o, option); | ||
} | ||
|
||
return extend({}, o); | ||
}; | ||
|
||
template.__encodeHTML = encodeHTML; | ||
template.__compress = compress; | ||
template.__handelError = handelError; | ||
template.__compile = compile; | ||
template.version = '0.6.0'; | ||
return template; | ||
})); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.