@panpanzhao/component-ui 0.0.1

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.
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.extendsFilters = extendsFilters;
5
+ exports.filters = void 0;
6
+ exports.getFilters = getFilters;
7
+ exports.registerFilter = registerFilter;
8
+ var _evalutor = require("./evalutor");
9
+ var entityMap = {
10
+ '&': '&',
11
+ '<': '&lt;',
12
+ '>': '&gt;',
13
+ '"': '&quot;',
14
+ "'": '&#39;',
15
+ '/': '&#x2F;'
16
+ };
17
+ var escapeHtml = function escapeHtml(str) {
18
+ return String(str).replace(/[&<>"'\/]/g, function (s) {
19
+ return entityMap[s];
20
+ });
21
+ };
22
+ /**
23
+ * filter 是历史包袱,不建议使用。因为这是之前的语法,所以在公式解析里面做了兼容。
24
+ * 建议用 ${ LEFT(xxx) } 这种函数调用语法。
25
+ */
26
+ var filters = {
27
+ raw: function raw(input) {
28
+ return input;
29
+ },
30
+ html: function html(input) {
31
+ if (input == null) {
32
+ return input;
33
+ }
34
+ return escapeHtml(input);
35
+ }
36
+ };
37
+ exports.filters = filters;
38
+ function registerFilter(name, fn) {
39
+ filters[name] = fn;
40
+ _evalutor.Evaluator.setDefaultFilters(filters);
41
+ }
42
+ function extendsFilters(value) {
43
+ Object.assign(filters, value);
44
+ _evalutor.Evaluator.setDefaultFilters(filters);
45
+ }
46
+ function getFilters() {
47
+ return filters;
48
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.functions = void 0;
5
+ exports.registerFunction = registerFunction;
6
+ var _evalutor = require("./evalutor");
7
+ var functions = {};
8
+ exports.functions = functions;
9
+ function registerFunction(name, fn) {
10
+ functions["fn" + name] = fn;
11
+ _evalutor.Evaluator.setDefaultFunctions(functions);
12
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.evaluate = evaluate;
5
+ var _evalutor = require("./evalutor");
6
+ exports.Evaluator = _evalutor.Evaluator;
7
+ var _parser = require("./parser");
8
+ exports.parse = _parser.parse;
9
+ var _lexer = require("./lexer");
10
+ exports.lexer = _lexer.lexer;
11
+ var _filter = require("./filter");
12
+ exports.registerFilter = _filter.registerFilter;
13
+ exports.filters = _filter.filters;
14
+ exports.getFilters = _filter.getFilters;
15
+ exports.extendsFilters = _filter.extendsFilters;
16
+ var _function = require("./function");
17
+ exports.registerFunction = _function.registerFunction;
18
+ function evaluate(astOrString, data, options) {
19
+ var ast = astOrString;
20
+ if (typeof astOrString === 'string') {
21
+ ast = (0, _parser.parse)(astOrString, options);
22
+ }
23
+ return new _evalutor.Evaluator(data, options).evalute(ast);
24
+ }
25
+ _evalutor.Evaluator.setDefaultFilters((0, _filter.getFilters)());
@@ -0,0 +1,590 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.TokenName = void 0;
5
+ exports.lexer = lexer;
6
+ var TokenName = {};
7
+ exports.TokenName = TokenName;
8
+ TokenName[1 /* BooleanLiteral */] = 'Boolean';
9
+ TokenName[2 /* RAW */] = 'Raw';
10
+ TokenName[3 /* Variable */] = 'Variable';
11
+ TokenName[4 /* OpenScript */] = 'OpenScript';
12
+ TokenName[5 /* CloseScript */] = 'CloseScript';
13
+ TokenName[6 /* EOF */] = 'EOF';
14
+ TokenName[7 /* Identifier */] = 'Identifier';
15
+ TokenName[8 /* Literal */] = 'Literal';
16
+ TokenName[9 /* NumericLiteral */] = 'Numeric';
17
+ TokenName[10 /* Punctuator */] = 'Punctuator';
18
+ TokenName[11 /* StringLiteral */] = 'String';
19
+ TokenName[12 /* RegularExpression */] = 'RegularExpression';
20
+ TokenName[13 /* TemplateRaw */] = 'TemplateRaw';
21
+ TokenName[14 /* TemplateLeftBrace */] = 'TemplateLeftBrace';
22
+ TokenName[15 /* TemplateRightBrace */] = 'TemplateRightBrace';
23
+ TokenName[16 /* OpenFilter */] = 'OpenFilter';
24
+ TokenName[17 /* Char */] = 'Char';
25
+ var mainStates = {
26
+ START: 0,
27
+ SCRIPT: 1,
28
+ EXPRESSION: 2,
29
+ BLOCK: 3,
30
+ Template: 4,
31
+ Filter: 5
32
+ };
33
+ var rawStates = {
34
+ START: 0,
35
+ ESCAPE: 1
36
+ };
37
+ var numberStates = {
38
+ START: 0,
39
+ ZERO: 1,
40
+ DIGIT: 2,
41
+ POINT: 3,
42
+ DIGIT_FRACTION: 4,
43
+ EXP: 5
44
+ };
45
+ var stringStates = {
46
+ START: 0,
47
+ START_QUOTE_OR_CHAR: 1,
48
+ ESCAPE: 2
49
+ };
50
+ var filterStates = {
51
+ START: 0,
52
+ Func: 1,
53
+ SEP: 2,
54
+ ESCAPE: 3
55
+ };
56
+ var punctuatorList = ['===', '!==', '>>>', '==', '!=', '<>', '<=', '>=', '||', '&&', '++', '--', '<<', '>>', '**', '+=', '*=', '/=', '<', '>', '=', '*', '/', '-', '+', '^', '!', '~', '%', '&', '|', '(', ')', '[', ']', '{', '}', '?', ':', ';', ',', '.', '$'];
57
+ var escapes = {
58
+ '"': 0,
59
+ '\\': 1,
60
+ '/': 2,
61
+ 'b': 3,
62
+ 'f': 4,
63
+ 'n': 5,
64
+ 'r': 6,
65
+ 't': 7,
66
+ 'u': 8 // 4 hexadecimal digits
67
+ };
68
+
69
+ function isDigit1to9(char) {
70
+ return char >= '1' && char <= '9';
71
+ }
72
+ function isDigit(char) {
73
+ return char >= '0' && char <= '9';
74
+ }
75
+ function isExp(char) {
76
+ return char === 'e' || char === 'E';
77
+ }
78
+ function escapeString(text, allowedLetter) {
79
+ if (allowedLetter === void 0) {
80
+ allowedLetter = [];
81
+ }
82
+ return text.replace(/\\(.)/g, function (_, text) {
83
+ return text === 'b' ? '\b' : text === 'f' ? '\f' : text === 'n' ? '\n' : text === 'r' ? '\r' : text === 't' ? '\t' : text === 'v' ? '\v' : ~allowedLetter.indexOf(text) ? text : _;
84
+ });
85
+ }
86
+ function formatNumber(value) {
87
+ return Number(value);
88
+ }
89
+ function lexer(input, options) {
90
+ var line = 1;
91
+ var column = 1;
92
+ var index = 0;
93
+ var mainState = mainStates.START;
94
+ var states = [mainState];
95
+ var tokenCache = [];
96
+ var allowFilter = (options === null || options === void 0 ? void 0 : options.allowFilter) !== false;
97
+ if ((options === null || options === void 0 ? void 0 : options.evalMode) || (options === null || options === void 0 ? void 0 : options.variableMode)) {
98
+ pushState(mainStates.EXPRESSION);
99
+ }
100
+ function pushState(state) {
101
+ states.push(mainState = state);
102
+ }
103
+ function popState() {
104
+ states.pop();
105
+ mainState = states[states.length - 1];
106
+ }
107
+ function position(value) {
108
+ if (value && typeof value === 'string') {
109
+ var lines = value.split(/[\r\n]+/);
110
+ return {
111
+ index: index + value.length,
112
+ line: line + lines.length - 1,
113
+ column: column + lines[lines.length - 1].length
114
+ };
115
+ }
116
+ return {
117
+ index: index,
118
+ line: line,
119
+ column: column
120
+ };
121
+ }
122
+ function eof() {
123
+ if (index >= input.length) {
124
+ return {
125
+ type: TokenName[6 /* EOF */],
126
+ value: undefined,
127
+ start: position(),
128
+ end: position()
129
+ };
130
+ }
131
+ }
132
+ function raw() {
133
+ if (mainState !== mainStates.START) {
134
+ return null;
135
+ }
136
+ var buffer = '';
137
+ var state = rawStates.START;
138
+ var i = index;
139
+ while (i < input.length) {
140
+ var ch = input[i];
141
+ if (state === rawStates.ESCAPE) {
142
+ if (escapes.hasOwnProperty(ch) || ch === '$') {
143
+ buffer += ch;
144
+ i++;
145
+ state = rawStates.START;
146
+ } else {
147
+ var pos = position(buffer + ch);
148
+ throw new SyntaxError("Unexpected token " + ch + " in " + pos.line + ":" + pos.column);
149
+ }
150
+ } else {
151
+ if (ch === '\\') {
152
+ buffer += ch;
153
+ i++;
154
+ state = rawStates.ESCAPE;
155
+ continue;
156
+ } else if (ch === '$') {
157
+ var nextCh = input[i + 1];
158
+ if (nextCh === '{') {
159
+ break;
160
+ } else if (nextCh === '$') {
161
+ // $$ 用法兼容
162
+ tokenCache.push({
163
+ type: TokenName[3 /* Variable */],
164
+ value: '&',
165
+ raw: '$$',
166
+ start: position(input.substring(index, i)),
167
+ end: position(input.substring(index, i + 2))
168
+ });
169
+ break;
170
+ } else {
171
+ // 支持旧的 $varName 的取值方法
172
+ var match = /^[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*/.exec(input.substring(i + 1));
173
+ if (match) {
174
+ tokenCache.push({
175
+ type: TokenName[3 /* Variable */],
176
+ value: match[0],
177
+ raw: match[0],
178
+ start: position(input.substring(index, i)),
179
+ end: position(input.substring(index, i + 1 + match[0].length))
180
+ });
181
+ break;
182
+ }
183
+ }
184
+ }
185
+ i++;
186
+ buffer += ch;
187
+ }
188
+ }
189
+ if (i > index) {
190
+ return {
191
+ type: TokenName[2 /* RAW */],
192
+ value: escapeString(buffer, ['`', '$']),
193
+ raw: buffer,
194
+ start: position(),
195
+ end: position(buffer)
196
+ };
197
+ }
198
+ return tokenCache.length ? tokenCache.shift() : null;
199
+ }
200
+ function openScript() {
201
+ if (mainState === mainStates.Template || mainState === mainStates.EXPRESSION) {
202
+ return null;
203
+ }
204
+ var ch = input[index];
205
+ if (ch === '$') {
206
+ var nextCh = input[index + 1];
207
+ if (nextCh === '{') {
208
+ pushState(mainStates.SCRIPT);
209
+ var value = input.substring(index, index + 2);
210
+ return {
211
+ type: TokenName[4 /* OpenScript */],
212
+ value: value,
213
+ start: position(),
214
+ end: position(value)
215
+ };
216
+ }
217
+ }
218
+ return null;
219
+ }
220
+ function expression() {
221
+ if (mainState !== mainStates.SCRIPT && mainState !== mainStates.EXPRESSION && mainState !== mainStates.BLOCK && mainState !== mainStates.Filter) {
222
+ return null;
223
+ }
224
+ var token = literal() || identifier() || numberLiteral() || stringLiteral() || punctuator() || char();
225
+ if ((token === null || token === void 0 ? void 0 : token.value) === '{') {
226
+ pushState(mainStates.BLOCK);
227
+ } else if ((token === null || token === void 0 ? void 0 : token.value) === '}') {
228
+ if (mainState === mainStates.Filter) {
229
+ popState();
230
+ }
231
+ var prevState = mainState;
232
+ popState();
233
+ if (prevState === mainStates.SCRIPT || prevState === mainStates.EXPRESSION) {
234
+ return {
235
+ type: TokenName[prevState === mainStates.EXPRESSION ? 15 /* TemplateRightBrace */ : 5 /* CloseScript */],
236
+ value: token.value,
237
+ start: position(),
238
+ end: position(token.value)
239
+ };
240
+ }
241
+ }
242
+ // filter 过滤器部分需要特殊处理
243
+ if (mainState === mainStates.SCRIPT && (token === null || token === void 0 ? void 0 : token.value) === '|' && allowFilter) {
244
+ pushState(mainStates.Filter);
245
+ return {
246
+ type: TokenName[16 /* OpenFilter */],
247
+ value: '|',
248
+ start: position(),
249
+ end: position('|')
250
+ };
251
+ } else if (mainState === mainStates.Filter && (token === null || token === void 0 ? void 0 : token.value) === '|') {
252
+ return {
253
+ type: TokenName[16 /* OpenFilter */],
254
+ value: '|',
255
+ start: position(),
256
+ end: position('|')
257
+ };
258
+ }
259
+ if (!token && input[index] === '`') {
260
+ pushState(mainStates.Template);
261
+ return {
262
+ type: TokenName[10 /* Punctuator */],
263
+ value: '`',
264
+ start: position(),
265
+ end: position('`')
266
+ };
267
+ }
268
+ return token;
269
+ }
270
+ function char() {
271
+ if (mainState !== mainStates.Filter) {
272
+ return null;
273
+ }
274
+ var i = index;
275
+ var ch = input[i];
276
+ if (ch === '\\') {
277
+ var nextCh = input[i + 1];
278
+ if (nextCh === '$' || ~punctuatorList.indexOf(nextCh) || escapes.hasOwnProperty(nextCh)) {
279
+ i++;
280
+ ch = nextCh === 'b' ? '\b' : nextCh === 'f' ? '\f' : nextCh === 'n' ? '\n' : nextCh === 'r' ? '\r' : nextCh === 't' ? '\t' : nextCh === 'v' ? '\v' : nextCh;
281
+ } else {
282
+ var pos = position(input.substring(index, index + 2));
283
+ throw new SyntaxError("Unexpected token " + nextCh + " in " + pos.line + ":" + pos.column);
284
+ }
285
+ }
286
+ var token = {
287
+ type: TokenName[17 /* Char */],
288
+ value: ch,
289
+ start: position(),
290
+ end: position(input.substring(index, i + 1))
291
+ };
292
+ return token;
293
+ }
294
+ function template() {
295
+ if (mainState !== mainStates.Template) {
296
+ return null;
297
+ }
298
+ var state = stringStates.START;
299
+ var i = index;
300
+ while (i < input.length) {
301
+ var ch = input[i];
302
+ if (state === stringStates.ESCAPE) {
303
+ if (escapes.hasOwnProperty(ch) || ch === '`' || ch === '$') {
304
+ i++;
305
+ state = stringStates.START_QUOTE_OR_CHAR;
306
+ } else {
307
+ var pos = position(input.substring(index, i + 1));
308
+ throw new SyntaxError("Unexpected token " + ch + " in " + pos.line + ":" + pos.column);
309
+ }
310
+ } else if (ch === '\\') {
311
+ i++;
312
+ state = stringStates.ESCAPE;
313
+ } else if (ch === '`') {
314
+ popState();
315
+ tokenCache.push({
316
+ type: TokenName[10 /* Punctuator */],
317
+ value: '`',
318
+ start: position(input.substring(index, i)),
319
+ end: position(input.substring(index, i + 1))
320
+ });
321
+ break;
322
+ } else if (ch === '$') {
323
+ var nextCh = input[i + 1];
324
+ if (nextCh === '{') {
325
+ pushState(mainStates.EXPRESSION);
326
+ tokenCache.push({
327
+ type: TokenName[14 /* TemplateLeftBrace */],
328
+ value: '${',
329
+ start: position(input.substring(index, i)),
330
+ end: position(input.substring(index, i + 2))
331
+ });
332
+ break;
333
+ }
334
+ i++;
335
+ } else {
336
+ i++;
337
+ }
338
+ }
339
+ if (i > index) {
340
+ var value = input.substring(index, i);
341
+ return {
342
+ type: TokenName[13 /* TemplateRaw */],
343
+ value: escapeString(value, ['`', '$']),
344
+ raw: value,
345
+ start: position(),
346
+ end: position(value)
347
+ };
348
+ }
349
+ return tokenCache.length ? tokenCache.shift() : null;
350
+ }
351
+ function skipWhiteSpace() {
352
+ while (index < input.length) {
353
+ var ch = input[index];
354
+ if (ch === '\r') {
355
+ // CR (Unix)
356
+ index++;
357
+ line++;
358
+ column = 1;
359
+ if (input.charAt(index) === '\n') {
360
+ // CRLF (Windows)
361
+ index++;
362
+ }
363
+ } else if (ch === '\n') {
364
+ // LF (MacOS)
365
+ index++;
366
+ line++;
367
+ column = 1;
368
+ } else if (ch === '\t' || ch === ' ') {
369
+ index++;
370
+ column++;
371
+ } else {
372
+ break;
373
+ }
374
+ }
375
+ }
376
+ function punctuator() {
377
+ var find = punctuatorList.find(function (punctuator) {
378
+ return input.substring(index, index + punctuator.length) === punctuator;
379
+ });
380
+ if (find) {
381
+ return {
382
+ type: TokenName[10 /* Punctuator */],
383
+ value: find,
384
+ start: position(),
385
+ end: position(find)
386
+ };
387
+ }
388
+ return null;
389
+ }
390
+ // substring(index, index + 4) 在某些情况会匹配错误
391
+ // 比如变量名称为 trueValue
392
+ // ${value2|isTrue:trueValue:falseValue}
393
+ function literal() {
394
+ // {4,10} 匹配长度就足够判断 ("true").length <= targetLength <= ("undefined").length + 1
395
+ var match = input.substring(index).match(/^\w{4,10}/);
396
+ if (!match) {
397
+ return null;
398
+ }
399
+ var keyword = match[0].toLowerCase();
400
+ var value = keyword;
401
+ var isLiteral = false;
402
+ if (keyword === 'true' || keyword === 'null') {
403
+ isLiteral = true;
404
+ value = keyword === 'true' ? true : null;
405
+ } else if (keyword === 'false') {
406
+ isLiteral = true;
407
+ value = false;
408
+ } else if (keyword === 'undefined') {
409
+ isLiteral = true;
410
+ value = undefined;
411
+ }
412
+ if (isLiteral) {
413
+ return {
414
+ type: value === true || value === false ? TokenName[1 /* BooleanLiteral */] : TokenName[8 /* Literal */],
415
+ value: value,
416
+ raw: keyword,
417
+ start: position(),
418
+ end: position(keyword)
419
+ };
420
+ }
421
+ return null;
422
+ }
423
+ function numberLiteral() {
424
+ var i = index;
425
+ var passedValueIndex = i;
426
+ var state = numberStates.START;
427
+ iterator: while (i < input.length) {
428
+ var _char = input.charAt(i);
429
+ switch (state) {
430
+ case numberStates.START:
431
+ {
432
+ if (_char === '0') {
433
+ passedValueIndex = i + 1;
434
+ state = numberStates.ZERO;
435
+ } else if (isDigit1to9(_char)) {
436
+ passedValueIndex = i + 1;
437
+ state = numberStates.DIGIT;
438
+ } else {
439
+ return null;
440
+ }
441
+ break;
442
+ }
443
+ case numberStates.ZERO:
444
+ {
445
+ if (_char === '.') {
446
+ state = numberStates.POINT;
447
+ } else if (isExp(_char)) {
448
+ state = numberStates.EXP;
449
+ } else {
450
+ break iterator;
451
+ }
452
+ break;
453
+ }
454
+ case numberStates.DIGIT:
455
+ {
456
+ if (isDigit(_char)) {
457
+ passedValueIndex = i + 1;
458
+ } else if (_char === '.') {
459
+ state = numberStates.POINT;
460
+ } else if (isExp(_char)) {
461
+ state = numberStates.EXP;
462
+ } else {
463
+ break iterator;
464
+ }
465
+ break;
466
+ }
467
+ case numberStates.POINT:
468
+ {
469
+ if (isDigit(_char)) {
470
+ passedValueIndex = i + 1;
471
+ state = numberStates.DIGIT_FRACTION;
472
+ } else {
473
+ break iterator;
474
+ }
475
+ break;
476
+ }
477
+ case numberStates.DIGIT_FRACTION:
478
+ {
479
+ if (isDigit(_char)) {
480
+ passedValueIndex = i + 1;
481
+ } else if (isExp(_char)) {
482
+ state = numberStates.EXP;
483
+ } else {
484
+ break iterator;
485
+ }
486
+ break;
487
+ }
488
+ }
489
+ i++;
490
+ }
491
+ if (passedValueIndex > 0) {
492
+ var value = input.slice(index, passedValueIndex);
493
+ return {
494
+ type: TokenName[9 /* NumericLiteral */],
495
+ value: formatNumber(value),
496
+ raw: value,
497
+ start: position(),
498
+ end: position(value)
499
+ };
500
+ }
501
+ return null;
502
+ }
503
+ function stringLiteral() {
504
+ var startQuote = '"';
505
+ var state = stringStates.START;
506
+ var i = index;
507
+ while (i < input.length) {
508
+ var ch = input[i];
509
+ if (state === stringStates.START) {
510
+ if (ch === '"' || ch === "'") {
511
+ startQuote = ch;
512
+ i++;
513
+ state = stringStates.START_QUOTE_OR_CHAR;
514
+ } else {
515
+ break;
516
+ }
517
+ } else if (state === stringStates.ESCAPE) {
518
+ if (escapes.hasOwnProperty(ch) || ch === startQuote) {
519
+ i++;
520
+ state = stringStates.START_QUOTE_OR_CHAR;
521
+ } else {
522
+ var pos = position(input.substring(index, i + 1));
523
+ throw new SyntaxError("Unexpected token " + ch + " in " + pos.line + ":" + pos.column);
524
+ }
525
+ } else if (ch === '\\') {
526
+ i++;
527
+ state = stringStates.ESCAPE;
528
+ } else if (ch === startQuote) {
529
+ i++;
530
+ break;
531
+ } else {
532
+ i++;
533
+ }
534
+ }
535
+ if (i > index) {
536
+ var value = input.substring(index, i);
537
+ return {
538
+ type: TokenName[11 /* StringLiteral */],
539
+ value: escapeString(value.substring(1, value.length - 1), [startQuote]),
540
+ raw: value,
541
+ start: position(),
542
+ end: position(value)
543
+ };
544
+ }
545
+ return null;
546
+ }
547
+ function identifier() {
548
+ // 变量模式是 resolveVariable 的时候使用的
549
+ // 这个纯变量获取模式,不支持其他什么表达式
550
+ // 仅仅支持 xxx.xxx 或者 xxx[ exression ] 这类语法
551
+ // 所以纯变量模式支持纯数字作为变量名
552
+ var reg = (options === null || options === void 0 ? void 0 : options.variableMode) ? /^[\u4e00-\u9fa5A-Za-z0-9_$@][\u4e00-\u9fa5A-Za-z0-9_\-$@]*/ : /^(?:[\u4e00-\u9fa5A-Za-z_$@]([\u4e00-\u9fa5A-Za-z0-9_\-$@]|\\(?:\.|\[|\]|\(|\)|\{|\}|\s|=|!|>|<|\||&|\+|-|\*|\/|\^|~|%|&|\?|:|;|,))*|\d+[\u4e00-\u9fa5A-Za-z_$@](?:[\u4e00-\u9fa5A-Za-z0-9_\-$@]|\\(?:\.|\[|\]|\(|\)|\{|\}|\s|=|!|>|<|\||&|\+|-|\*|\/|\^|~|%|&|\?|:|;|,))*)/;
553
+ var match = reg.exec(input.substring(index, index + 256) // 变量长度不能超过 256
554
+ );
555
+
556
+ if (match) {
557
+ return {
558
+ type: TokenName[7 /* Identifier */],
559
+ value: match[0].replace(/\\(\.|\[|\]|\(|\)|\{|\}|\s|=|!|>|<|\||&|\+|-|\*|\/|\^|~|%|&|\?|:|;|,)/g, function (_, v) {
560
+ return v;
561
+ }),
562
+ start: position(),
563
+ end: position(match[0])
564
+ };
565
+ }
566
+ return null;
567
+ }
568
+ function getNextToken() {
569
+ if (tokenCache.length) {
570
+ return tokenCache.shift();
571
+ }
572
+ if (mainState === mainStates.SCRIPT || mainState === mainStates.EXPRESSION || mainState === mainStates.BLOCK) {
573
+ skipWhiteSpace();
574
+ }
575
+ return eof() || raw() || openScript() || expression() || template();
576
+ }
577
+ return {
578
+ next: function next() {
579
+ var token = getNextToken();
580
+ if (token) {
581
+ index = token.end.index;
582
+ line = token.end.line;
583
+ column = token.end.column;
584
+ return token;
585
+ }
586
+ var pos = position();
587
+ throw new SyntaxError("unexpected character \"" + input[index] + "\" at " + pos.line + ":" + pos.column);
588
+ }
589
+ };
590
+ }