Comparing version 3.7.2 to 3.7.5
#!/usr/bin/env node | ||
var path=require("path"),fs=require("fs"),utils=require("real-utils"),CmdLine=require("cmdline"),pkg=require("../package.json"),compile=require("../lib/compile"),cmdLine=new CmdLine,cwd=process.cwd(),src=cmdLine.args[0],dst=cmdLine.args[1];if(cmdLine.options.has("-v"))console.log(pkg.rawName+" "+pkg.version);else if(utils.isNull(src)||utils.isNull(dst))console.log("usage: tp <src> <dst>");else{src=path.resolve(cwd,src),dst=path.resolve(cwd,dst);var funcName=path.basename(dst).split(".")[0],srcBuffer=fs.readFileSync(src).toString(),dstBuffer=compile(funcName,srcBuffer);fs.writeFileSync(dst,dstBuffer)} | ||
var path = require('path'); | ||
var fs = require('fs'); | ||
var utils = require('ntils'); | ||
var cmdLine = require('cmdline'); | ||
var pkg = require('../package.json'); | ||
var compile = require('../lib/compile'); | ||
var cwd = process.cwd(); | ||
var helpInfo = 'usage: tp <src> <dst>'; | ||
cmdLine | ||
.version(pkg.rawName + ' ' + pkg.version) | ||
.help(helpInfo) | ||
.handle({ arguments: true }, function ($0, $1) { | ||
var src = path.resolve(cwd, $0); | ||
var dst = path.resolve(cwd, $1); | ||
var funcName = path.basename(dst).split('.')[0]; | ||
var srcBuffer = fs.readFileSync(src).toString(); | ||
var dstBuffer = compile(funcName, srcBuffer); | ||
fs.writeFileSync(dst, dstBuffer); | ||
return false; | ||
}) | ||
.handle(function () { | ||
console.log(helpInfo); | ||
}) | ||
.ready(); |
@@ -1,9 +0,30 @@ | ||
/** | ||
* tp.js - 最简洁高效的js模板引擎! | ||
* @version v3.7.2 | ||
* @link http://houfeng.net/tp | ||
* @license MIT | ||
* @author Houfeng | ||
* @email admin@xhou.net | ||
*/ | ||
var tp=require("../"),fs=require("fs"),path=require("path"),uglifyJs=require("uglify-js"),pkg=require("../package.json"),compileTmpl=tp.compile(fs.readFileSync(path.normalize(__dirname+"/compile.tp")).toString()),createHandler=tp._createHandler.toString(),controlledExecute=tp._controlledExecute.toString(),extend=tp.extend.toString(),inArray=tp._inArray.toString();module.exports=function(e,r){var t=tp.compile(r),n=compileTmpl({name:e||"unknown",src:t.src,createHandler:createHandler,controlledExecute:controlledExecute,extend:extend,inArray:inArray,engine:pkg.rawName+" "+pkg.version}),i=uglifyJs.minify(n,{fromString:!0});return"/* compiled by tp */\n"+i.code}; | ||
var tp = require('../'); | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
var uglifyJs = require("uglify-js"); | ||
var pkg = require('../package.json'); | ||
var os = require('os'); | ||
var compileTmpl = tp.compile(fs.readFileSync(path.normalize(__dirname + '/compile.tp')).toString()); | ||
var createHandler = tp._createHandler.toString(); | ||
var controlledExecute = tp._controlledExecute.toString(); | ||
var extend = tp.extend.toString(); | ||
var inArray = tp._inArray.toString(); | ||
module.exports = function (name, srcBuffer) { | ||
var func = tp.compile(srcBuffer); | ||
var dstBuffer = compileTmpl({ | ||
"name": name || 'unknown', | ||
"src": func.src, | ||
"createHandler": createHandler, | ||
"controlledExecute": controlledExecute, | ||
"extend": extend, | ||
"inArray": inArray, | ||
"engine": pkg.rawName + ' ' + pkg.version, | ||
"EOL": os.EOL | ||
}); | ||
var result = uglifyJs.minify(dstBuffer, { | ||
fromString: true | ||
}); | ||
return '/* compiled by tp */\n' + result.code; | ||
}; |
224
lib/tp.js
@@ -1,9 +0,215 @@ | ||
/** | ||
* tp.js - 最简洁高效的js模板引擎! | ||
* @version v3.7.2 | ||
* @link http://houfeng.net/tp | ||
* @license MIT | ||
* @author Houfeng | ||
* @email admin@xhou.net | ||
*/ | ||
!function(e){"use strict";function n(e){return e?(e=e.replace(new RegExp("\\{1}","gim"),"\\\\"),e=e.replace(new RegExp("\r{1}","gim"),""),e=e.replace(new RegExp("\n{1}","gim"),"\\n"),e=e.replace(new RegExp("\r{1}","gim"),"\\r"),e=e.replace(new RegExp('"{1}',"gim"),'\\"')):""}function r(e){return e?e.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"):""}function t(e,n){for(var r in e)if(e[r]===n)return!0;return!1}function u(e,n){try{return e()}catch(r){throw r.message=r.message||"",r.message=n+" : "+r.message,r}}function i(e,n){if(e){n=n||c;for(var r in e){if(t(["func","push","model","buffer"],r))throw'Can not expand "'+r+' function"';n[r]=e[r]}}}function o(e,n,r){var t=function(e){t.push(e)};t.push=function(e){t.buffer.push(e)};for(var u in r)r[u]&&i(r[u],t);return t.func=e,t.model=null!==n&&void 0!=n?n:"",t.buffer=[],t}function p(r,t){r=r||"",t=t||{};for(var i=t.codeBegin||e.codeBegin,p=t.codeEnd||e.codeEnd,l=new RegExp(i,"gim"),f=new RegExp(p,"gim"),a=new RegExp("("+i+"(.|\\\n|\\\r)*?"+p+")","gim"),d=new RegExp(i+"\\s*=","gim"),s=['"use strict"'],g=r.match(a)||[],m=r.replace(a,"▎").split("▎")||[],v=0;v<m.length;v++){var x=n(m[v]),h=g[v];s.push('$.push("'+x+'")'),null!==h&&"undefined"!=typeof h&&(d.lastIndex=0,h=d.test(h)?"$.push("+h.replace(d,"").replace(f,"")+")":h.replace(l,"").replace(f,""),s.push(h))}s.push('return $.buffer.join("");');var w=function(e,n){return w.exec(e,n)};return u(function(){w.src=new Function("$","$$",s.join(";"))},"Template compile error"),w.exec=function(e,n){n=n||{};var r=o(w,e,[c,t.extend,n.extend]);return u(function(){return r.result=r.func.src.call(r.model,r,r.model)||"",n.returnHandler?r:r.result},"Template execute error")},w}e.version="3.7.2";var c={};e.codeBegin="<%",e.codeEnd="%>",e.extend=i,e.compile=function(e,n){return p(e,n)},e.parse=function(e,n,r,t){var u=p(e,r);return u(n,t)},e._createHandler=o,e._controlledExecute=u,e._inArray=t,"undefined"!=typeof window&&window.document&&(e.query=function(e){return window.document.getElementById(e)},e.bind=function(n){n=n||{};var t=n.query||e.query;if(n.el=n.el||n.element,n.el="string"==typeof n.el?t(n.el):n.el,n.tp=n.tp||n.template||n.el,n.tp="string"==typeof n.tp?t(n.tp)||n.tp:n.tp,n.tp&&n.el){var u=p(r(n.tp.innerHTML||n.tp),n);n.append?n.el.innerHTML+=u(n.model):n.el.innerHTML=u(n.model)}})}(function(){var e={};return"undefined"!=typeof exports&&(e=exports,e.env=e.env||[],e.env.push("commaonjs")),"function"==typeof define&&define.amd&&(e.env=e.env||[],e.env.push("amd"),define("tp",[],function(){return e})),(null==e.env||e.env.length<1)&&(e.env=e.env||[],e.env.push("general"),this.tp=e),e}()); | ||
(function (owner) { | ||
"use strict"; | ||
//引擎版本 | ||
owner.version = '{{version}}'; | ||
//处理输出转义 | ||
function outTransferred(text) { | ||
if (!text) return ''; | ||
text = text.replace(new RegExp('\\{1}', 'gim'), '\\\\'); | ||
text = text.replace(new RegExp('\r{1}', 'gim'), ''); | ||
text = text.replace(new RegExp('\n{1}', 'gim'), '\\n'); | ||
text = text.replace(new RegExp('\r{1}', 'gim'), '\\r'); | ||
text = text.replace(new RegExp('\"{1}', 'gim'), '\\"'); | ||
return text; | ||
} | ||
//处理输入转义 | ||
function inTransferred(text) { | ||
if (!text) return ''; | ||
return text.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); | ||
} | ||
//检查是否在数组中 | ||
function inArray(array, item) { | ||
for (var i in array) { | ||
if (array[i] === item) { | ||
return true; | ||
} | ||
}; | ||
return false; | ||
}; | ||
//执行一个函数 | ||
function controlledExecute(fn, message) { | ||
try { | ||
return fn(); | ||
} catch (ex) { | ||
ex.message = ex.message || ""; | ||
ex.message = message + " : " + ex.message; | ||
throw ex; | ||
} | ||
} | ||
//全局扩展容器,全局扩展作用于所有编译或解释的模板 | ||
var gloablExtend = {}; | ||
//扩展函数,如果 det 为空就暂挂到 gloablExtend 上 | ||
function extend(src, dst) { | ||
if (!src) return; | ||
dst = dst || gloablExtend; | ||
for (var name in src) { | ||
if (!inArray(['func', 'push', 'model', 'buffer'], name)) { | ||
dst[name] = src[name]; | ||
} else { | ||
throw 'Can not expand "' + name + ' function"'; | ||
} | ||
} | ||
} | ||
//创建模板上下文句柄,即模块中的 $ | ||
function createHandler(func, model, _extends) { | ||
var handler = function (text) { | ||
handler.push(text); | ||
}; | ||
handler.push = function (text) { | ||
handler.buffer.push(text); | ||
}; | ||
for (var i in _extends) { | ||
if (_extends[i]) extend(_extends[i], handler); | ||
} | ||
handler.func = func; | ||
handler.model = ((model !== null && model != undefined) ? model : ''); | ||
handler.buffer = []; | ||
return handler; | ||
} | ||
//编译一个模板 | ||
//编译模板时可以指定 options.extend 指定编译扩展 | ||
//编译扩展公针当前模板有效,无论第几次执行模板 | ||
function compile(source, options) { | ||
source = source || ''; | ||
options = options || {}; | ||
var codeBegin = options.codeBegin || owner.codeBegin; | ||
var codeEnd = options.codeEnd || owner.codeEnd; | ||
var codeBeginExp = new RegExp(codeBegin, 'gim'); | ||
var codeEndExp = new RegExp(codeEnd, 'gim'); | ||
//提取代码块(包括开始、结束标记) | ||
var codeExp = new RegExp('(' + codeBegin + '(.|\\\n|\\\r)*?' + codeEnd + ')', 'gim'); | ||
//验证输出表达式 | ||
var outCodeExp = new RegExp(codeBegin + '\\\s*=', 'gim'); | ||
//-- | ||
var codeBuffer = ['"use strict"']; | ||
var codeBlocks = source.match(codeExp) || []; | ||
var textBlocks = source.replace(codeExp, '▎').split('▎') || []; | ||
for (var i = 0; i < textBlocks.length; i++) { | ||
var text = outTransferred(textBlocks[i]); | ||
var code = codeBlocks[i]; | ||
codeBuffer.push('$.push("' + text + '")'); | ||
if (code !== null && typeof code !== 'undefined') { | ||
outCodeExp.lastIndex = 0; | ||
if (outCodeExp.test(code)) { | ||
code = '$.push(' + code.replace(outCodeExp, '').replace(codeEndExp, '') + ')'; | ||
} else { | ||
code = code.replace(codeBeginExp, '').replace(codeEndExp, ''); | ||
} | ||
codeBuffer.push(code); | ||
} | ||
} | ||
codeBuffer.push('return $.buffer.join("");'); | ||
//构造模板函数 | ||
//模板执行时,可以指定 execOptions, execOptions.extend 执行扩展仅对本次执行有效 | ||
var func = function (model, execOptions) { | ||
return func.exec(model, execOptions); | ||
}; | ||
//编译模板函数 | ||
controlledExecute(function () { | ||
func.src = new Function("$", "$$", codeBuffer.join(';')); | ||
}, "Template compile error"); | ||
//生成执行函数 | ||
func.exec = function (model, execOptions) { | ||
execOptions = execOptions || {}; | ||
var handler = createHandler(func, model, [gloablExtend, options.extend, execOptions.extend]); | ||
return controlledExecute(function () { | ||
//this 当前数据模型,$ 参数为 Handler,$$ 参数为当前数据模型 | ||
handler.result = (handler.func.src.call(handler.model, handler, handler.model) || ''); | ||
return execOptions.returnHandler ? handler : handler.result; | ||
}, "Template execute error"); | ||
}; | ||
return func; | ||
} | ||
owner.codeBegin = '\<\%'; | ||
owner.codeEnd = '\%\>'; | ||
/** | ||
* 扩展引擎功能 | ||
*/ | ||
owner.extend = extend; | ||
/** | ||
* 编译一个模板,source:模板源字符串,options编译选项 | ||
* 编译模板时可以指定 options.extend 指定编译扩展 | ||
* 编译扩展公针当前模板有效,无论第几次执行模板 | ||
*/ | ||
owner.compile = function (source, options) { | ||
return compile(source, options); | ||
}; | ||
/** | ||
* 解析模板,source:模板源字符串,model:数据模型 | ||
* options 为编译选项,编译模板时可以指定 options.extend 指定编译扩展 | ||
* 模板执行时,可以指定execOptions, execOptions.extend 执行扩展仅对本次执行有效 | ||
*/ | ||
owner.parse = function (source, model, options, execOptions) { | ||
var fn = compile(source, options); | ||
return fn(model, execOptions); | ||
}; | ||
/** | ||
* 非公开 API 用于 cli | ||
*/ | ||
owner._createHandler = createHandler; | ||
owner._controlledExecute = controlledExecute; | ||
owner._inArray = inArray; | ||
/** | ||
* 如果在浏览器环境,添加针对DOM的扩展方法; | ||
*/ | ||
if (typeof window !== 'undefined' && window.document) { | ||
owner.query = function (id) { | ||
return window.document.getElementById(id); | ||
}; | ||
owner.bind = function (options) { | ||
options = options || {}; | ||
var query = options.query || owner.query; | ||
options.el = options.el || options.element; | ||
options.el = (typeof options.el === 'string') ? query(options.el) : options.el; | ||
options.tp = options.tp || options.template || options.el; | ||
options.tp = (typeof options.tp === 'string') ? (query(options.tp) || options.tp) : options.tp; | ||
if (!options.tp || !options.el) return; | ||
var tempFunc = compile(inTransferred(options.tp.innerHTML || options.tp), options); | ||
if (options.append) { | ||
options.el.innerHTML += tempFunc(options.model); | ||
} else { | ||
options.el.innerHTML = tempFunc(options.model); | ||
} | ||
}; | ||
} | ||
})((function () { | ||
var owner = {}; | ||
//支持CommonJS规范 | ||
if (typeof exports !== 'undefined') { | ||
owner = exports; | ||
owner.env = owner.env || []; | ||
owner.env.push("commaonjs"); | ||
} | ||
//支持AMD规范 | ||
if (typeof define === 'function' && define.amd) { | ||
owner.env = owner.env || []; | ||
owner.env.push("amd"); | ||
define('tp', [], function () { | ||
return owner; | ||
}); | ||
} | ||
//常规方式,挂在 this 对象上 | ||
if (owner.env == null || owner.env.length < 1) { | ||
owner.env = owner.env || []; | ||
owner.env.push("general"); | ||
this.tp = owner; | ||
} | ||
return owner; | ||
})()); | ||
//end. |
{ | ||
"name": "tpjs", | ||
"rawName": "tp", | ||
"version": "3.7.2", | ||
"version": "3.7.5", | ||
"description": "最简洁高效的js模板引擎!", | ||
@@ -36,5 +36,5 @@ "main": "./lib/tp.js", | ||
"dependencies": { | ||
"cmdline": "0.0.5", | ||
"real-utils": "0.0.1", | ||
"uglify-js": "^2.4.24" | ||
"cmdline": "^1.0.5", | ||
"ntils": "^1.0.1", | ||
"uglify-js": "^2.7.0" | ||
}, | ||
@@ -52,2 +52,2 @@ "devDependencies": { | ||
} | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
28232
12
502
2
1
+ Addedntils@^1.0.1
+ Addedcify@1.0.2(transitive)
+ Addedcmdline@1.1.7(transitive)
+ Addedntils@1.2.8(transitive)
- Removedreal-utils@0.0.1
- Removedcmdline@0.0.5(transitive)
- Removedreal-utils@0.0.1(transitive)
Updatedcmdline@^1.0.5
Updateduglify-js@^2.7.0