ktemplate
Version:
简单支持预编译的 js 模版
103 lines (96 loc) • 3.05 kB
JavaScript
/**
* @date 13-1-14
* @describe: 简单的代码扫描工具
* @author: KnightWu
* @version: 0.0.1
*/
var original = null;
var generated = null;
/**
* 扫描对象
* @param n 开始位置
*/
var Scan = function (n) {
this.start = n;
this.value = n;
};
Scan.prototype = {
constructor: Scan,
/**
* 跳过 n 个位置
* @param n
*/
skip: function (n) {
this.value += n;
},
/**
* 重新从起始位置开始
*/
restart: function () {
this.value = this.start;
}
};
/**
* 位置对象
* @param line 行
* @param column 列
* @constructor
*/
var PosMap = function (line, column) {
this.line = new Scan(line);
this.column = new Scan(column);
};
PosMap.prototype = {
constructor: PosMap,
/**
* 获取行列信息
* @return {{line: (*|Function|String|number|number|Function|Function|Function|Function|value|o.value|String|String|String|String|String|String|Number|String|value|value|value|st.attrHooks.value|val.value|value|value|value|.Traverse.value|Traverse.value|string|jQuery.value|string|jQuery.value|string|jQuery.value|string|jQuery.value|jQuery.attrHooks.value|string|jQuery.value|jQuery.attrHooks.value|string|jQuery.value|jQuery.attrHooks.value), column: (*|Function|String|number|number|Function|Function|Function|Function|value|o.value|String|String|String|String|String|String|Number|String|value|value|value|st.attrHooks.value|val.value|value|value|value|.Traverse.value|Traverse.value|string|jQuery.value|string|jQuery.value|string|jQuery.value|string|jQuery.value|jQuery.attrHooks.value|string|jQuery.value|jQuery.attrHooks.value|string|jQuery.value|jQuery.attrHooks.value)}}
*/
getPos: function () {
return {
line: this.line.value,
column: this.column.value
}
}
};
exports.init = function (callback) {
original = new PosMap(1, 0);
generated = new PosMap(1, 0);
if (callback !== undefined) {
callback(original, generated);
}
};
/**
* 消耗代码,计算位置
* @param str
* @param isNewAline
* @param recordIt
* @param isLogicCode
*/
exports.consume = function (str, isNewAline, recordIt, isLogicCode) {
var allLines = str.split(/\r\n/);
if (isLogicCode) { //逻辑代码,需移动 <% = 的列号
original.column.skip(2);// <%
var isLogicValue = !!(str.indexOf('=') === 0); //是否值
if (isLogicValue) { //值 =
original.column.skip(1);
}
}
if (isNewAline) {
generated.line.skip(1);
}
if (recordIt !== undefined) {
recordIt({
generated: generated.getPos(),
original: original.getPos()
});
}
if (allLines.length !== 1) { //折行,重新计算
original.column.restart();
}
original.column.skip(allLines[allLines.length - 1].length);
original.line.skip(allLines.length - 1);
if (isLogicCode) { //逻辑代码,需移动 %> 的列号
original.column.skip(2);// %>
}
};