art-template 4.12.1 → 4.13.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/CHANGELOG.md +17 -0
- package/README.md +18 -20
- package/index.d.ts +109 -0
- package/index.js +1 -1
- package/lib/compile/adapter/extend.js +1 -1
- package/lib/compile/adapter/html-minifier.js +5 -3
- package/lib/compile/adapter/loader.js +1 -1
- package/lib/compile/adapter/resolve-filename.js +3 -4
- package/lib/compile/adapter/rule.art.js +0 -14
- package/lib/compile/adapter/rule.native.js +0 -1
- package/lib/compile/compiler.js +284 -277
- package/lib/compile/defaults.js +3 -4
- package/lib/compile/error.js +1 -4
- package/lib/compile/index.js +0 -5
- package/lib/compile/runtime.js +7 -7
- package/lib/compile/tpl-tokenizer.js +53 -68
- package/lib/extension.js +2 -2
- package/lib/precompile.js +41 -48
- package/lib/template-web.js +3 -3
- package/package.json +11 -10
package/lib/compile/compiler.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
4
|
+
|
|
5
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
+
|
|
7
|
+
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
8
|
+
|
|
3
9
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
4
10
|
|
|
5
11
|
var esTokenizer = require('./es-tokenizer');
|
|
@@ -48,12 +54,11 @@ var FROM = '$$from';
|
|
|
48
54
|
var OPTIONS = '$$options';
|
|
49
55
|
|
|
50
56
|
var has = function has(object, key) {
|
|
51
|
-
return
|
|
57
|
+
return Object.hasOwnProperty.call(object, key);
|
|
52
58
|
};
|
|
53
59
|
var stringify = JSON.stringify;
|
|
54
60
|
|
|
55
61
|
var Compiler = function () {
|
|
56
|
-
|
|
57
62
|
/**
|
|
58
63
|
* 模板编译器
|
|
59
64
|
* @param {Object} options
|
|
@@ -85,13 +90,13 @@ var Compiler = function () {
|
|
|
85
90
|
this.CONTEXT_MAP = {};
|
|
86
91
|
|
|
87
92
|
// 忽略的变量名单
|
|
88
|
-
this.ignore = [DATA, IMPORTS, OPTIONS].concat(options.ignore);
|
|
93
|
+
this.ignore = [DATA, IMPORTS, OPTIONS].concat(_toConsumableArray(options.ignore));
|
|
89
94
|
|
|
90
95
|
// 按需编译到模板渲染函数的内置变量
|
|
91
|
-
this.internal = (_internal = {}, _internal
|
|
96
|
+
this.internal = (_internal = {}, _defineProperty(_internal, OUT, '\'\''), _defineProperty(_internal, LINE, '[0,0]'), _defineProperty(_internal, BLOCKS, 'arguments[1]||{}'), _defineProperty(_internal, FROM, 'null'), _defineProperty(_internal, PRINT, 'function(){var s=\'\'.concat.apply(\'\',arguments);' + OUT + '+=s;return s}'), _defineProperty(_internal, INCLUDE, 'function(src,data){var s=' + OPTIONS + '.include(src,data||' + DATA + ',arguments[2]||' + BLOCKS + ',' + OPTIONS + ');' + OUT + '+=s;return s}'), _defineProperty(_internal, EXTEND, 'function(from){' + FROM + '=from}'), _defineProperty(_internal, SLICE, 'function(c,p,s){p=' + OUT + ';' + OUT + '=\'\';c();s=' + OUT + ';' + OUT + '=p+s;return s}'), _defineProperty(_internal, BLOCK, 'function(){var a=arguments,s;if(typeof a[0]===\'function\'){return ' + SLICE + '(a[0])}else if(' + FROM + '){if(!' + BLOCKS + '[a[0]]){' + BLOCKS + '[a[0]]=' + SLICE + '(a[1])}else{' + OUT + '+=' + BLOCKS + '[a[0]]}}else{s=' + BLOCKS + '[a[0]];if(typeof s===\'string\'){' + OUT + '+=s}else{s=' + SLICE + '(a[1])}return s}}'), _internal);
|
|
92
97
|
|
|
93
98
|
// 内置函数依赖关系声明
|
|
94
|
-
this.dependencies = (_dependencies = {}, _dependencies
|
|
99
|
+
this.dependencies = (_dependencies = {}, _defineProperty(_dependencies, PRINT, [OUT]), _defineProperty(_dependencies, INCLUDE, [OUT, OPTIONS, DATA, BLOCKS]), _defineProperty(_dependencies, EXTEND, [FROM, /*[*/INCLUDE /*]*/]), _defineProperty(_dependencies, BLOCK, [SLICE, FROM, OUT, BLOCKS]), _dependencies);
|
|
95
100
|
|
|
96
101
|
this.importContext(OUT);
|
|
97
102
|
|
|
@@ -117,332 +122,334 @@ var Compiler = function () {
|
|
|
117
122
|
|
|
118
123
|
/**
|
|
119
124
|
* 将模板代码转换成 tplToken 数组
|
|
120
|
-
* @param {string} source
|
|
125
|
+
* @param {string} source
|
|
121
126
|
* @return {Object[]}
|
|
122
127
|
*/
|
|
123
128
|
|
|
124
129
|
|
|
125
|
-
Compiler
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
* 将模板表达式转换成 esToken 数组
|
|
131
|
-
* @param {string} source
|
|
132
|
-
* @return {Object[]}
|
|
133
|
-
*/
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
Compiler.prototype.getEsTokens = function getEsTokens(source) {
|
|
137
|
-
return esTokenizer(source);
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* 获取变量列表
|
|
142
|
-
* @param {Object[]} esTokens
|
|
143
|
-
* @return {string[]}
|
|
144
|
-
*/
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
Compiler.prototype.getVariables = function getVariables(esTokens) {
|
|
148
|
-
var ignore = false;
|
|
149
|
-
return esTokens.filter(function (esToken) {
|
|
150
|
-
return esToken.type !== 'whitespace' && esToken.type !== 'comment';
|
|
151
|
-
}).filter(function (esToken) {
|
|
152
|
-
if (esToken.type === 'name' && !ignore) {
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
ignore = esToken.type === 'punctuator' && esToken.value === '.';
|
|
157
|
-
|
|
158
|
-
return false;
|
|
159
|
-
}).map(function (tooken) {
|
|
160
|
-
return tooken.value;
|
|
161
|
-
});
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* 导入模板上下文
|
|
166
|
-
* @param {string} name
|
|
167
|
-
*/
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
Compiler.prototype.importContext = function importContext(name) {
|
|
171
|
-
var _this2 = this;
|
|
172
|
-
|
|
173
|
-
var value = '';
|
|
174
|
-
var internal = this.internal;
|
|
175
|
-
var dependencies = this.dependencies;
|
|
176
|
-
var ignore = this.ignore;
|
|
177
|
-
var context = this.context;
|
|
178
|
-
var options = this.options;
|
|
179
|
-
var imports = options.imports;
|
|
180
|
-
var contextMap = this.CONTEXT_MAP;
|
|
130
|
+
_createClass(Compiler, [{
|
|
131
|
+
key: 'getTplTokens',
|
|
132
|
+
value: function getTplTokens() {
|
|
133
|
+
return tplTokenizer.apply(undefined, arguments);
|
|
134
|
+
}
|
|
181
135
|
|
|
182
|
-
|
|
136
|
+
/**
|
|
137
|
+
* 将模板表达式转换成 esToken 数组
|
|
138
|
+
* @param {string} source
|
|
139
|
+
* @return {Object[]}
|
|
140
|
+
*/
|
|
183
141
|
|
|
184
|
-
|
|
185
|
-
|
|
142
|
+
}, {
|
|
143
|
+
key: 'getEsTokens',
|
|
144
|
+
value: function getEsTokens(source) {
|
|
145
|
+
return esTokenizer(source);
|
|
146
|
+
}
|
|
186
147
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
148
|
+
/**
|
|
149
|
+
* 获取变量列表
|
|
150
|
+
* @param {Object[]} esTokens
|
|
151
|
+
* @return {string[]}
|
|
152
|
+
*/
|
|
153
|
+
|
|
154
|
+
}, {
|
|
155
|
+
key: 'getVariables',
|
|
156
|
+
value: function getVariables(esTokens) {
|
|
157
|
+
var ignore = false;
|
|
158
|
+
return esTokens.filter(function (esToken) {
|
|
159
|
+
return esToken.type !== 'whitespace' && esToken.type !== 'comment';
|
|
160
|
+
}).filter(function (esToken) {
|
|
161
|
+
if (esToken.type === 'name' && !ignore) {
|
|
162
|
+
return true;
|
|
191
163
|
}
|
|
192
164
|
|
|
193
|
-
|
|
194
|
-
} else if (name === ESCAPE || name === EACH || has(imports, name)) {
|
|
195
|
-
value = IMPORTS + '.' + name;
|
|
196
|
-
} else {
|
|
197
|
-
value = DATA + '.' + name;
|
|
198
|
-
}
|
|
165
|
+
ignore = esToken.type === 'punctuator' && esToken.value === '.';
|
|
199
166
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
value: value
|
|
167
|
+
return false;
|
|
168
|
+
}).map(function (tooken) {
|
|
169
|
+
return tooken.value;
|
|
204
170
|
});
|
|
205
171
|
}
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* 解析字符串(HTML)直接输出语句
|
|
210
|
-
* @param {Object} tplToken
|
|
211
|
-
*/
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
Compiler.prototype.parseString = function parseString(tplToken) {
|
|
215
|
-
|
|
216
|
-
var source = tplToken.value;
|
|
217
|
-
|
|
218
|
-
if (!source) {
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
var code = OUT + '+=' + stringify(source);
|
|
223
|
-
this.scripts.push({
|
|
224
|
-
source: source,
|
|
225
|
-
tplToken: tplToken,
|
|
226
|
-
code: code
|
|
227
|
-
});
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* 解析逻辑表达式语句
|
|
232
|
-
* @param {Object} tplToken
|
|
233
|
-
*/
|
|
234
172
|
|
|
173
|
+
/**
|
|
174
|
+
* 导入模板上下文
|
|
175
|
+
* @param {string} name
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
}, {
|
|
179
|
+
key: 'importContext',
|
|
180
|
+
value: function importContext(name) {
|
|
181
|
+
var _this2 = this;
|
|
182
|
+
|
|
183
|
+
var value = '';
|
|
184
|
+
var internal = this.internal;
|
|
185
|
+
var dependencies = this.dependencies;
|
|
186
|
+
var ignore = this.ignore;
|
|
187
|
+
var context = this.context;
|
|
188
|
+
var options = this.options;
|
|
189
|
+
var imports = options.imports;
|
|
190
|
+
var contextMap = this.CONTEXT_MAP;
|
|
191
|
+
|
|
192
|
+
if (!has(contextMap, name) && ignore.indexOf(name) === -1) {
|
|
193
|
+
if (has(internal, name)) {
|
|
194
|
+
value = internal[name];
|
|
195
|
+
|
|
196
|
+
if (has(dependencies, name)) {
|
|
197
|
+
dependencies[name].forEach(function (name) {
|
|
198
|
+
return _this2.importContext(name);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// imports 继承了 Global,但是继承的属性不分配到顶级变量中,避免占用了模板内部的变量名称
|
|
203
|
+
} else if (name === ESCAPE || name === EACH || has(imports, name)) {
|
|
204
|
+
value = IMPORTS + '.' + name;
|
|
205
|
+
} else {
|
|
206
|
+
value = DATA + '.' + name;
|
|
207
|
+
}
|
|
235
208
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
var output = script.output;
|
|
242
|
-
var escape = this.options.escape;
|
|
243
|
-
var code = script.code;
|
|
244
|
-
|
|
245
|
-
if (output) {
|
|
246
|
-
if (escape === false || output === tplTokenizer.TYPE_RAW) {
|
|
247
|
-
code = OUT + '+=' + script.code;
|
|
248
|
-
} else {
|
|
249
|
-
code = OUT + '+=' + ESCAPE + '(' + script.code + ')';
|
|
209
|
+
contextMap[name] = value;
|
|
210
|
+
context.push({
|
|
211
|
+
name: name,
|
|
212
|
+
value: value
|
|
213
|
+
});
|
|
250
214
|
}
|
|
251
215
|
}
|
|
252
216
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
217
|
+
/**
|
|
218
|
+
* 解析字符串(HTML)直接输出语句
|
|
219
|
+
* @param {Object} tplToken
|
|
220
|
+
*/
|
|
257
221
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
});
|
|
263
|
-
};
|
|
222
|
+
}, {
|
|
223
|
+
key: 'parseString',
|
|
224
|
+
value: function parseString(tplToken) {
|
|
225
|
+
var source = tplToken.value;
|
|
264
226
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
* @return {boolean}
|
|
269
|
-
*/
|
|
227
|
+
if (!source) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
270
230
|
|
|
231
|
+
var code = OUT + '+=' + stringify(source);
|
|
232
|
+
this.scripts.push({
|
|
233
|
+
source: source,
|
|
234
|
+
tplToken: tplToken,
|
|
235
|
+
code: code
|
|
236
|
+
});
|
|
237
|
+
}
|
|
271
238
|
|
|
272
|
-
|
|
239
|
+
/**
|
|
240
|
+
* 解析逻辑表达式语句
|
|
241
|
+
* @param {Object} tplToken
|
|
242
|
+
*/
|
|
243
|
+
|
|
244
|
+
}, {
|
|
245
|
+
key: 'parseExpression',
|
|
246
|
+
value: function parseExpression(tplToken) {
|
|
247
|
+
var _this3 = this;
|
|
248
|
+
|
|
249
|
+
var source = tplToken.value;
|
|
250
|
+
var script = tplToken.script;
|
|
251
|
+
var output = script.output;
|
|
252
|
+
var escape = this.options.escape;
|
|
253
|
+
var code = script.code;
|
|
254
|
+
|
|
255
|
+
if (output) {
|
|
256
|
+
if (escape === false || output === tplTokenizer.TYPE_RAW) {
|
|
257
|
+
code = OUT + '+=' + script.code;
|
|
258
|
+
} else {
|
|
259
|
+
code = OUT + '+=' + ESCAPE + '(' + script.code + ')';
|
|
260
|
+
}
|
|
261
|
+
}
|
|
273
262
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
263
|
+
var esToken = this.getEsTokens(code);
|
|
264
|
+
this.getVariables(esToken).forEach(function (name) {
|
|
265
|
+
return _this3.importContext(name);
|
|
266
|
+
});
|
|
278
267
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
268
|
+
this.scripts.push({
|
|
269
|
+
source: source,
|
|
270
|
+
tplToken: tplToken,
|
|
271
|
+
code: code
|
|
272
|
+
});
|
|
273
|
+
}
|
|
283
274
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
275
|
+
/**
|
|
276
|
+
* 检查解析后的模板语句是否存在语法错误
|
|
277
|
+
* @param {string} script
|
|
278
|
+
* @return {boolean}
|
|
279
|
+
*/
|
|
280
|
+
|
|
281
|
+
}, {
|
|
282
|
+
key: 'checkExpression',
|
|
283
|
+
value: function checkExpression(script) {
|
|
284
|
+
// 没有闭合的块级模板语句规则
|
|
285
|
+
// 基于正则规则来补全语法不能保证 100% 准确,
|
|
286
|
+
// 但是在绝大多数情况下足以满足辅助开发调试的需要
|
|
287
|
+
var rules = [
|
|
288
|
+
// <% } %>
|
|
289
|
+
// <% }else{ %>
|
|
290
|
+
// <% }else if(a){ %>
|
|
291
|
+
[/^\s*}[\w\W]*?{?[\s;]*$/, ''],
|
|
292
|
+
|
|
293
|
+
// <% fn(c,function(a,b){ %>
|
|
294
|
+
// <% fn(c, a=>{ %>
|
|
295
|
+
// <% fn(c,(a,b)=>{ %>
|
|
296
|
+
[/(^[\w\W]*?\([\w\W]*?(?:=>|\([\w\W]*?\))\s*{[\s;]*$)/, '$1})'],
|
|
297
|
+
|
|
298
|
+
// <% if(a){ %>
|
|
299
|
+
// <% for(var i in d){ %>
|
|
300
|
+
[/(^[\w\W]*?\([\w\W]*?\)\s*{[\s;]*$)/, '$1}']];
|
|
288
301
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
302
|
+
var index = 0;
|
|
303
|
+
while (index < rules.length) {
|
|
304
|
+
if (rules[index][0].test(script)) {
|
|
305
|
+
var _script;
|
|
292
306
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
307
|
+
script = (_script = script).replace.apply(_script, _toConsumableArray(rules[index]));
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
index++;
|
|
311
|
+
}
|
|
297
312
|
|
|
298
|
-
|
|
299
|
-
|
|
313
|
+
try {
|
|
314
|
+
new Function(script);
|
|
315
|
+
return true;
|
|
316
|
+
} catch (e) {
|
|
317
|
+
return false;
|
|
300
318
|
}
|
|
301
|
-
index++;
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
try {
|
|
305
|
-
new Function(script);
|
|
306
|
-
return true;
|
|
307
|
-
} catch (e) {
|
|
308
|
-
return false;
|
|
309
319
|
}
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* 编译
|
|
314
|
-
* @return {function}
|
|
315
|
-
*/
|
|
316
|
-
|
|
317
320
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
var
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
321
|
+
/**
|
|
322
|
+
* 编译
|
|
323
|
+
* @return {function}
|
|
324
|
+
*/
|
|
325
|
+
|
|
326
|
+
}, {
|
|
327
|
+
key: 'build',
|
|
328
|
+
value: function build() {
|
|
329
|
+
var options = this.options;
|
|
330
|
+
var context = this.context;
|
|
331
|
+
var scripts = this.scripts;
|
|
332
|
+
var stacks = this.stacks;
|
|
333
|
+
var source = this.source;
|
|
334
|
+
var filename = options.filename;
|
|
335
|
+
var imports = options.imports;
|
|
336
|
+
var mappings = [];
|
|
337
|
+
var extendMode = has(this.CONTEXT_MAP, EXTEND);
|
|
338
|
+
|
|
339
|
+
var offsetLine = 0;
|
|
340
|
+
|
|
341
|
+
// Create SourceMap: mapping
|
|
342
|
+
var mapping = function mapping(code, _ref) {
|
|
343
|
+
var line = _ref.line,
|
|
344
|
+
start = _ref.start;
|
|
345
|
+
|
|
346
|
+
var node = {
|
|
347
|
+
generated: {
|
|
348
|
+
line: stacks.length + offsetLine + 1,
|
|
349
|
+
column: 1
|
|
350
|
+
},
|
|
351
|
+
original: {
|
|
352
|
+
line: line + 1,
|
|
353
|
+
column: start + 1
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
offsetLine += code.split(/\n/).length - 1;
|
|
358
|
+
return node;
|
|
346
359
|
};
|
|
347
360
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
361
|
+
// Trim code
|
|
362
|
+
var trim = function trim(code) {
|
|
363
|
+
return code.replace(/^[\t ]+|[\t ]$/g, '');
|
|
364
|
+
};
|
|
351
365
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
366
|
+
stacks.push('function(' + DATA + '){');
|
|
367
|
+
stacks.push('\'use strict\'');
|
|
368
|
+
stacks.push(DATA + '=' + DATA + '||{}');
|
|
369
|
+
stacks.push('var ' + context.map(function (_ref2) {
|
|
370
|
+
var name = _ref2.name,
|
|
371
|
+
value = _ref2.value;
|
|
372
|
+
return name + '=' + value;
|
|
373
|
+
}).join(','));
|
|
356
374
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
stacks.push(DATA + '=' + DATA + '||{}');
|
|
360
|
-
stacks.push('var ' + context.map(function (_ref2) {
|
|
361
|
-
var name = _ref2.name,
|
|
362
|
-
value = _ref2.value;
|
|
363
|
-
return name + '=' + value;
|
|
364
|
-
}).join(','));
|
|
375
|
+
if (options.compileDebug) {
|
|
376
|
+
stacks.push('try{');
|
|
365
377
|
|
|
366
|
-
|
|
378
|
+
scripts.forEach(function (script) {
|
|
379
|
+
if (script.tplToken.type === tplTokenizer.TYPE_EXPRESSION) {
|
|
380
|
+
stacks.push(LINE + '=[' + [script.tplToken.line, script.tplToken.start].join(',') + ']');
|
|
381
|
+
}
|
|
367
382
|
|
|
368
|
-
|
|
383
|
+
mappings.push(mapping(script.code, script.tplToken));
|
|
384
|
+
stacks.push(trim(script.code));
|
|
385
|
+
});
|
|
369
386
|
|
|
370
|
-
|
|
387
|
+
stacks.push('}catch(error){');
|
|
371
388
|
|
|
372
|
-
|
|
373
|
-
stacks.push(LINE + '=[' + [script.tplToken.line, script.tplToken.start].join(',') + ']');
|
|
374
|
-
}
|
|
389
|
+
stacks.push('throw {' + ['name:\'RuntimeError\'', 'path:' + stringify(filename), 'message:error.message', 'line:' + LINE + '[0]+1', 'column:' + LINE + '[1]+1', 'source:' + stringify(source), 'stack:error.stack'].join(',') + '}');
|
|
375
390
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
391
|
+
stacks.push('}');
|
|
392
|
+
} else {
|
|
393
|
+
scripts.forEach(function (script) {
|
|
394
|
+
mappings.push(mapping(script.code, script.tplToken));
|
|
395
|
+
stacks.push(trim(script.code));
|
|
396
|
+
});
|
|
397
|
+
}
|
|
381
398
|
|
|
382
|
-
|
|
399
|
+
if (extendMode) {
|
|
400
|
+
stacks.push(OUT + '=\'\'');
|
|
401
|
+
stacks.push(INCLUDE + '(' + FROM + ',' + DATA + ',' + BLOCKS + ')');
|
|
402
|
+
}
|
|
383
403
|
|
|
404
|
+
stacks.push('return ' + OUT);
|
|
384
405
|
stacks.push('}');
|
|
385
|
-
} else {
|
|
386
|
-
scripts.forEach(function (script) {
|
|
387
|
-
mappings.push(mapping(script.code, script.tplToken));
|
|
388
|
-
stacks.push(trim(script.code));
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
if (extendMode) {
|
|
393
|
-
stacks.push(OUT + '=\'\'');
|
|
394
|
-
stacks.push(INCLUDE + '(' + FROM + ',' + DATA + ',' + BLOCKS + ')');
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
stacks.push('return ' + OUT);
|
|
398
|
-
stacks.push('}');
|
|
399
406
|
|
|
400
|
-
|
|
407
|
+
var renderCode = stacks.join('\n');
|
|
401
408
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
409
|
+
try {
|
|
410
|
+
var result = new Function(IMPORTS, OPTIONS, 'return ' + renderCode)(imports, options);
|
|
411
|
+
result.mappings = mappings;
|
|
412
|
+
result.sourcesContent = [source];
|
|
413
|
+
return result;
|
|
414
|
+
} catch (error) {
|
|
415
|
+
var index = 0;
|
|
416
|
+
var line = 0;
|
|
417
|
+
var start = 0;
|
|
418
|
+
var generated = void 0;
|
|
419
|
+
|
|
420
|
+
while (index < scripts.length) {
|
|
421
|
+
var current = scripts[index];
|
|
422
|
+
if (!this.checkExpression(current.code)) {
|
|
423
|
+
line = current.tplToken.line;
|
|
424
|
+
start = current.tplToken.start;
|
|
425
|
+
generated = current.code;
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
index++;
|
|
421
429
|
}
|
|
422
|
-
index++;
|
|
423
|
-
};
|
|
424
430
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
431
|
+
throw {
|
|
432
|
+
name: 'CompileError',
|
|
433
|
+
path: filename,
|
|
434
|
+
message: error.message,
|
|
435
|
+
line: line + 1,
|
|
436
|
+
column: start + 1,
|
|
437
|
+
source: source,
|
|
438
|
+
generated: generated,
|
|
439
|
+
stack: error.stack
|
|
440
|
+
};
|
|
441
|
+
}
|
|
435
442
|
}
|
|
436
|
-
};
|
|
443
|
+
}]);
|
|
437
444
|
|
|
438
445
|
return Compiler;
|
|
439
446
|
}();
|
|
440
447
|
|
|
441
|
-
;
|
|
442
|
-
|
|
443
448
|
/**
|
|
444
449
|
* 模板内置常量
|
|
445
450
|
*/
|
|
451
|
+
|
|
452
|
+
|
|
446
453
|
Compiler.CONSTS = {
|
|
447
454
|
DATA: DATA,
|
|
448
455
|
IMPORTS: IMPORTS,
|