@live-codes/browser-compilers 0.5.1 → 0.5.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.
@@ -0,0 +1,1520 @@
1
+ /* eslint-disable */
2
+ // @ts-nocheck
3
+
4
+ // from https://github.com/imba/imba.io/blob/master/scripts/lexer/grammar.imba
5
+ // and https://github.com/imba/imba.io/blob/master/src/repl/languages/imba.imba
6
+
7
+ function iter$__(a) {
8
+ let v;
9
+ return a ? ((v = a.toIterable) ? v.call(a) : a) : [];
10
+ }
11
+
12
+ /*body*/
13
+ const eolpop = [/^/, { token: '@rematch', next: '@pop' }];
14
+ const repop = { token: '@rematch', next: '@pop' };
15
+ const toodeep = { token: 'white.indent', next: '@>illegal_indent' };
16
+
17
+ const EOF = '§EOF§';
18
+
19
+ function regexify(array, pattern = '#') {
20
+ if (typeof array == 'string') {
21
+ array = array.split(' ');
22
+ }
23
+
24
+ let items = array.slice().sort(function (_0, _1) {
25
+ return _1.length - _0.length;
26
+ });
27
+ items = items.map(function (item) {
28
+ let escaped = item.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&');
29
+ return pattern.replace('#', escaped);
30
+ });
31
+ return new RegExp('(?:' + items.join('|') + ')');
32
+ }
33
+
34
+ function denter(indent, outdent, stay, o = {}) {
35
+ var v$φ;
36
+
37
+ if (indent == null) {
38
+ indent = toodeep;
39
+ } else if (indent == 1) {
40
+ indent = { next: '@>' };
41
+ } else if (indent == 2) {
42
+ indent = { next: '@>_indent&-_indent' };
43
+ } else if (typeof indent == 'string') {
44
+ indent = { next: indent };
45
+ }
46
+
47
+ if (outdent == -1) {
48
+ outdent = repop;
49
+ }
50
+ if (stay == -1) {
51
+ stay = repop;
52
+ } else if (stay == 0) {
53
+ o.comment == null ? (o.comment = true) : o.comment;
54
+
55
+ stay = {};
56
+ }
57
+
58
+ indent = Object.assign({ token: 'white.tabs' }, indent || {});
59
+ stay = Object.assign({ token: 'white.tabs' }, stay || {});
60
+ outdent = Object.assign({ token: '@rematch', next: '@pop' }, outdent || {});
61
+
62
+ let cases = {
63
+ '$1==$S2\t': indent,
64
+ '$1==$S2': {
65
+ cases: { '$1==$S6': stay, '@default': { token: '@rematch', switchTo: '@*$1' } },
66
+ },
67
+ '@default': outdent,
68
+ };
69
+ v$φ = 0;
70
+ for (let k of ['next', 'switchTo']) {
71
+ let v = v$φ++;
72
+ if (indent[k] && indent[k].indexOf('*') == -1) {
73
+ indent[k] += '*$1';
74
+ }
75
+ }
76
+
77
+ // for own k,v of cases
78
+ let rule = [/^(\t*)(?=[^ \t\n])/, { cases: cases }];
79
+ if (o.comment) {
80
+ let clones = {};
81
+ for (let iφ = 0, keysφ = Object.keys(cases), lφ = keysφ.length, k, v; iφ < lφ; iφ++) {
82
+ k = keysφ[iφ];
83
+ v = cases[k];
84
+ let clone = Object.assign({}, v);
85
+ if (!clone.next && !clone.switchTo) {
86
+ clone.next = '@>_comment';
87
+ }
88
+ clones[k] = clone;
89
+ }
90
+ return [[/^(\t*)(?=#\s|#$)/, { cases: clones }], rule];
91
+ }
92
+
93
+ return rule;
94
+ }
95
+
96
+ const states = {
97
+ root: [
98
+ [/^@comment/, 'comment', '@>_comment'], // want to push this state _ before the token
99
+ [
100
+ /^(\t+)(?=[^\t\n])/,
101
+ {
102
+ cases: {
103
+ '$1==$S2\t': { token: 'white.indent', next: '@>_indent*$1' },
104
+ '@default': 'white.indent',
105
+ },
106
+ },
107
+ ],
108
+ 'block_',
109
+ ],
110
+
111
+ _comment: [
112
+ [/^([\t\s\n]*)$/, 'comment'],
113
+ [
114
+ /^(\t*)([\S\s]*)/,
115
+ {
116
+ cases: {
117
+ // same or deeper indentation
118
+ '$1~$S2\t*': { token: 'comment' },
119
+ '@default': { token: '@rematch', next: '@pop' },
120
+ },
121
+ },
122
+ ],
123
+ [/[\S\s]+/, 'comment'],
124
+ ],
125
+
126
+ illegal_indent: [denter()],
127
+
128
+ identifier_: [
129
+ [/\$\w+\$/, 'identifier.env'],
130
+ [/\$\d+/, 'identifier.special'],
131
+ [/\#+@id/, 'identifier.symbol'],
132
+ [/\¶@id/, 'ivar'], // imba1
133
+ [
134
+ /@id\!?/,
135
+ {
136
+ cases: {
137
+ this: 'this',
138
+ self: 'self',
139
+ '@keywords': 'keyword.$#',
140
+ '$0~[A-Z].*': 'identifier.uppercase.$F',
141
+ '@default': 'identifier.$F',
142
+ },
143
+ },
144
+ ],
145
+ ],
146
+
147
+ block_: [
148
+ // 'common_'
149
+ [/^(\t+)(?=[\r\n]|$)/, 'white.tabs'],
150
+ 'class_',
151
+ 'tagclass_',
152
+ 'var_',
153
+ 'func_',
154
+ 'import_',
155
+ 'export_',
156
+ 'flow_',
157
+ 'for_',
158
+ 'try_',
159
+ 'catch_',
160
+ 'while_',
161
+ 'css_',
162
+ 'tag_',
163
+ 'do_',
164
+ 'block_comment_',
165
+ 'expr_',
166
+ [/[ ]+/, 'white'],
167
+ 'common_',
168
+ ],
169
+
170
+ indentable_: [
171
+ [/^[ ]+/, 'white'],
172
+ denter('@>_paren_indent&-_indent', null, null),
173
+ [/^(\t+)(?=[\r\n]|$)/, 'white.tabs'],
174
+ 'whitespace',
175
+ ],
176
+
177
+ _indent: [denter(2, -1, 0), 'block_'],
178
+
179
+ _paren_indent: [denter(2, -1, 0), 'block_', [/\)|\}|\]/, '@rematch', '@pop']],
180
+
181
+ block: [denter('@>', -1, 0), 'block_'],
182
+ bool_: [[/(true|false|yes|no|undefined|null)(?![\:\-\w\.\_])/, 'boolean']],
183
+
184
+ op_: [
185
+ [/\s+\:\s+/, 'operator.ternary'],
186
+ // [/\s*(\=)/]
187
+ [
188
+ /(@unspaced_ops)/,
189
+ {
190
+ cases: {
191
+ '@spread': 'operator.spread',
192
+ '@access': 'operator.access',
193
+ '@default': 'operator',
194
+ },
195
+ },
196
+ ],
197
+ [/\/(?!\/)/, 'operator.math'],
198
+ [/\&(?=[,\)])/, 'operator.special.blockparam'],
199
+ [
200
+ /(\s*)(@symbols)(\s*)/,
201
+ {
202
+ cases: {
203
+ '$2@assignments': 'operator.assign',
204
+ '$2@math': 'operator.math',
205
+ '$2@operators': 'operator',
206
+ '$2@logic': 'operator.logic',
207
+ '$2@access': 'operator.access',
208
+ '@default': 'delimiter',
209
+ },
210
+ },
211
+ ],
212
+ [/\&\b/, 'operator'],
213
+ ],
214
+
215
+ keyword_: [
216
+ [/new@B/, 'keyword.new'],
217
+ [/isa@B/, 'keyword.isa'],
218
+ [/is@B/, 'keyword.is'],
219
+ [/(switch|when|throw|continue|break|then|await|typeof|by)@B/, 'keyword.$1'],
220
+ [/delete@B/, 'keyword.delete'],
221
+ [/and@B|or@B/, 'operator.flow'],
222
+ ],
223
+
224
+ return_: [[/return@B/, 'keyword.new']],
225
+
226
+ primitive_: ['string_', 'number_', 'regexp_', 'bool_'],
227
+
228
+ value_: [
229
+ 'primitive_',
230
+ 'keyword_',
231
+ 'implicit_call_',
232
+ 'parens_', // call will always capture?
233
+ 'key_',
234
+ 'access_',
235
+ 'identifier_',
236
+ 'array_',
237
+ 'object_',
238
+ ],
239
+
240
+ expr_: ['comment_', 'inline_var_', 'return_', 'value_', 'tag_', 'op_', 'type_', 'spread_'],
241
+
242
+ attr_expr_: [
243
+ 'primitive_',
244
+ 'parens_',
245
+ 'access_',
246
+ 'identifier_',
247
+ 'array_',
248
+ 'object_',
249
+ 'tag_',
250
+ 'op_',
251
+ ],
252
+
253
+ access_: [
254
+ [
255
+ /(\.\.?)(@propid\!?)/,
256
+ {
257
+ cases: {
258
+ '$2~[A-Z].*': ['operator.access', 'accessor.uppercase'],
259
+ '$2~#.*': ['operator.access', 'accessor.symbol'],
260
+ '@default': ['operator.access', 'accessor'],
261
+ },
262
+ },
263
+ ],
264
+ ],
265
+
266
+ call_: [[/\(/, '(', '@call_body']],
267
+
268
+ key_: [
269
+ [/(\#+@id)(\:\s*)/, ['key.symbol', 'operator.assign.key-value']],
270
+ [
271
+ /(@propid)(\:\s*)/,
272
+ {
273
+ cases: {
274
+ '@default': ['key', 'operator.assign.key-value'],
275
+ },
276
+ },
277
+ ],
278
+ ],
279
+
280
+ implicit_call_: [
281
+ [
282
+ /(\.\.?)(@propid)@implicitCall/,
283
+ {
284
+ cases: {
285
+ '$2~[A-Z].*': ['operator.access', 'accessor.uppercase', '@implicit_call_body'],
286
+ '@default': ['operator.access', 'accessor', '@implicit_call_body'],
287
+ },
288
+ },
289
+ ],
290
+ [
291
+ /(@propid)@implicitCall/,
292
+ {
293
+ cases: {
294
+ '$2~[A-Z].*': ['identifier.uppercase', '@implicit_call_body'],
295
+ '@default': ['identifier', '@implicit_call_body'],
296
+ },
297
+ },
298
+ ],
299
+ ],
300
+
301
+ implicit_call_body: [eolpop, [/\)|\}|\]|\>/, '@rematch', '@pop'], 'arglist_', 'whitespace'],
302
+
303
+ arglist_: ['do_', 'expr_', [/\s*\,\s*/, 'delimiter.comma']],
304
+
305
+ params_: [
306
+ [/\[/, 'array.[', '@array_var_body=decl-param'],
307
+ [/\{/, 'object.{', '@object_body=decl-param'],
308
+ [/(@variable)/, 'identifier.decl-param'],
309
+ // [/(\s*\=\s*)(?=(for|while|until|if|unless)\s)/,'operator','@pop']
310
+ 'spread_',
311
+ 'type_',
312
+ [/\s*\=\s*/, 'operator', '@var_value='],
313
+ [/\s*\,\s*/, 'separator'],
314
+ ],
315
+
316
+ object_: [[/\{/, 'object.{', '@object_body']],
317
+
318
+ parens_: [[/\(/, 'parens.(', '@parens_body']],
319
+
320
+ parens_body: [[/\)/, ')', '@pop'], 'indentable_', 'arglist_'],
321
+
322
+ array_: [[/\[/, 'array.[', '@array_body']],
323
+
324
+ array_body: [
325
+ [/\]@implicitCall/, { token: ']', switchTo: '@implicit_call_body=' }],
326
+ [/\]/, ']', '@pop'],
327
+ [/\)|\}/, 'invalid'],
328
+ 'indentable_',
329
+ 'expr_',
330
+ [',', 'delimiter'],
331
+ ],
332
+
333
+ object_body: [
334
+ [/\}/, '}', '@pop'],
335
+ [/(@id)(\s*:\s*)/, ['key', 'operator.assign.key-value', '@object_value']],
336
+ [/(@id)/, 'identifier.$F'],
337
+ [/\[/, '[', '@object_dynamic_key='], //
338
+ [/\s*=\s*/, 'operator.assign', '@object_value='],
339
+ [/:/, 'operator.assign.key-value', '@object_value='],
340
+ [/\,/, 'delimiter.comma'],
341
+ 'indentable_',
342
+ 'expr_',
343
+ ],
344
+
345
+ object_value: [
346
+ eolpop,
347
+ // couldnt this be indented as well?
348
+ // [/(?=,|\})/, 'delimiter', '@pop']
349
+ [/,|\}|\]|\)/, '@rematch', '@pop'],
350
+ 'expr_',
351
+ ],
352
+
353
+ object_dynamic_key: [[']', ']', '@pop'], 'expr_'],
354
+
355
+ comment_: [[/#(\s.*)?(\n|$)/, 'comment']],
356
+
357
+ block_comment_: [[/###/, 'comment.start', '@_block_comment']],
358
+
359
+ _block_comment: [
360
+ [/###/, 'comment.end', '@pop'],
361
+ [/[^#]+/, 'comment'],
362
+ [/#(?!##)/, 'comment'],
363
+ ],
364
+
365
+ // add try_start that accepts catch on the same line?
366
+ try_: [[/try@B/, 'keyword.try', '@>_try&try']],
367
+
368
+ catch_: [
369
+ [/(catch\s+)(?=@id(\s|$))/, 'keyword.catch', '@catch_start&catch'],
370
+ [/catch@B/, 'keyword.catch', '@catch_start&catch'],
371
+ ],
372
+
373
+ catch_start: [
374
+ [/@id/, 'identifier.decl-const', { switchTo: '@>_catch' }],
375
+ [/.?/, '@rematch', { switchTo: '@>_catch' }],
376
+ ],
377
+
378
+ _catch: [denter('@>block', -1, 0), 'block_'],
379
+
380
+ _try: [denter('@>block', -1, 0), 'block_'],
381
+
382
+ do_: [
383
+ // [/(do)(\()/,['keyword.do','(','@>_do_params&do']]
384
+ [/do(?=\()/, 'keyword.do', '@>do_start&do'],
385
+ [/do(?=\s*\|)/, 'keyword.do', '@>do_piped&do'],
386
+ [/do@B/, 'keyword.do', '@>_do&do'],
387
+ ],
388
+
389
+ do_start: [
390
+ denter(null, -1, -1),
391
+ [/\(/, '(', { switchTo: '@_do_params' }],
392
+ [/./, '@rematch', { switchTo: '@_do' }],
393
+ ],
394
+
395
+ do_piped: [
396
+ denter(null, -1, -1),
397
+ [/\s*\|/, 'args.open', { switchTo: '@_do_piped_params' }],
398
+ [/./, '@rematch', { switchTo: '@_do' }],
399
+ ],
400
+
401
+ _do_piped_params: [[/\|/, 'args.close', { switchTo: '@_do' }], 'params_'],
402
+
403
+ _do_params: [[/\)/, ')', { switchTo: '@_do' }], 'params_'],
404
+
405
+ _do: [
406
+ denter(2, -1, 0),
407
+ // block in general, no?
408
+ [/(\}|\)|\])/, '@rematch', '@pop'],
409
+ 'block_',
410
+ ],
411
+
412
+ class_: [
413
+ [/(extend)(?=\s+class )/, 'keyword.$1'],
414
+ [/(global)(?=\s+class )/, 'keyword.$1'],
415
+ [
416
+ /(class)(\s)(@id)/,
417
+ ['keyword.$1', 'white.$1name', 'entity.name.class.decl-const', '@class_start='],
418
+ ],
419
+ [/(class)(?=\n)/, 'keyword.$1', '@>_class&class='],
420
+ ],
421
+
422
+ class_start: [
423
+ [/(\s+\<\s+)(@id)/, ['keyword.extends', 'identifier.superclass']],
424
+ [/@comment/, 'comment'],
425
+ [/^/, '@rematch', { switchTo: '@>_class&class=' }],
426
+ ],
427
+
428
+ tagclass_: [
429
+ [/(extend)(?=\s+tag )/, 'keyword.$1'],
430
+ [/(global)(?=\s+tag )/, 'keyword.$1'],
431
+ [
432
+ /(tag)(\s)(@constant)/,
433
+ ['keyword.tag', 'white.tagname', 'entity.name.component.local', '@tagclass_start='],
434
+ ], // only when uppercase
435
+ [
436
+ /(tag)(\s)(@id)/,
437
+ ['keyword.tag', 'white.tagname', 'entity.name.component.global', '@tagclass_start='],
438
+ ], // only when uppercase
439
+ ],
440
+
441
+ tagclass_start: [
442
+ [/(\s+\<\s+)(@id)/, ['keyword.extends', 'identifier.superclass']],
443
+ [/@comment/, 'comment'],
444
+ [/^/, '@rematch', { switchTo: '@>_tagclass&component=' }],
445
+ ],
446
+
447
+ import_: [
448
+ [/(import)(?=\s+['"])/, 'keyword.import', '@>import_source'],
449
+ [
450
+ /(import)(\s+type)(?=\s[\w\$\@\{])/,
451
+ ['keyword.import', 'keyword.type', '@>import_body&-_imports=decl-import/part'],
452
+ ],
453
+ [/(import)@B/, 'keyword.import', '@>import_body&-_imports=decl-import/part'],
454
+ ],
455
+
456
+ import_body: [
457
+ denter(null, -1, 0),
458
+ [
459
+ /(@esmIdentifier)( +from)/,
460
+ ['identifier.$F.default', 'keyword.from', { switchTo: '@import_source' }],
461
+ ],
462
+ [
463
+ /(\*)(\s+as\s+)(@esmIdentifier)(\s+from)/,
464
+ [
465
+ 'keyword.star',
466
+ 'keyword.as',
467
+ 'identifier.$F.ns',
468
+ 'keyword.from',
469
+ { switchTo: '@import_source' },
470
+ ],
471
+ ],
472
+ [
473
+ /(@esmIdentifier)(\s*,\s*)(\*)(\s+as\s+)(@esmIdentifier)(from)/,
474
+ [
475
+ 'identifier.$F.default',
476
+ 'delimiter.comma',
477
+ 'keyword.star',
478
+ 'keyword.as',
479
+ 'identifier.$F.ns',
480
+ 'keyword.from',
481
+ { switchTo: '@import_source' },
482
+ ],
483
+ ],
484
+ // [/(\*)(\s+as\s+)(@esmIdentifier)/, ['keyword.star','keyword.as','identifier.const.import',switchTo: '@/delim']]
485
+ // [/(@esmIdentifier)(\s+as\s+)(@esmIdentifier)/, ['alias','keyword.as','identifier.const.import']]
486
+ [/\ *from/, 'keyword.from', { switchTo: '@import_source' }],
487
+ [/\{/, 'specifiers.{', '@esm_specifiers/part'],
488
+ [/(@esmIdentifier)/, 'identifier.$F', { switchTo: '@/delim' }],
489
+ [/\s*\,\s*/, 'delimiter.comma', { switchTo: '@/part' }],
490
+ 'comma_',
491
+ 'common_',
492
+ ],
493
+
494
+ import_source: [denter(null, -1, 0), [/["']/, 'path.open', '@_path=$#'], eolpop],
495
+
496
+ export_: [
497
+ [/(export)( +)(default)@B/, ['keyword.export', 'white', 'keyword.default']], // ,'@>import_body'
498
+ [/(export)(?= +(let|const|var|class|tag)@B)/, 'keyword.export'], // ,'@>import_body'
499
+ [/(export)( +)(global)@B/, ['keyword.export', 'white', 'keyword.global']], // ,'@>import_body'
500
+
501
+ [
502
+ /(export)(\s+\*\s+)(from)@B/,
503
+ ['keyword.export', 'operator.star', 'keyword.from', '@>import_source'],
504
+ ],
505
+ [/(export)@B/, 'keyword.export', '@>export_body'],
506
+ ],
507
+
508
+ export_body: [
509
+ denter(null, -1, 0),
510
+ [/(\*)(\s+as\s+)(@esmIdentifier)/, ['keyword.star', 'keyword.as', 'identifier.const.export']],
511
+ [/(@esmIdentifier)(\s+as\s+)(default)/, ['alias', 'keyword.as', 'alias.default']],
512
+ [
513
+ /(@esmIdentifier)(\s+as\s+)(@esmIdentifier)/,
514
+ ['alias', 'keyword.as', 'identifier.const.export'],
515
+ ],
516
+ [/from/, 'keyword.from', { switchTo: '@import_source' }],
517
+ [/\{/, '{', '@esm_specifiers=export/part'],
518
+ [/(@esmIdentifier)/, 'identifier.const.export'],
519
+ [/\*/, 'operator.star'],
520
+ 'comma_',
521
+ 'common_',
522
+ ],
523
+
524
+ esm_specifiers: [
525
+ [/\}/, '}', '@pop'],
526
+ [
527
+ /(@esmIdentifier)(\s+as\s+)(@esmIdentifier)/,
528
+ ['alias', 'keyword.as', 'identifier.const.$F', { switchTo: '@/delim' }],
529
+ ],
530
+ [
531
+ /@esmIdentifier/,
532
+ {
533
+ cases: {
534
+ '$/==part': { token: 'identifier.const.$S4', switchTo: '@/delim' },
535
+ '@default': { token: 'invalid' },
536
+ },
537
+ },
538
+ ],
539
+ [/\s*\,\s*/, 'delimiter.comma', { switchTo: '@/part' }],
540
+ 'whitespace',
541
+ ],
542
+
543
+ _path: [
544
+ [/[^"'\`\{\\]+/, 'path'],
545
+ [/@escapes/, 'path.escape'],
546
+ [/\./, 'path.escape.invalid'],
547
+ [/\{/, 'invalid'],
548
+ [/["'`]/, { cases: { '$#==$F': { token: 'path.close', next: '@pop' }, '@default': 'path' } }],
549
+ ],
550
+
551
+ member_: [
552
+ // [/static(?=\s+(get|set|def) )/,'keyword.static'] # only in class and tagclass?
553
+ [/(constructor)@B/, 'entity.name.constructor', '@>def_params&def/def'],
554
+ [
555
+ /(def|get|set)(\s)(@defid)/,
556
+ ['keyword.$1', 'white.entity', 'entity.name.$1', '@>def_params&$1/$1'],
557
+ ],
558
+ [/(def|get|set)(\s)(\[)/, ['keyword.$1', 'white.entity', '$$', '@>def_dynamic_name/$1']],
559
+ ],
560
+
561
+ func_: [
562
+ [/export(?=\s+(get|set|def|global) )/, 'keyword.export'], // only in class and tagclass?
563
+ [/global(?=\s+(get|set|def) )/, 'keyword.global'], // only in class and tagclass?
564
+ [
565
+ /(def)(\s)(@id)(\.)(@defid)/,
566
+ [
567
+ 'keyword.$1',
568
+ 'white.entity',
569
+ 'identifier.target',
570
+ 'operator',
571
+ 'entity.name.def',
572
+ '@>def_params&$1/$1',
573
+ ],
574
+ ],
575
+
576
+ [
577
+ /(def)(\s)(@defid)/,
578
+ ['keyword.$1', 'white.entity', 'entity.name.function.decl-const-func', '@>def_params&$1/$1'],
579
+ ],
580
+ ],
581
+
582
+ flow_: [
583
+ // [/(else)(?=\s|$)/, ['keyword.$1','@flow_start.$S2.flow.$S4']]
584
+ [/(if|else|elif|unless)(?=\s|$)/, ['keyword.$1', '@flow_start=$1']],
585
+ ],
586
+
587
+ flow_start: [
588
+ denter({ switchTo: '@>_flow&$F' }, -1, -1),
589
+ // denter({switchTo: '@>_flow&-body'},-1,-1)
590
+ // denter('@>_flow&block',-1,-1)
591
+ [/[ \t]+/, 'white'],
592
+ 'expr_',
593
+ ],
594
+
595
+ for_: [
596
+ [/for(?: own)?@B/, 'keyword.$#', '@for_start&forscope=decl-for'],
597
+ // [/for@B/,'keyword.$#','@for_start&flow=let']
598
+ ],
599
+
600
+ while_: [[/(while|until)@B/, 'keyword.$#', '@>while_body']],
601
+ while_body: [denter(2, -1, 0), 'block_'],
602
+
603
+ for_start: [
604
+ denter({ switchTo: '@>for_body' }, -1, -1),
605
+ [/\[/, 'array.[', '@array_var_body'],
606
+ [/\{/, 'object.{', '@object_body'], // object_var_body?
607
+ [/(@variable)/, 'identifier.$F'],
608
+ [/(\s*\,\s*)/, 'separator', '@=decl-for-index'],
609
+ [/\s(in|of)@B/, 'keyword.$1', { switchTo: '@>for_source=' }],
610
+ [/[ \t]+/, 'white'],
611
+ 'type_',
612
+ ],
613
+ for_source: [
614
+ denter({ switchTo: '@>for_body' }, -1, { switchTo: '@for_body' }),
615
+ 'expr_',
616
+ [/[ \t]+/, 'white'],
617
+ ],
618
+
619
+ for_body: [denter(2, -1, 0), 'block_'],
620
+
621
+ decorator_: [
622
+ [/(@decid)(\()/, ['decorator', '$2', '@_decorator_params']],
623
+ [/(@decid)/, 'decorator'],
624
+ ],
625
+
626
+ _decorator_params: [[/\)/, ')', '@pop'], 'params_'],
627
+
628
+ field_: [
629
+ [
630
+ /((?:lazy )?)((?:static )?)(const|let|attr)(?=\s|$)/,
631
+ ['keyword.lazy', 'keyword.static', 'keyword.$1', '@_vardecl=field-$3'],
632
+ ], // $2_body.$S2.$2.$S4
633
+ [/(static\s+)(?=@fieldid)/, 'keyword.static'],
634
+ [/(@fieldid)(?=$)/, 'entity.name.field'],
635
+ [/(@fieldid)/, ['entity.name.field', '@_field_1']],
636
+ ],
637
+
638
+ _field_1: [
639
+ denter(null, -1, -1),
640
+ 'type_',
641
+ [/(\s*=)(?!\=)/, ['operator.assign', '@>_field_value&field']],
642
+ [/(\s*(?:\@)set\s*)/, ['keyword.spy', '@>_def&spy']],
643
+ ],
644
+
645
+ _field_value: [
646
+ denter(2, -1, 0),
647
+ 'block_', // sure?
648
+ [/(\s*(?:\@)set\s*)/, ['@rematch', '@pop']],
649
+ ],
650
+
651
+ var_: [
652
+ [
653
+ /((?:export )?)(const|let)(?=\s[\[\{\$a-zA-Z]|\s*$)/,
654
+ ['keyword.export', 'keyword.$1', '@_vardecl=decl-$2'],
655
+ ], // $2_body.$S2.$2.$S4
656
+ [/((?:export )?)(const|let)(?=\s|$)/, ['keyword.export', 'keyword.$1']],
657
+ ],
658
+
659
+ inline_var_: [
660
+ [/(const|let)(?=\s[\[\{\$a-zA-Z]|\s*$)/, ['keyword.$1', '@inline_var_body=decl-$1']],
661
+ ],
662
+
663
+ string_: [
664
+ [/"""/, 'string', '@_herestring="""'],
665
+ [/'''/, 'string', "@_herestring='''"],
666
+ [/["'`]/, 'string.open', '@_string=$#'],
667
+ ],
668
+
669
+ number_: [
670
+ [/0[xX][0-9a-fA-F_]+/, 'number.hex'],
671
+ [/0[b][01_]+/, 'number.binary'],
672
+ [/0[o][0-9_]+/, 'number.octal'],
673
+ [/(\d+)([a-z]+|\%)/, ['number', 'unit']],
674
+ [/(\d*\.\d+(?:[eE][\-+]?\d+)?)([a-z]+|\%)/, ['number.float', 'unit']],
675
+ [/\d+[eE]([\-+]?\d+)?/, 'number.float'],
676
+ [/\d[\d_]*\.\d[\d_]*([eE][\-+]?\d+)?/, 'number.float'],
677
+ [/\d[\d_]*/, 'number.integer'],
678
+ [/0[0-7]+(?!\d)/, 'number.octal'],
679
+ [/\d+/, 'number'],
680
+ ],
681
+
682
+ _string: [
683
+ [/[^"'\`\{\\]+/, 'string'],
684
+ [/@escapes/, 'string.escape'],
685
+ [/\./, 'string.escape.invalid'],
686
+ [
687
+ /\{/,
688
+ {
689
+ cases: {
690
+ "$F=='": 'string',
691
+ '@default': { token: 'string.bracket.open', next: '@interpolation_body' },
692
+ },
693
+ },
694
+ ],
695
+ [
696
+ /["'`]/,
697
+ { cases: { '$#==$F': { token: 'string.close', next: '@pop' }, '@default': 'string' } },
698
+ ],
699
+ [/#/, 'string'],
700
+ ],
701
+
702
+ _herestring: [
703
+ [/("""|''')/, { cases: { '$1==$F': { token: 'string', next: '@pop' }, '@default': 'string' } }],
704
+ [/[^#\\'"\{]+/, 'string'],
705
+ [/['"]+/, 'string'],
706
+ [/@escapes/, 'string.escape'],
707
+ [/\./, 'string.escape.invalid'],
708
+ [
709
+ /\{/,
710
+ {
711
+ cases: {
712
+ '$F=="""': { token: 'string', next: '@interpolation_body' },
713
+ '@default': 'string',
714
+ },
715
+ },
716
+ ],
717
+ [/#/, 'string'],
718
+ ],
719
+
720
+ interpolation_body: [[/\}/, 'string.bracket.close', '@pop'], 'expr_'],
721
+
722
+ _class: [
723
+ denter(toodeep, -1, 0),
724
+ // 'var_'
725
+ 'css_',
726
+ 'member_',
727
+ 'comment_',
728
+ 'decorator_',
729
+ [/(get|set|def|static|prop|attr)@B/, 'keyword.$0'],
730
+ 'field_',
731
+ 'common_',
732
+ ],
733
+
734
+ _tagclass: [
735
+ '_class',
736
+ [/(?=\<self)/, 'entity.name.def.render', '@_render&def'],
737
+ // self def
738
+ ],
739
+
740
+ def_params: [
741
+ // denter({switchTo: '@>_def'},-1,{switchTo: '@>_def'})
742
+ [/\(/, '(', '@def_parens'],
743
+ [/^/, '@rematch', { switchTo: '@_def' }],
744
+ [/do@B/, 'keyword.do', { switchTo: '@_def' }],
745
+ 'params_',
746
+ [/@comment/, 'comment'],
747
+ ],
748
+
749
+ def_parens: [[/\)/, ')', '@pop'], 'params_'],
750
+
751
+ def_dynamic_name: [[']', { token: 'square.close', switchTo: '@def_params&$/' }], 'expr_'],
752
+
753
+ _render: [denter(2, -1, -1), 'block_'],
754
+
755
+ _def: [denter(2, -1, 0), 'block_'],
756
+
757
+ _flow: [denter(2, -1, 0), 'block_'],
758
+
759
+ _varblock: [
760
+ denter(1, -1, -1),
761
+ [/\[/, 'array.[', '@array_var_body'],
762
+ [/\{/, 'object.{', '@object_body'],
763
+ [/(@variable)/, 'identifier.$F'],
764
+ [/\s*\,\s*/, 'separator'],
765
+ [/(\s*\=\s*)(?=(for|while|until|if|unless|try)\s)/, 'operator', '@pop'],
766
+ [/(\s*\=\s*)/, 'operator', '@var_value='],
767
+ 'type_',
768
+ [/#(\s.*)?\n?$/, 'comment'],
769
+ ],
770
+
771
+ _vardecl: [
772
+ denter(null, -1, -1),
773
+ [/\[/, 'array.[', '@array_var_body'],
774
+ [/\{/, 'object.{', '@object_body'],
775
+ [/(@variable)(?=\n|,|$)/, 'identifier.$F', '@pop'],
776
+ [/(@variable)/, 'identifier.$F'],
777
+ [/(\s*\=\s*)/, 'operator.declval', { switchTo: '@var_value&value=' }], // ,switchTo: '@var_value='
778
+ 'type_',
779
+ ],
780
+
781
+ array_var_body: [
782
+ [/\]/, ']', '@pop'],
783
+ [/\{/, 'object.{', '@object_body'],
784
+ [/\[/, 'array.[', '@array_var_body'],
785
+ 'spread_',
786
+ [/(@variable)/, 'identifier.$F'],
787
+ [/(\s*\=\s*)/, 'operator.assign', '@array_var_body_value='],
788
+ // 'expr_'
789
+ [',', 'delimiter'],
790
+ ],
791
+
792
+ array_var_body_value: [[/(?=,|\)|]|})/, 'delimiter', '@pop'], 'expr_'],
793
+
794
+ inline_var_body: [
795
+ [/\[/, 'array.[', '@array_var_body'],
796
+ [/\{/, 'object.{', '@object_body'],
797
+ [/(@variable)/, 'identifier.$F'],
798
+ [/(\s*\=\s*)/, 'operator', '@pop'], // ,switchTo: '@var_value='
799
+ 'type_',
800
+ ],
801
+
802
+ var_value: [
803
+ [/(?=,|\)|]|})/, 'delimiter', '@pop'],
804
+ denter({ switchTo: '@>block' }, -1, -1),
805
+ 'block_',
806
+ // 'do_'
807
+ // 'expr_'
808
+ // 'common_'
809
+ ],
810
+
811
+ common_: [[/^(\t+)(?=\n|$)/, 'white.tabs'], 'whitespace'],
812
+ comma_: [[/\s*,\s*/, 'delimiter.comma']],
813
+
814
+ spread_: [[/\.\.\./, 'operator.spread']],
815
+
816
+ type_: [[/\\/, '@rematch', '@_type&-_type/0']],
817
+
818
+ _type: [
819
+ denter(-1, -1, -1),
820
+ [/\\/, 'delimiter.type.prefix'],
821
+ // these should probably stack and pair
822
+ [/\[/, 'delimiter.type', '@/]'],
823
+ [/\(/, 'delimiter.type', '@/)'],
824
+ [/\{/, 'delimiter.type', '@/}'],
825
+ [/\</, 'delimiter.type', '@/>'],
826
+ [/\|/, 'delimiter.type.union'],
827
+ [
828
+ /\,|\s|\=|\./,
829
+ {
830
+ cases: {
831
+ '$/==0': { token: '@rematch', next: '@pop' },
832
+ '@default': 'type',
833
+ },
834
+ },
835
+ ],
836
+ [
837
+ /[\]\}\)\>]/,
838
+ {
839
+ cases: {
840
+ '$#==$/': { token: 'delimiter.type', next: '@pop' },
841
+ '@default': { token: '@rematch', next: '@pop' },
842
+ },
843
+ },
844
+ ],
845
+ [/[\w\-\$]+/, 'type'],
846
+ ],
847
+
848
+ css_: [
849
+ [/global(?=\s+css@B)/, 'keyword.$#'],
850
+ [/css(?:\s+)?/, 'keyword.css', '@>css_selector&rule-_sel'],
851
+ ],
852
+
853
+ sel_: [
854
+ [/(\%)((?:@id)?)/, ['style.selector.mixin.prefix', 'style.selector.mixin']],
855
+ [/(\@)(\.{0,2}[\w\-\<\>\!]*\+?)/, 'style.selector.modifier'],
856
+ [/(\@)(\.{0,2}[\w\-\<\>\!]*)/, 'style.selector.modifier'],
857
+ [/\.([\w\-]+)/, 'style.selector.class-name'],
858
+ [/\#([\w\-]+)/, 'style.selector.id'],
859
+ [/([\w\-]+)/, 'style.selector.element'],
860
+ [/(>+|~|\+)/, 'style.selector.operator'],
861
+ [/(\*+)/, 'style.selector.element.any'],
862
+ [/(\$)((?:@id)?)/, ['style.selector.reference.prefix', 'style.selector.reference']],
863
+ [/\&/, 'style.selector.context'],
864
+ [/\(/, 'delimiter.selector.parens.open', '@css_selector_parens'],
865
+ [/\[/, 'delimiter.selector.attr.open', '@css_selector_attr'],
866
+ [/\s+/, 'white'],
867
+ [/,/, 'style.selector.delimiter'],
868
+ [/#(\s.*)?\n?$/, 'comment'],
869
+ ],
870
+
871
+ css_props: [
872
+ denter(null, -1, 0),
873
+ [/(?=@cssPropertyKey2)/, '', '@css_property&-_styleprop-_stylepropkey'],
874
+ [/#(\s.*)?\n?$/, 'comment'],
875
+ [/(?=[\%\*\w\&\$\>\.\[\@\!]|\#[\w\-])/, '', '@>css_selector&rule-_sel'],
876
+ [/\s+/, 'white'],
877
+ ],
878
+
879
+ css_selector: [
880
+ denter({ switchTo: '@css_props' }, -1, { token: '@rematch', switchTo: '@css_props&_props' }),
881
+ [/(\}|\)|\])/, '@rematch', '@pop'],
882
+ [/(?=\s*@cssPropertyKey2)/, '', { switchTo: '@css_props&_props' }],
883
+ [/\s*#\s/, '@rematch', { switchTo: '@css_props&_props' }],
884
+ 'sel_',
885
+ ],
886
+
887
+ css_inline: [
888
+ [/\]/, 'style.close', '@pop'],
889
+ [/(?=@cssPropertyKey2)/, '', '@css_property&-_styleprop-_stylepropkey'],
890
+ [/(?=@cssPropertyPath\])/, '', '@css_property&-_styleprop-_stylepropkey'],
891
+ ],
892
+
893
+ css_selector_parens: [[/\)/, 'delimiter.selector.parens.close', '@pop'], 'sel_'],
894
+
895
+ css_selector_attr: [[/\]/, 'delimiter.selector.parens.close', '@pop'], 'sel_'],
896
+
897
+ css_property: [
898
+ denter(null, -1, -1),
899
+ [/\]/, '@rematch', '@pop'],
900
+ [/(\d+)(@id)/, ['style.property.unit.number', 'style.property.unit.name']],
901
+ [/((--|\$)@id)/, 'style.property.var'],
902
+ [/(-*@id)/, 'style.property.name'],
903
+ // [/(\@+)([\>\<\!]?[\w\-]+)/, ['style.property.modifier.start','style.property.modifier']]
904
+ [/@cssModifier/, 'style.property.modifier'],
905
+ [/(\@+|\.+)(@id\-?)/, ['style.property.modifier.start', 'style.property.modifier']],
906
+ [/\+(@id)/, 'style.property.scope'],
907
+ [
908
+ /\s*([\:]\s*)(?=@br|$)/,
909
+ 'style.property.operator',
910
+ { switchTo: '@>css_multiline_value&_stylevalue' },
911
+ ],
912
+ [/\s*([\:]\s*)/, 'style.property.operator', { switchTo: '@>css_value&_stylevalue' }],
913
+ ],
914
+
915
+ css_value_: [
916
+ [/(x?xs|sm\-?|md\-?|lg\-?|xx*l|\dxl|hg|x+h)\b/, 'style.value.size'],
917
+ [/\#[0-9a-fA-F]+/, 'style.value.color.hex'],
918
+ [/((--|\$)@id)/, 'style.value.var'],
919
+ [
920
+ /(@optid)(\@+|\.+)(@optid)/,
921
+ ['style.property.name', 'style.property.modifier.prefix', 'style.property.modifier'],
922
+ ],
923
+ 'op_',
924
+ 'string_',
925
+ 'number_',
926
+ 'comment_',
927
+ [/\s+/, 'style.value.white'],
928
+ [/\(/, 'delimiter.style.parens.open', '@css_expressions'],
929
+ [/\{/, 'delimiter.style.curly.open', '@css_interpolation&-_styleinterpolation'],
930
+ [/(@id)/, 'style.value'],
931
+ ],
932
+
933
+ css_value: [
934
+ denter({ switchTo: '@>css_multiline_value' }, -1, -1),
935
+ // [/@cssModifier/, '@rematch', '@pop']
936
+ [/@cssPropertyKey2/, '@rematch', '@pop'],
937
+ [/;/, 'style.delimiter', '@pop'],
938
+ [/(\}|\)|\])/, '@rematch', '@pop'],
939
+ 'css_value_',
940
+ ],
941
+
942
+ css_multiline_value: [denter(null, -1, 0), [/@cssPropertyKey2/, 'invalid'], 'css_value_'],
943
+
944
+ css_expressions: [
945
+ [/\)/, 'delimiter.style.parens.close', '@pop'],
946
+ [/\(/, 'delimiter.style.parens.open', '@css_expressions'],
947
+ 'css_value',
948
+ ],
949
+
950
+ css_interpolation: [[/\}/, 'delimiter.style.curly.close', '@pop'], 'expr_'],
951
+
952
+ expressions: [[/\,/, 'delimiter.comma']],
953
+
954
+ whitespace: [
955
+ [/[\r\n]+/, 'br'],
956
+ [/[ \t\r\n]+/, 'white'],
957
+ ],
958
+
959
+ space: [[/[ \t]+/, 'white']],
960
+
961
+ tag_: [
962
+ [/(\s*)(<)(?=\.)/, ['white', 'tag.open', '@_tag/flag']],
963
+ [/(\s*)(<)(?=\w|\{|\[|\%|\#|>)/, ['white', 'tag.open', '@_tag/name']],
964
+ ],
965
+ tag_content: [
966
+ denter(2, -1, 0),
967
+ [/\)|\}|\]/, '@rematch', '@pop'],
968
+ 'common_',
969
+ 'flow_',
970
+ 'var_',
971
+ 'for_',
972
+ 'css_',
973
+ 'expr_',
974
+ 'do_',
975
+ // dont support object keys directly here
976
+ ],
977
+
978
+ tag_children: [],
979
+
980
+ _tag: [
981
+ [/\/>/, 'tag.close', '@pop'],
982
+ [/>/, 'tag.close', { switchTo: '@>tag_content=&-_tagcontent' }],
983
+ // '@>css_selector&rule-_sel'
984
+ [/>/, 'tag.close', '@pop'],
985
+ [/(\-?\d+)/, 'tag.$S3'],
986
+ [/(\%)(@id)/, ['tag.mixin.prefix', 'tag.mixin']],
987
+ [/\#@id/, 'tag.id'],
988
+
989
+ [
990
+ /\./,
991
+ {
992
+ cases: {
993
+ '$/==event': { token: 'tag.event-modifier.start', switchTo: '@/event-modifier' },
994
+ '$/==event-modifier': { token: 'tag.event-modifier.start', switchTo: '@/event-modifier' },
995
+ '$/==modifier': { token: 'tag.modifier.start', switchTo: '@/modifier' },
996
+ '$/==rule': { token: 'tag.rule-modifier.start', switchTo: '@/rule-modifier' },
997
+ '$/==rule-modifier': { token: 'tag.rule-modifier.start', switchTo: '@/rule-modifier' },
998
+ '@default': { token: 'tag.flag.start', switchTo: '@/flag' },
999
+ },
1000
+ },
1001
+ ],
1002
+
1003
+ [
1004
+ /(\$@id)/,
1005
+ {
1006
+ cases: {
1007
+ '$/==name': 'tag.reference',
1008
+ '@default': 'tag.$/',
1009
+ },
1010
+ },
1011
+ ],
1012
+
1013
+ [/\{/, 'tag.$/.interpolation.open', '@_tag_interpolation'],
1014
+ [/\[/, 'style.open', '@css_inline'],
1015
+ [/(\s*\=\s*)/, 'operator.equals.tagop.tag-$/', '@_tag_value&-value'],
1016
+ [/\:/, { token: 'tag.event.start', switchTo: '@/event' }],
1017
+ 'tag_event_',
1018
+ // 'tag_attr_'
1019
+ [
1020
+ /(\-?@tagIdentifier)(\:@id)?/,
1021
+ {
1022
+ cases: {
1023
+ '$/==attr': { token: '@rematch', next: '@_tag_attr&-_tagattr' },
1024
+ '@default': { token: 'tag.$/' },
1025
+ },
1026
+ },
1027
+ ],
1028
+ // [/\@/,token: 'tag.event.start', switchTo: '@/event']
1029
+ // [/\{/,token: 'tag.$/.braces.open', next: '@_tag_interpolation/0']
1030
+ [/\(/, { token: 'tag.$/.parens.open', next: '@_tag_parens/0' }],
1031
+ [/\s+/, { token: 'tag.white', switchTo: '@/attr' }],
1032
+ 'comment_',
1033
+ ],
1034
+ tag_event_: [
1035
+ // add an additional slot for name etc?
1036
+ // [/(\@)(@optid)/,['tag.event.start','tag.event.name','@_tag_event&_tagevent/$2']]
1037
+ [/(?=\@@optid)/, '', '@_tag_event&-_listener'],
1038
+ ],
1039
+
1040
+ _tag_part: [[/\)|\}|\]|\>/, '@rematch', '@pop']],
1041
+ _tag_event: [
1042
+ '_tag_part',
1043
+ [/(\@)(@optid)/, ['tag.event.start', 'tag.event.name']],
1044
+ [/(\.)(@optid)/, ['tag.event-modifier.start', 'tag.event-modifier.name']],
1045
+ [/\(/, { token: 'tag.$/.parens.open', next: '@_tag_parens/0' }],
1046
+ [/(\s*\=\s*)/, 'operator.equals.tagop.tag-$/', '@_tag_value&handler'],
1047
+ [/\s+/, '@rematch', '@pop'],
1048
+ ],
1049
+
1050
+ tag_attr_: [
1051
+ // add an additional slot for name etc?
1052
+ // [/(\@)(@optid)/,['tag.event.start','tag.event.name','@_tag_event&_tagevent/$2']]
1053
+ [/(?=@tagIdentifier(\:@id)?)/, '', '@_tag_attr&-_attribute'],
1054
+ ],
1055
+
1056
+ _tag_attr: [
1057
+ '_tag_part',
1058
+ [/(\-?@tagIdentifier)(\:@id)?/, 'tag.attr'],
1059
+ [/\.(@optid)/, 'tag.event-modifierzz'],
1060
+ [/\(/, { token: 'tag.parens.open.$/', next: '@_tag_parens/0' }],
1061
+ [/(\s*\=\s*)/, 'operator.equals.tagop.tag-$/', '@_tag_value&-tagattrvalue'],
1062
+ [/\s+/, '@rematch', '@pop'],
1063
+ ],
1064
+
1065
+ _tag_interpolation: [[/\}/, 'tag.$/.interpolation.close', '@pop'], 'expr_', [/\)|\]/, 'invalid']],
1066
+
1067
+ _tag_parens: [[/\)/, 'tag.$/.parens.close', '@pop'], 'arglist_', [/\]|\}/, 'invalid']],
1068
+
1069
+ _tag_value: [[/(?=(\/?\>|\s))/, '', '@pop'], 'attr_expr_'],
1070
+
1071
+ regexp_: [
1072
+ [
1073
+ /\/(?!\ )(?=([^\\\/]|\\.)+\/)/,
1074
+ { token: 'regexp.slash.open', bracket: '@open', next: '@_regexp' },
1075
+ ],
1076
+ [/\/\/\//, { token: 'regexp.slash.open', bracket: '@open', next: '@_hereregexp' }],
1077
+ [/(\/)(\/)/, ['regexp.slash.open', 'regexp.slash.close']],
1078
+ ],
1079
+
1080
+ _regexp: [
1081
+ [
1082
+ /(\{)(\d+(?:,\d*)?)(\})/,
1083
+ ['regexp.escape.control', 'regexp.escape.control', 'regexp.escape.control'],
1084
+ ],
1085
+ [
1086
+ /(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,
1087
+ ['regexp.escape.control', { token: 'regexp.escape.control', next: '@_regexrange' }],
1088
+ ],
1089
+ [/(\()(\?:|\?=|\?!)/, ['regexp.escape.control', 'regexp.escape.control']],
1090
+ [/[()]/, 'regexp.escape.control'],
1091
+ [/@regexpctl/, 'regexp.escape.control'],
1092
+ [/[^\\\/]/, 'regexp'],
1093
+ [/@regexpesc/, 'regexp.escape'],
1094
+ [/\\:/, 'regexp.escape'],
1095
+ [/\\\./, 'regexp.invalid'],
1096
+ [/(\/)(\w+)/, [{ token: 'regexp.slash.close' }, { token: 'regexp.flags', next: '@pop' }]],
1097
+ ['/', { token: 'regexp.slash.close', next: '@pop' }],
1098
+ [/./, 'regexp.invalid'],
1099
+ ],
1100
+
1101
+ _regexrange: [
1102
+ [/-/, 'regexp.escape.control'],
1103
+ [/\^/, 'regexp.invalid'],
1104
+ [/@regexpesc/, 'regexp.escape'],
1105
+ [/[^\]]/, 'regexp'],
1106
+ [/\]/, 'regexp.escape.control', '@pop'],
1107
+ ],
1108
+
1109
+ _hereregexp: [
1110
+ [/[^\\\/#]/, 'regexp'],
1111
+ [/\\./, 'regexp'],
1112
+ [/#.*$/, 'comment'],
1113
+ ['///[igm]*', 'regexp', '@pop'],
1114
+ [/\//, 'regexp'],
1115
+ 'comment_',
1116
+ ],
1117
+ };
1118
+
1119
+ // states are structured:
1120
+ // 1 = the monarch state
1121
+ // 2 = the current indentation (I)
1122
+ // 3 = the current scope name/type (&)
1123
+ // 4 = various flags (F)
1124
+ // 5 = the monarch substate -- for identifiers++
1125
+ function rewriteΞstate(raw) {
1126
+ let state = ['$S1', '$S2', '$S3', '$S4', '$S5', '$S6'];
1127
+
1128
+ if (raw.match(/\@(pop|push|popall)/)) {
1129
+ return raw;
1130
+ }
1131
+
1132
+ if (raw[0] == '@') {
1133
+ raw = raw.slice(1);
1134
+ }
1135
+
1136
+ if (raw.indexOf('.') >= 0) {
1137
+ return raw;
1138
+ }
1139
+
1140
+ raw = rewriteΞtoken(raw);
1141
+ // if raw.match(/^[\w\$\.\-]+$/)
1142
+ // return raw
1143
+
1144
+ if (raw[0] == '>') {
1145
+ state[1] = '$S6\t';
1146
+ raw = raw.slice(1);
1147
+ }
1148
+
1149
+ for (
1150
+ let iφ2 = 0, itemsφ = iter$__(raw.split(/(?=[\/\&\=\*])/)), lenφ = itemsφ.length;
1151
+ iφ2 < lenφ;
1152
+ iφ2++
1153
+ ) {
1154
+ let part = itemsφ[iφ2];
1155
+ if (part[0] == '&') {
1156
+ if (part[1] == '-' || part[1] == '_') {
1157
+ state[2] = '$S3' + part.slice(1);
1158
+ } else {
1159
+ state[2] = '$S3-' + part.slice(1);
1160
+ }
1161
+ } else if (part[0] == '+') {
1162
+ state[3] = '$S4-' + part.slice(1);
1163
+ } else if (part[0] == '=') {
1164
+ state[3] = part.slice(1);
1165
+ } else if (part[0] == '/') {
1166
+ state[4] = part.slice(1);
1167
+ } else if (part[0] == '*') {
1168
+ state[5] = part.slice(1);
1169
+ } else {
1170
+ state[0] = part;
1171
+ }
1172
+ }
1173
+ return state.join('.');
1174
+ }
1175
+
1176
+ function rewriteΞtoken(raw) {
1177
+ let orig = raw;
1178
+ raw = raw.replace('$/', '$S5');
1179
+ raw = raw.replace('$F', '$S4');
1180
+ raw = raw.replace('$&', '$S3');
1181
+ raw = raw.replace('$I', '$S2');
1182
+ raw = raw.replace('$T', '$S2');
1183
+
1184
+ // if orig != raw
1185
+ // console.log 'rewriting token',orig,raw
1186
+ return raw;
1187
+ }
1188
+
1189
+ function rewriteΞactions(actions, add) {
1190
+ if (typeof actions == 'string') {
1191
+ // and parts.indexOf('$') >= 0
1192
+
1193
+ actions = { token: actions };
1194
+ }
1195
+
1196
+ if (actions && actions.token != undefined) {
1197
+ actions.token = rewriteΞtoken(actions.token);
1198
+
1199
+ if (typeof add == 'string') {
1200
+ actions.next = add;
1201
+ } else if (add) {
1202
+ Object.assign(actions, add);
1203
+ }
1204
+
1205
+ if (actions.next) {
1206
+ actions.next = rewriteΞstate(actions.next);
1207
+ }
1208
+ if (actions.switchTo) {
1209
+ actions.switchTo = rewriteΞstate(actions.switchTo);
1210
+ }
1211
+ } else if (actions && actions.cases) {
1212
+ // console.log 'found cases to transform!!'
1213
+ let cases = {};
1214
+ for (
1215
+ let oφ = actions.cases, iφ3 = 0, keysφ2 = Object.keys(oφ), lφ2 = keysφ2.length, k, v;
1216
+ iφ3 < lφ2;
1217
+ iφ3++
1218
+ ) {
1219
+ k = keysφ2[iφ3];
1220
+ v = oφ[k];
1221
+ let newkey = rewriteΞtoken(k);
1222
+ cases[newkey] = rewriteΞactions(v);
1223
+ }
1224
+ actions.cases = cases;
1225
+ } else if (actions instanceof Array) {
1226
+ let result = [];
1227
+ let curr = null;
1228
+ for (let i = 0, itemsφ2 = iter$__(actions), lenφ2 = itemsφ2.length; i < lenφ2; i++) {
1229
+ let action = itemsφ2[i];
1230
+ if (action[0] == '@' && i == actions.length - 1 && curr) {
1231
+ action = { next: action };
1232
+ }
1233
+
1234
+ if (typeof action == 'object') {
1235
+ if (action.token != undefined || action.cases) {
1236
+ result.push((curr = Object.assign({}, action)));
1237
+ } else {
1238
+ Object.assign(curr, action);
1239
+ }
1240
+ } else if (typeof action == 'string') {
1241
+ result.push((curr = { token: rewriteΞtoken(action) }));
1242
+ }
1243
+ }
1244
+ actions = result;
1245
+ }
1246
+
1247
+ if (actions instanceof Array) {
1248
+ for (let i = 0, itemsφ3 = iter$__(actions), lenφ3 = itemsφ3.length; i < lenφ3; i++) {
1249
+ let action = itemsφ3[i];
1250
+ if (action.token && action.token.indexOf('$$') >= 0) {
1251
+ action.token = action.token.replace('$$', '$' + (i + 1));
1252
+ }
1253
+ if (action.next) {
1254
+ action.next = rewriteΞstate(action.next);
1255
+ }
1256
+ if (action.switchTo) {
1257
+ action.switchTo = rewriteΞstate(action.switchTo);
1258
+ }
1259
+ }
1260
+ }
1261
+
1262
+ return actions;
1263
+ }
1264
+
1265
+ function rewriteΞrule(owner, key) {
1266
+ let rule;
1267
+
1268
+ return (rule = owner[key]);
1269
+ }
1270
+
1271
+ for (let iφ4 = 0, keysφ3 = Object.keys(states), lφ3 = keysφ3.length, key, rules; iφ4 < lφ3; iφ4++) {
1272
+ key = keysφ3[iφ4];
1273
+ rules = states[key];
1274
+ let i = 0;
1275
+ while (i < rules.length) {
1276
+ let rule = rules[i];
1277
+ if (rule[0] instanceof Array) {
1278
+ rules.splice(i, 1, ...rule);
1279
+ continue;
1280
+ } else if (typeof rule == 'string') {
1281
+ rules[i] = { include: rule };
1282
+ } else if (rule[1] instanceof Array) {
1283
+ rule[1] = rewriteΞactions(rule[1]);
1284
+ } else if (rule instanceof Array) {
1285
+ rule.splice(1, 2, rewriteΞactions(rule[1], rule[2]));
1286
+ }
1287
+ i++;
1288
+ }
1289
+ }
1290
+
1291
+ const grammar = {
1292
+ defaultToken: 'invalid',
1293
+ ignoreCase: false,
1294
+ tokenPostfix: '',
1295
+ brackets: [
1296
+ { open: '{', close: '}', token: 'bracket.curly' },
1297
+ { open: '[', close: ']', token: 'bracket.square' },
1298
+ { open: '(', close: ')', token: 'bracket.parenthesis' },
1299
+ ],
1300
+ keywords: [
1301
+ 'def',
1302
+ 'and',
1303
+ 'or',
1304
+ 'is',
1305
+ 'isnt',
1306
+ 'not',
1307
+ 'on',
1308
+ 'yes',
1309
+ '@',
1310
+ 'no',
1311
+ 'off',
1312
+ 'true',
1313
+ 'false',
1314
+ 'null',
1315
+ 'this',
1316
+ 'self',
1317
+ 'as',
1318
+ 'new',
1319
+ 'delete',
1320
+ 'typeof',
1321
+ 'in',
1322
+ 'instanceof',
1323
+ 'return',
1324
+ 'throw',
1325
+ 'break',
1326
+ 'continue',
1327
+ 'debugger',
1328
+ 'if',
1329
+ 'elif',
1330
+ 'else',
1331
+ 'switch',
1332
+ 'for',
1333
+ 'while',
1334
+ 'do',
1335
+ 'try',
1336
+ 'catch',
1337
+ 'finally',
1338
+ 'class',
1339
+ 'extends',
1340
+ 'super',
1341
+ 'undefined',
1342
+ 'then',
1343
+ 'unless',
1344
+ 'until',
1345
+ 'loop',
1346
+ 'of',
1347
+ 'by',
1348
+ 'when',
1349
+ 'tag',
1350
+ 'prop',
1351
+ 'attr',
1352
+ 'export',
1353
+ 'import',
1354
+ 'extend',
1355
+ 'var',
1356
+ 'let',
1357
+ 'const',
1358
+ 'require',
1359
+ 'isa',
1360
+ 'await',
1361
+ ],
1362
+ boolean: ['true', 'false', 'yes', 'no', 'undefined', 'null'],
1363
+ operators: [
1364
+ '=',
1365
+ '!',
1366
+ '~',
1367
+ '?',
1368
+ ':',
1369
+ '!!',
1370
+ '??',
1371
+ '&',
1372
+ '|',
1373
+ '^',
1374
+ '%',
1375
+ '<<',
1376
+ '!&',
1377
+ '>>',
1378
+ '>>>',
1379
+ '+=',
1380
+ '-=',
1381
+ '*=',
1382
+ '/=',
1383
+ '&=',
1384
+ '|=',
1385
+ '?=',
1386
+ '??=',
1387
+ '^=',
1388
+ '%=',
1389
+ '~=',
1390
+ '<<=',
1391
+ '>>=',
1392
+ '>>>=',
1393
+ '..',
1394
+ '...',
1395
+ '||=',
1396
+ `&&=`,
1397
+ '**=',
1398
+ '**',
1399
+ '|=?',
1400
+ '~=?',
1401
+ '^=?',
1402
+ '=?',
1403
+ 'and',
1404
+ 'or',
1405
+ ],
1406
+ assignments: [
1407
+ '=',
1408
+ '|=?',
1409
+ '~=?',
1410
+ '^=?',
1411
+ '=?',
1412
+ '^=',
1413
+ '%=',
1414
+ '~=',
1415
+ '<<=',
1416
+ '>>=',
1417
+ '>>>=',
1418
+ '||=',
1419
+ `&&=`,
1420
+ '?=',
1421
+ '??=',
1422
+ '+=',
1423
+ '-=',
1424
+ '*=',
1425
+ '/=',
1426
+ '&=',
1427
+ '|=',
1428
+ '**=',
1429
+ ],
1430
+ logic: ['>', '<', '==', '<=', '>=', '!=', '&&', '||', '===', '!=='],
1431
+ ranges: ['..', '...'],
1432
+ spread: ['...'],
1433
+ dot: ['.'],
1434
+ access: ['.', '..'],
1435
+ math: ['+', '-', '*', '/', '++', '--'],
1436
+
1437
+ unspaced_ops: regexify('... . .. + * ++ --'),
1438
+ comment: /#(\s.*)?(\n|$)/,
1439
+ // we include these common regular expressions
1440
+ symbols: /[=><!~?&%|+\-*\^,]+/,
1441
+ escapes: /\\(?:[abfnrtv\\"'$]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
1442
+ postaccess: /(:(?=\w))?/,
1443
+ ivar: /\@[a-zA-Z_]\w*/,
1444
+ B: /(?=\s|$)/,
1445
+ br: /[\r\n]+/,
1446
+ constant: /[A-Z][\w\$]*(?:\-+[\w\$]+)*/,
1447
+ // subIdentifer: /(?:\-*[\w\$]+)*/
1448
+ // identifier: /[a-z_]@subIdentifer/
1449
+ // anyIdentifier: /[A-Za-z_\$][\w\$]*(?:\-+[\w\$]+)*/
1450
+ // anyIdentifierOpt: /(?:@anyIdentifier)?/
1451
+ id: /[A-Za-z_\$][\w\$]*(?:\-+[\w\$]+)*\??/,
1452
+ plainid: /[A-Za-z_\$][\w\$]*(?:\-+[\w\$]+)*\??/,
1453
+ fieldid: /[\@\#]*@plainid/,
1454
+ propid: /[\@\#]*@plainid/,
1455
+ defid: /[\@\#]*@plainid/,
1456
+ decid: /\@@plainid/,
1457
+ symid: /\#+@plainid/,
1458
+ symref: /\#\#@plainid/,
1459
+ optid: /(?:@id)?/,
1460
+ // (?:\-+[\w\$]+)*\??
1461
+ esmIdentifier: /[A-Za-z_\$\@][\w\$]*(?:\-+[\w\$]+)*\??/,
1462
+ propertyPath: /(?:[A-Za-z_\$][A-Za-z\d\-\_\$]*\.)?(?:[A-Za-z_\$][A-Za-z\d\-\_\$]*)/,
1463
+ tagNameIdentifier: /(?:[\w\-]+\:)?\w+(?:\-\w+)*/,
1464
+ variable: /[\w\$]+(?:-[\w\$]*)*\??/,
1465
+ varKeyword: /var|let|const/,
1466
+ tagIdentifier: /-*[a-zA-Z][\w\-]*/,
1467
+ implicitCall: /(?!\s(?:and|or|is|isa)\s)(?=\s[\w\'\"\/\[\{])/, // not true for or etc
1468
+ cssModifier: /(?:\@+[\<\>\!]?[\w\-]+\+?|\.+@id\-?)/,
1469
+ cssPropertyPath: /[\@\.]*[\w\-\$]+(?:[\@\.]+[\w\-\$]+)*/,
1470
+ cssPropertyKey: /[\@\.]*[\w\-\$]+(?:[\@\.]+[\w\-\$]+)*(?:\s*\:)/,
1471
+
1472
+ cssVariable: /(?:--|\$)[\w\-\$]+/,
1473
+ cssPropertyName: /[\w\-\$]+/,
1474
+ // cssModifier: /\@[\w\-\$]+/
1475
+ cssPropertyKey2: /(?:@cssPropertyName(?:@cssModifier)*|@cssModifier+)(?:\s*\:)/,
1476
+ cssUpModifier: /\.\.[\w\-\$]+/,
1477
+ cssIsModifier: /\.[\w\-\$]+/,
1478
+
1479
+ regEx: /\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,
1480
+ regexpctl: /[(){}\[\]\$\^|\-*+?\.]/,
1481
+ regexpesc: /\\(?:[bBdDfnrstvwWn0\\\/]|@regexpctl|c[A-Z]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})/,
1482
+ // The main tokenizer for our languages
1483
+ tokenizer: states,
1484
+ };
1485
+
1486
+ export default {
1487
+ tokens: grammar,
1488
+
1489
+ config: {
1490
+ wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,
1491
+ comments: {
1492
+ blockComment: ['###', '###'],
1493
+ lineComment: '#',
1494
+ },
1495
+ brackets: [
1496
+ ['{', '}', 'delimiter.curly'],
1497
+ ['[', ']', 'delimiter.square'],
1498
+ ['(', ')', 'delimiter.parenthesis'],
1499
+ ['<', '>', 'delimiter.angle'],
1500
+ ],
1501
+ autoClosingPairs: [
1502
+ { open: '"', close: '"', notIn: ['string', 'comment'] },
1503
+ { open: "'", close: "'", notIn: ['string', 'comment'] },
1504
+ { open: '{', close: '}', notIn: ['comment'] },
1505
+ { open: '[', close: ']', notIn: ['string', 'comment'] },
1506
+ { open: '(', close: ')', notIn: ['string', 'comment'] },
1507
+ { open: '<', close: '>', notIn: ['string', 'comment', 'operators'] },
1508
+ ],
1509
+ onEnterRules: [
1510
+ {
1511
+ beforeText: /^\s*(?:def|get \w|set \w|class|for|if|elif|else|while|try|with|finally|except|async).*?$/,
1512
+ action: { indentAction: 1 },
1513
+ },
1514
+ {
1515
+ beforeText: /\s*(?:do)\s*(\|.*\|\s*)?$/,
1516
+ action: { indentAction: 1 },
1517
+ },
1518
+ ],
1519
+ },
1520
+ };