mm_tpl 2.7.1 → 2.7.2

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/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
-