mm_tpl 2.7.1 → 2.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +894 -52
- package/README_EN.md +905 -53
- package/doc//347/233/256/345/275/225/347/273/223/346/236/204.md +165 -0
- package/doc//350/256/276/350/256/241/346/200/273/347/273/223.md +381 -0
- package/index.js +28 -471
- package/lib/asset.js +133 -0
- package/lib/base.js +84 -0
- package/lib/base_lang.js +200 -0
- package/lib/css.js +34 -0
- package/lib/file.js +258 -0
- package/lib/hook.js +309 -0
- package/lib/js.js +34 -0
- package/lib/lang.js +188 -0
- package/lib/memory.js +101 -0
- package/lib/sqlite.js +174 -0
- package/lib/template.js +129 -0
- package/lib/tpl.js +1279 -0
- package/lib/tpl_rule.js +288 -0
- package/lib/util.js +196 -0
- package/package.json +18 -4
- package/hook.js +0 -302
- package/tpl_rule.js +0 -287
package/hook.js
DELETED
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
const {
|
|
3
|
-
types
|
|
4
|
-
} = require("util");
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* 钩子管理类
|
|
8
|
-
* @class
|
|
9
|
-
*/
|
|
10
|
-
class Hook {
|
|
11
|
-
/**
|
|
12
|
-
* 创建钩子实例
|
|
13
|
-
*/
|
|
14
|
-
constructor() {
|
|
15
|
-
this._func = {};
|
|
16
|
-
this._action = {};
|
|
17
|
-
this._filter = {};
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* 排序钩子列表
|
|
23
|
-
* @param {Array} list - 钩子列表
|
|
24
|
-
* @returns {Array} 排序后的列表
|
|
25
|
-
*/
|
|
26
|
-
Hook.prototype.sort = function (list) {
|
|
27
|
-
return list.sort((o1, o2) => {
|
|
28
|
-
return o2.sort - o1.sort
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* 获取函数别名
|
|
34
|
-
* @param {Function} func - 钩子函数
|
|
35
|
-
* @param {string} alias - 别名
|
|
36
|
-
* @returns {string} 函数别名
|
|
37
|
-
*/
|
|
38
|
-
Hook.prototype._getName = function (func, alias) {
|
|
39
|
-
if (!alias) {
|
|
40
|
-
var str = func.toString();
|
|
41
|
-
var name = str.between('function ', "(").trim();
|
|
42
|
-
if (name) {
|
|
43
|
-
alias = name;
|
|
44
|
-
} else {
|
|
45
|
-
alias = (new Date()).toString().md5().substring(0, 8);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return alias;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* 添加函数钩子
|
|
53
|
-
* @param {string} name - 钩子名称
|
|
54
|
-
* @param {Function} func - 钩子函数
|
|
55
|
-
* @param {number} sort - 执行顺序
|
|
56
|
-
* @param {string} alias - 函数别名
|
|
57
|
-
* @returns {string} 函数别名
|
|
58
|
-
*/
|
|
59
|
-
Hook.prototype.addFunc = function (name, func, sort = 100, alias = "") {
|
|
60
|
-
alias = this._getName(func, alias);
|
|
61
|
-
var obj = {
|
|
62
|
-
func,
|
|
63
|
-
sort,
|
|
64
|
-
alias
|
|
65
|
-
}
|
|
66
|
-
var arr = this._func[name] || [];
|
|
67
|
-
arr.push(obj);
|
|
68
|
-
this._func[name] = this.sort(arr);
|
|
69
|
-
return alias;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* 添加动作钩子
|
|
74
|
-
* @param {string} name - 钩子名称
|
|
75
|
-
* @param {Function} func - 钩子函数
|
|
76
|
-
* @param {number} sort - 执行顺序
|
|
77
|
-
* @param {string} alias - 函数别名
|
|
78
|
-
* @returns {string} 函数别名
|
|
79
|
-
*/
|
|
80
|
-
Hook.prototype.addAction = function (name, func, sort = 100, alias = "") {
|
|
81
|
-
alias = this._getName(func, alias);
|
|
82
|
-
var obj = {
|
|
83
|
-
func,
|
|
84
|
-
sort,
|
|
85
|
-
alias
|
|
86
|
-
}
|
|
87
|
-
var arr = this._action[name] || [];
|
|
88
|
-
arr.push(obj);
|
|
89
|
-
this._action[name] = this.sort(arr);
|
|
90
|
-
return alias;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* 添加过滤钩子
|
|
95
|
-
* @param {string} name - 钩子名称
|
|
96
|
-
* @param {Function} func - 钩子函数
|
|
97
|
-
* @param {number} sort - 执行顺序
|
|
98
|
-
* @param {string} alias - 函数别名
|
|
99
|
-
* @returns {string} 函数别名
|
|
100
|
-
*/
|
|
101
|
-
Hook.prototype.addFilter = function (name, func, sort = 100, alias = "") {
|
|
102
|
-
alias = this._getName(func, alias);
|
|
103
|
-
var obj = {
|
|
104
|
-
func,
|
|
105
|
-
sort,
|
|
106
|
-
alias
|
|
107
|
-
}
|
|
108
|
-
var arr = this._filter[name] || [];
|
|
109
|
-
arr.push(obj);
|
|
110
|
-
this._filter[name] = this.sort(arr);
|
|
111
|
-
return alias;
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* 删除函数钩子
|
|
116
|
-
* @param {String} name 钩子名称
|
|
117
|
-
* @param {String} alias 函数别名
|
|
118
|
-
*/
|
|
119
|
-
Hook.prototype.delFunc = function (name, alias) {
|
|
120
|
-
var arr = this._func[name];
|
|
121
|
-
if (arr) {
|
|
122
|
-
var list = [];
|
|
123
|
-
for (var i = 0; i < arr.length; i++) {
|
|
124
|
-
var item = arr[i];
|
|
125
|
-
if (item.alias !== alias) {
|
|
126
|
-
list.push(item);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
this._func[name] = list;
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* 删除动作钩子
|
|
135
|
-
* @param {String} name 钩子名称
|
|
136
|
-
* @param {String} alias 函数别名
|
|
137
|
-
*/
|
|
138
|
-
Hook.prototype.delAction = function (name, alias) {
|
|
139
|
-
var arr = this._action[name];
|
|
140
|
-
if (arr) {
|
|
141
|
-
var list = [];
|
|
142
|
-
for (var i = 0; i < arr.length; i++) {
|
|
143
|
-
var item = arr[i];
|
|
144
|
-
if (item.alias !== alias) {
|
|
145
|
-
list.push(item);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
this._action[name] = list;
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* 删除过滤钩子
|
|
154
|
-
* @param {String} name 钩子名称
|
|
155
|
-
* @param {String} alias 函数别名
|
|
156
|
-
*/
|
|
157
|
-
Hook.prototype.delFilter = function (name, alias = "") {
|
|
158
|
-
var arr = this._filter[name];
|
|
159
|
-
if (arr) {
|
|
160
|
-
var list = [];
|
|
161
|
-
for (var i = 0; i < arr.length; i++) {
|
|
162
|
-
var item = arr[i];
|
|
163
|
-
if (item.alias !== alias) {
|
|
164
|
-
list.push(item);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
this._filter[name] = list;
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* 执行函数钩子
|
|
173
|
-
* @param {string} name - 钩子名称
|
|
174
|
-
* @param {Object} param - 参数
|
|
175
|
-
* @param {Function} func - 钩子函数
|
|
176
|
-
*/
|
|
177
|
-
Hook.prototype.runFunc = async function (name, model, req, ...args) {
|
|
178
|
-
var ret;
|
|
179
|
-
var list = this._func[name];
|
|
180
|
-
if (list) {
|
|
181
|
-
for (var i = 0; i < list.length; i++) {
|
|
182
|
-
var item = list[i];
|
|
183
|
-
try {
|
|
184
|
-
var ret_new = item.func(model, req, ...args);
|
|
185
|
-
if (types.isPromise(ret_new)) {
|
|
186
|
-
ret_new = await ret_new;
|
|
187
|
-
if (ret_new) {
|
|
188
|
-
ret = ret_new;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
} catch (err) {
|
|
192
|
-
$.log.error(`[${this.constructor.name}] 执行函数钩子失败 ${item.alias}`, err);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return ret;
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* 执行动作钩子
|
|
201
|
-
* @param {string} name - 钩子名称
|
|
202
|
-
* @param {Object} model - 模型对象
|
|
203
|
-
* @param {...any} args - 附加参数
|
|
204
|
-
* @returns {Object} 执行结果
|
|
205
|
-
*/
|
|
206
|
-
Hook.prototype.runAction = function (name, model, ...args) {
|
|
207
|
-
var ret = '';
|
|
208
|
-
var list = this._action[name];
|
|
209
|
-
if (list) {
|
|
210
|
-
for (var i = 0; i < list.length; i++) {
|
|
211
|
-
var o = list[i];
|
|
212
|
-
try {
|
|
213
|
-
ret += o.func(model, ...args);
|
|
214
|
-
} catch (err) {
|
|
215
|
-
$.log.error(`[${this.constructor.name}] 执行动作钩子失败 ${o.alias}`, err);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return ret;
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* 执行过滤钩子
|
|
224
|
-
* @param {string} name - 钩子名称
|
|
225
|
-
* @param {Object} model - 模型对象
|
|
226
|
-
* @param {Object} ret - 返回值
|
|
227
|
-
* @param {...any} args - 附加参数
|
|
228
|
-
* @returns {Object} 过滤后的参数
|
|
229
|
-
*/
|
|
230
|
-
Hook.prototype.runFilter = function (name, model, ret, ...args) {
|
|
231
|
-
var list = this._filter[name];
|
|
232
|
-
if (list) {
|
|
233
|
-
for (var i = 0; i < list.length; i++) {
|
|
234
|
-
var item = list[i];
|
|
235
|
-
try {
|
|
236
|
-
ret = item.func(model, ret, ...args) || ret;
|
|
237
|
-
} catch (err) {
|
|
238
|
-
$.log.error(`[${this.constructor.name}] 执行过滤钩子失败 ${item.alias}`, err);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
return ret;
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* 删除钩子
|
|
247
|
-
* @param {string} name - 钩子名称
|
|
248
|
-
* @param {string} alias - 函数别名
|
|
249
|
-
*/
|
|
250
|
-
Hook.prototype.del = function (name, alias) {
|
|
251
|
-
var arr = this._func[name];
|
|
252
|
-
if (arr) {
|
|
253
|
-
var list = [];
|
|
254
|
-
for (var i = 0; i < arr.length; i++) {
|
|
255
|
-
var item = arr[i];
|
|
256
|
-
if (item.alias !== alias) {
|
|
257
|
-
list.push(item);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
this._func[name] = list;
|
|
261
|
-
}
|
|
262
|
-
arr = this._action[name];
|
|
263
|
-
if (arr) {
|
|
264
|
-
var list = [];
|
|
265
|
-
for (var i = 0; i < arr.length; i++) {
|
|
266
|
-
var item = arr[i];
|
|
267
|
-
if (item.alias !== alias) {
|
|
268
|
-
list.push(item);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
this._action[name] = list;
|
|
272
|
-
}
|
|
273
|
-
arr = this._filter[name];
|
|
274
|
-
if (arr) {
|
|
275
|
-
var list = [];
|
|
276
|
-
for (var i = 0; i < arr.length; i++) {
|
|
277
|
-
var item = arr[i];
|
|
278
|
-
if (item.alias !== alias) {
|
|
279
|
-
list.push(item);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
this._filter[name] = list;
|
|
283
|
-
}
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* 清空钩子
|
|
288
|
-
* @param {string} name - 钩子名称
|
|
289
|
-
*/
|
|
290
|
-
Hook.prototype.clear = function (name) {
|
|
291
|
-
if (name) {
|
|
292
|
-
delete this._func[name];
|
|
293
|
-
delete this._action[name];
|
|
294
|
-
delete this._filter[name];
|
|
295
|
-
} else {
|
|
296
|
-
this._func = {};
|
|
297
|
-
this._action = {};
|
|
298
|
-
this._filter = {};
|
|
299
|
-
}
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
module.exports = Hook;
|
package/tpl_rule.js
DELETED
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 原生模板语法规则
|
|
5
|
-
* @type {Object}
|
|
6
|
-
*/
|
|
7
|
-
var nativeRule = {
|
|
8
|
-
test: /[ \t\r\n]*<!--\[(#?)((?:==|=#|[=-])?)[ \t]*([\w\W]*?)[ \t]*(-?)\]-->/,
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 处理原生模板语法
|
|
12
|
-
* @param {string} match - 匹配的字符串
|
|
13
|
-
* @param {string} comment - 注释标记
|
|
14
|
-
* @param {string} output - 输出类型
|
|
15
|
-
* @param {string} code - 代码内容
|
|
16
|
-
* @returns {Object} 处理结果
|
|
17
|
-
*/
|
|
18
|
-
use: function use(match, comment, output, code /*, trimMode*/ ) {
|
|
19
|
-
output = {
|
|
20
|
-
'-': 'raw',
|
|
21
|
-
'=': 'escape',
|
|
22
|
-
'': false,
|
|
23
|
-
// v3 compat: raw output
|
|
24
|
-
'==': 'raw',
|
|
25
|
-
'=#': 'raw'
|
|
26
|
-
} [output];
|
|
27
|
-
|
|
28
|
-
// ejs compat: comment tag
|
|
29
|
-
if (comment) {
|
|
30
|
-
code = '/*' + code + '*/';
|
|
31
|
-
output = false;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// ejs compat: trims following newline
|
|
35
|
-
// if (trimMode) {}
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
code: code,
|
|
39
|
-
output: output
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 简洁模板语法规则
|
|
46
|
-
* @type {Object}
|
|
47
|
-
*/
|
|
48
|
-
var artRule = {
|
|
49
|
-
test: /[ \t\r\n]*\$\{([@#]?)[ \t]*(\/?)([\w\W]*?)[ \t]*\}/,
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* 处理简洁模板语法
|
|
53
|
-
* @param {string} match - 匹配的字符串
|
|
54
|
-
* @param {string} raw - 原始输出标记
|
|
55
|
-
* @param {string} close - 闭合标记
|
|
56
|
-
* @param {string} code - 代码内容
|
|
57
|
-
* @returns {Object} 处理结果
|
|
58
|
-
*/
|
|
59
|
-
use: function use(match, raw, close, code) {
|
|
60
|
-
var compiler = this;
|
|
61
|
-
var options = compiler.options;
|
|
62
|
-
var esTokens = compiler.getEsTokens(code);
|
|
63
|
-
var values = esTokens.map(function(token) {
|
|
64
|
-
return token.value;
|
|
65
|
-
});
|
|
66
|
-
var result = {};
|
|
67
|
-
|
|
68
|
-
var group = void 0;
|
|
69
|
-
var output = raw ? 'raw' : false;
|
|
70
|
-
var key = close + values.shift();
|
|
71
|
-
|
|
72
|
-
// 旧版语法升级提示
|
|
73
|
-
var warn = function warn(oldSyntax, newSyntax) {
|
|
74
|
-
$.log.warn((options.filename || 'anonymous') + ':' + (match.line + 1) + ':' + (match.start + 1) + '\n' + (
|
|
75
|
-
'Template upgrade: ${' + oldSyntax + '} -> ${' + newSyntax + '}'));
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
// v3 compat: #value
|
|
79
|
-
if (raw === '#') {
|
|
80
|
-
warn('#value', '@value');
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
switch (key) {
|
|
84
|
-
case 'set':
|
|
85
|
-
code = 'var ' + values.join('').trim();
|
|
86
|
-
break;
|
|
87
|
-
|
|
88
|
-
case 'if':
|
|
89
|
-
code = 'if(' + values.join('').trim() + '){';
|
|
90
|
-
|
|
91
|
-
break;
|
|
92
|
-
|
|
93
|
-
case 'else':
|
|
94
|
-
var indexIf = values.indexOf('if');
|
|
95
|
-
|
|
96
|
-
if (~indexIf) {
|
|
97
|
-
values.splice(0, indexIf + 1);
|
|
98
|
-
code = '}else if(' + values.join('').trim() + '){';
|
|
99
|
-
} else {
|
|
100
|
-
code = '}else{';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
break;
|
|
104
|
-
|
|
105
|
-
case '/if':
|
|
106
|
-
code = '}';
|
|
107
|
-
break;
|
|
108
|
-
|
|
109
|
-
case 'loop':
|
|
110
|
-
case 'each':
|
|
111
|
-
group = artRule._split(esTokens);
|
|
112
|
-
group.shift();
|
|
113
|
-
|
|
114
|
-
if (group[1] === 'as') {
|
|
115
|
-
// ... v3 compat ...
|
|
116
|
-
warn('each object as value index', 'each object value index');
|
|
117
|
-
group.splice(1, 1);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
var object = group[0] || '$data';
|
|
121
|
-
var value = group[1] || '$value';
|
|
122
|
-
var index = group[2] || '$index';
|
|
123
|
-
|
|
124
|
-
code = '$each(' + object + ',function(' + value + ',' + index + '){';
|
|
125
|
-
|
|
126
|
-
break;
|
|
127
|
-
|
|
128
|
-
case '/loop':
|
|
129
|
-
case '/each':
|
|
130
|
-
code = '})';
|
|
131
|
-
break;
|
|
132
|
-
|
|
133
|
-
case 'block':
|
|
134
|
-
group = artRule._split(esTokens);
|
|
135
|
-
group.shift();
|
|
136
|
-
code = 'block(' + group.join(',').trim() + ',function(){';
|
|
137
|
-
break;
|
|
138
|
-
|
|
139
|
-
case '/block':
|
|
140
|
-
code = '})';
|
|
141
|
-
break;
|
|
142
|
-
|
|
143
|
-
case 'echo':
|
|
144
|
-
key = 'print';
|
|
145
|
-
warn('echo value', 'value');
|
|
146
|
-
case 'print':
|
|
147
|
-
case 'include':
|
|
148
|
-
case 'extend':
|
|
149
|
-
if (values.join('').trim().indexOf('(') !== 0) {
|
|
150
|
-
// 执行函数省略 `()` 与 `,`
|
|
151
|
-
group = artRule._split(esTokens);
|
|
152
|
-
group.shift();
|
|
153
|
-
code = key + '(' + group.join(',') + ')';
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
default:
|
|
158
|
-
if (~values.indexOf('|')) {
|
|
159
|
-
var v3split = ':'; // ... v3 compat ...
|
|
160
|
-
|
|
161
|
-
// 将过滤器解析成二维数组
|
|
162
|
-
var _group = esTokens.reduce(function(group, token) {
|
|
163
|
-
var value = token.value,
|
|
164
|
-
type = token.type;
|
|
165
|
-
|
|
166
|
-
if (value === '|') {
|
|
167
|
-
group.push([]);
|
|
168
|
-
} else if (type !== 'whitespace' && type !== 'comment') {
|
|
169
|
-
if (!group.length) {
|
|
170
|
-
group.push([]);
|
|
171
|
-
}
|
|
172
|
-
if (value === v3split && group[group.length - 1].length === 1) {
|
|
173
|
-
warn('value | filter: argv', 'value | filter argv');
|
|
174
|
-
} else {
|
|
175
|
-
group[group.length - 1].push(token);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return group;
|
|
179
|
-
}, []).map(function(g) {
|
|
180
|
-
return artRule._split(g);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
// 将过滤器管道化
|
|
184
|
-
code = _group.reduce(function(accumulator, filter) {
|
|
185
|
-
var name = filter.shift();
|
|
186
|
-
filter.unshift(accumulator);
|
|
187
|
-
|
|
188
|
-
return '$imports.' + name + '(' + filter.join(',') + ')';
|
|
189
|
-
}, _group.shift().join(' ').trim());
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
output = output || 'escape';
|
|
193
|
-
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
result.code = code;
|
|
198
|
-
result.output = output;
|
|
199
|
-
return result;
|
|
200
|
-
},
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* 将多个javascript表达式拆分成组
|
|
204
|
-
* @param {Array} esTokens - ES令牌数组
|
|
205
|
-
* @returns {Array} 分组后的表达式数组
|
|
206
|
-
*/
|
|
207
|
-
_split: function _split(esTokens) {
|
|
208
|
-
esTokens = esTokens.filter(function(_ref) {
|
|
209
|
-
var type = _ref.type;
|
|
210
|
-
|
|
211
|
-
return type !== 'whitespace' && type !== 'comment';
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
var current = 0;
|
|
215
|
-
var lastToken = esTokens.shift();
|
|
216
|
-
var punctuator = 'punctuator';
|
|
217
|
-
var close = /\]|\)/;
|
|
218
|
-
var group = [
|
|
219
|
-
[lastToken]
|
|
220
|
-
];
|
|
221
|
-
|
|
222
|
-
while (current < esTokens.length) {
|
|
223
|
-
var esToken = esTokens[current];
|
|
224
|
-
|
|
225
|
-
if (esToken.type === punctuator || lastToken.type === punctuator && !close.test(lastToken.value)) {
|
|
226
|
-
group[group.length - 1].push(esToken);
|
|
227
|
-
} else {
|
|
228
|
-
group.push([esToken]);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
lastToken = esToken;
|
|
232
|
-
|
|
233
|
-
current++;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return group.map(function(g) {
|
|
237
|
-
return g.map(function(g) {
|
|
238
|
-
return g.value;
|
|
239
|
-
}).join('');
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* HTML注释模板语法规则
|
|
246
|
-
* @type {Object}
|
|
247
|
-
*/
|
|
248
|
-
var htmlRule = Object.assign({}, artRule, {
|
|
249
|
-
test: /[ \t\r\n]*<!--\{([@#]?)[ \t]*(\/?)([\w\W]*?)[ \t]*\}-->/
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* JS注释模板语法规则
|
|
254
|
-
* @type {Object}
|
|
255
|
-
*/
|
|
256
|
-
var jsRule = Object.assign({}, artRule, {
|
|
257
|
-
test: /[ \t\r\n]*\/\*\[([@#]?)[ \t]*(\/?)([\w\W]*?)[ \t]*\]\*\//
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Python注释模板语法规则
|
|
262
|
-
* @type {Object}
|
|
263
|
-
*/
|
|
264
|
-
var pyRule = Object.assign({}, artRule, {
|
|
265
|
-
test: /[ \t\r\n]*##([@#]?)[ \t]*(\/?)([\w\W]*?)[ \t]*##/
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Python三引号注释模板语法规则
|
|
270
|
-
* @type {Object}
|
|
271
|
-
*/
|
|
272
|
-
var pyRule2 = Object.assign({}, artRule, {
|
|
273
|
-
test: /"""#([@#]?)[ \t]*(\/?)([\w\W]*?)[ \t]*#"""/
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
module.exports = {
|
|
277
|
-
htmlRule,
|
|
278
|
-
jsRule,
|
|
279
|
-
artRule,
|
|
280
|
-
nativeRule,
|
|
281
|
-
pyRule,
|
|
282
|
-
pyRule2
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|