@the_dissidents/libemmm 0.0.0 → 0.0.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/dist/index.mjs CHANGED
@@ -1,32 +1,133 @@
1
- // src/debug.ts
2
- var debug = {
3
- level: 1 /* Info */,
4
- trace(arg0, ...args) {
5
- if (this.level > 0 /* Trace */) return;
6
- if (typeof arg0 == "function") arg0 = arg0();
7
- console.info("TRACE", arg0, ...args);
8
- },
9
- info(arg0, ...args) {
10
- if (this.level > 1 /* Info */) return;
11
- if (typeof arg0 == "function") arg0 = arg0();
12
- console.info(" INFO", arg0, ...args);
13
- },
14
- warning(arg0, ...args) {
15
- if (this.level > 2 /* Warning */) return;
16
- if (typeof arg0 == "function") arg0 = arg0();
17
- console.warn(" WARN", arg0, ...args);
18
- },
19
- error(arg0, ...args) {
20
- if (this.level > 3 /* Error */) return;
21
- if (typeof arg0 == "function") arg0 = arg0();
22
- console.error("ERROR", arg0, ...args);
23
- },
24
- never(_) {
25
- assert(false);
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/interface.ts
8
+ var MessageSeverity = /* @__PURE__ */ ((MessageSeverity2) => {
9
+ MessageSeverity2[MessageSeverity2["Info"] = 0] = "Info";
10
+ MessageSeverity2[MessageSeverity2["Warning"] = 1] = "Warning";
11
+ MessageSeverity2[MessageSeverity2["Error"] = 2] = "Error";
12
+ return MessageSeverity2;
13
+ })(MessageSeverity || {});
14
+ var NodeType = /* @__PURE__ */ ((NodeType2) => {
15
+ NodeType2[NodeType2["Root"] = 0] = "Root";
16
+ NodeType2[NodeType2["Paragraph"] = 1] = "Paragraph";
17
+ NodeType2[NodeType2["Preformatted"] = 2] = "Preformatted";
18
+ NodeType2[NodeType2["Text"] = 3] = "Text";
19
+ NodeType2[NodeType2["Escaped"] = 4] = "Escaped";
20
+ NodeType2[NodeType2["SystemModifier"] = 5] = "SystemModifier";
21
+ NodeType2[NodeType2["InlineModifier"] = 6] = "InlineModifier";
22
+ NodeType2[NodeType2["BlockModifier"] = 7] = "BlockModifier";
23
+ NodeType2[NodeType2["Interpolation"] = 8] = "Interpolation";
24
+ return NodeType2;
25
+ })(NodeType || {});
26
+ var ModifierFlags = /* @__PURE__ */ ((ModifierFlags2) => {
27
+ ModifierFlags2[ModifierFlags2["Normal"] = 0] = "Normal";
28
+ ModifierFlags2[ModifierFlags2["Preformatted"] = 1] = "Preformatted";
29
+ ModifierFlags2[ModifierFlags2["Marker"] = 2] = "Marker";
30
+ return ModifierFlags2;
31
+ })(ModifierFlags || {});
32
+ var ModifierBase = class {
33
+ constructor(name, flags = 0 /* Normal */, args) {
34
+ this.name = name;
35
+ this.flags = flags;
36
+ if (args) Object.assign(this, args);
37
+ }
38
+ delayContentExpansion = false;
39
+ alwaysTryExpand = false;
40
+ beforeParseContent;
41
+ afterParseContent;
42
+ beforeProcessExpansion;
43
+ afterProcessExpansion;
44
+ prepareExpand;
45
+ expand;
46
+ };
47
+ var BlockModifierDefinition = class extends ModifierBase {
48
+ };
49
+ var InlineModifierDefinition = class extends ModifierBase {
50
+ };
51
+ var SystemModifierDefinition = class extends ModifierBase {
52
+ };
53
+ var ArgumentInterpolatorDefinition = class {
54
+ constructor(name, postfix, args) {
55
+ this.name = name;
56
+ this.postfix = postfix;
57
+ if (args) Object.assign(this, args);
58
+ }
59
+ alwaysTryExpand = false;
60
+ expand;
61
+ };
62
+ var ParseContext = class {
63
+ constructor(config, variables = /* @__PURE__ */ new Map()) {
64
+ this.config = config;
65
+ this.variables = variables;
66
+ config.initializers.forEach((x) => x(this));
67
+ }
68
+ data = {};
69
+ init(key, obj) {
70
+ assert(!(key in this.data));
71
+ this.data[key] = obj;
72
+ }
73
+ set(key, obj) {
74
+ assert(key in this.data);
75
+ this.data[key] = obj;
76
+ }
77
+ get(key) {
78
+ assert(key in this.data);
79
+ return this.data[key];
80
+ }
81
+ };
82
+ var Document = class {
83
+ constructor(root, context, messages) {
84
+ this.root = root;
85
+ this.context = context;
86
+ this.messages = messages;
87
+ }
88
+ debugPrint(source) {
89
+ return debugDumpDocument(this, source);
90
+ }
91
+ };
92
+ var Configuration = class {
93
+ initializers = [];
94
+ blockModifiers;
95
+ inlineModifiers;
96
+ systemModifiers;
97
+ argumentInterpolators;
98
+ reparseDepthLimit = 10;
99
+ constructor(from) {
100
+ this.blockModifiers = new NameManager(from?.blockModifiers);
101
+ this.inlineModifiers = new NameManager(from?.inlineModifiers);
102
+ this.systemModifiers = new NameManager(from?.systemModifiers);
103
+ this.argumentInterpolators = new NameManager(from?.argumentInterpolators);
104
+ if (from) {
105
+ this.initializers = [...from.initializers];
106
+ this.reparseDepthLimit = from.reparseDepthLimit;
107
+ }
26
108
  }
27
109
  };
28
110
 
29
111
  // src/messages.ts
112
+ var messages_exports = {};
113
+ __export(messages_exports, {
114
+ ArgumentCountMismatchMessage: () => ArgumentCountMismatchMessage,
115
+ CannotExpandArgumentMessage: () => CannotExpandArgumentMessage,
116
+ CannotPopNotationMessage: () => CannotPopNotationMessage,
117
+ ContentShouldBeOnNewlineMessage: () => ContentShouldBeOnNewlineMessage,
118
+ ExpectedMessage: () => ExpectedMessage,
119
+ InlineDefinitonInvalidEntityMessage: () => InlineDefinitonInvalidEntityMessage,
120
+ InvalidArgumentMessage: () => InvalidArgumentMessage,
121
+ NameAlreadyDefinedMessage: () => NameAlreadyDefinedMessage,
122
+ NewBlockShouldBeOnNewlineMessage: () => NewBlockShouldBeOnNewlineMessage,
123
+ ReachedRecursionLimitMessage: () => ReachedRecursionLimitMessage,
124
+ ReferredMessage: () => ReferredMessage,
125
+ SlotUsedOutsideDefinitionMessage: () => SlotUsedOutsideDefinitionMessage,
126
+ UnclosedInlineModifierMessage: () => UnclosedInlineModifierMessage,
127
+ UndefinedVariableMessage: () => UndefinedVariableMessage,
128
+ UnknownModifierMessage: () => UnknownModifierMessage,
129
+ UnnecessaryNewlineMessage: () => UnnecessaryNewlineMessage
130
+ });
30
131
  var ReferredMessage = class {
31
132
  constructor(original, position, length) {
32
133
  this.original = original;
@@ -97,7 +198,7 @@ var ExpectedMessage = class {
97
198
  code = 1;
98
199
  severity = 2 /* Error */;
99
200
  get length() {
100
- return this.what.length;
201
+ return 0;
101
202
  }
102
203
  get info() {
103
204
  return `expected '${this.what}'`;
@@ -107,13 +208,16 @@ var ExpectedMessage = class {
107
208
  }
108
209
  };
109
210
  var UnknownModifierMessage = class {
110
- constructor(position, length) {
211
+ constructor(position, length, what) {
111
212
  this.position = position;
112
213
  this.length = length;
214
+ this.what = what;
113
215
  }
114
216
  code = 2;
115
217
  severity = 2 /* Error */;
116
- info = `unknown modifier; did you forget to escape it?`;
218
+ get info() {
219
+ return `unknown modifier '${this.what}'; did you forget to escape it?`;
220
+ }
117
221
  get fixes() {
118
222
  let [pos, len] = [this.position, this.length];
119
223
  return [{
@@ -140,29 +244,37 @@ var UnclosedInlineModifierMessage = class {
140
244
  return `unclosed inline modifier ${this.what}'`;
141
245
  }
142
246
  };
143
- var ArgumentsTooFewMessage = class {
144
- constructor(position, length, expected) {
247
+ var ArgumentCountMismatchMessage = class {
248
+ constructor(position, length, min, max) {
145
249
  this.position = position;
146
250
  this.length = length;
147
- this.expected = expected;
251
+ if (min !== void 0) {
252
+ if (max == min) this.msg = `: ${min} expected`;
253
+ else if (max !== void 0) this.msg = `: ${min} to ${max} expected`;
254
+ else this.msg = `: at least ${min} expected`;
255
+ } else {
256
+ if (max !== void 0) this.msg = `: at most ${max} expected`;
257
+ }
148
258
  }
259
+ msg = "";
149
260
  code = 4;
150
261
  severity = 2 /* Error */;
151
262
  fixes = [];
152
263
  get info() {
153
- return `too few argument(s)` + (this.expected === void 0 ? "" : `, ${this.expected} expected`);
264
+ return `argument count mismatch` + this.msg;
154
265
  }
155
266
  };
156
- var ArgumentsTooManyMessage = class extends RemoveThingMessage {
157
- constructor(pos, len, expected) {
158
- super(
159
- 5,
160
- 1 /* Warning */,
161
- pos,
162
- len,
163
- "too many arguments" + (expected === void 0 ? "" : `, ${expected} expected`),
164
- "remove them"
165
- );
267
+ var CannotExpandArgumentMessage = class {
268
+ constructor(position, length, what) {
269
+ this.position = position;
270
+ this.length = length;
271
+ this.what = what;
272
+ }
273
+ code = 5;
274
+ severity = 2 /* Error */;
275
+ fixes = [];
276
+ get info() {
277
+ return `failed to expand argument` + (this.what === void 0 ? "" : `: ${this.what}`);
166
278
  }
167
279
  };
168
280
  var InvalidArgumentMessage = class {
@@ -213,7 +325,19 @@ var SlotUsedOutsideDefinitionMessage = class {
213
325
  severity = 2 /* Error */;
214
326
  fixes = [];
215
327
  get info() {
216
- return `[.slot] used outside a block definition`;
328
+ return `slot used outside a definition`;
329
+ }
330
+ };
331
+ var CannotPopNotationMessage = class {
332
+ constructor(position, length) {
333
+ this.position = position;
334
+ this.length = length;
335
+ }
336
+ code = 10;
337
+ severity = 2 /* Error */;
338
+ fixes = [];
339
+ get info() {
340
+ return `cannot pop notation`;
217
341
  }
218
342
  };
219
343
  var UnnecessaryNewlineMessage = class extends RemoveThingMessage {
@@ -282,12 +406,23 @@ var UndefinedVariableMessage = class {
282
406
  };
283
407
 
284
408
  // src/util.ts
285
- var NameManager = class {
409
+ var NameManager = class _NameManager {
286
410
  array = [];
287
- data;
411
+ data = /* @__PURE__ */ new Map();
288
412
  constructor(from) {
289
- this.array = [...from?.array ?? []];
290
- this.data = new Map(from?.data);
413
+ if (from === void 0) return;
414
+ if (from instanceof _NameManager) {
415
+ this.array = [...from.array];
416
+ this.data = new Map(from.data);
417
+ } else {
418
+ assert(Array.isArray(from));
419
+ this.array = from.map((x) => ({ k: x.name, v: x }));
420
+ this.array.sort((a, b) => b.k.length - a.k.length);
421
+ this.data = new Map(from.map((x) => [x.name, x]));
422
+ }
423
+ }
424
+ toArray() {
425
+ return this.array.map(({ v }) => v);
291
426
  }
292
427
  get(name) {
293
428
  return this.data.get(name);
@@ -326,6 +461,36 @@ function assert(x) {
326
461
  function has(v, f) {
327
462
  return (v & f) === f;
328
463
  }
464
+ function linePositions(src) {
465
+ let result = [0];
466
+ [...src].forEach((x, i) => {
467
+ if (x == "\n") result.push(i + 1);
468
+ });
469
+ result.push(Infinity);
470
+ return result;
471
+ }
472
+ var cloneArgument = (arg) => ({
473
+ start: arg.start,
474
+ end: arg.end,
475
+ content: arg.content.map((ent) => {
476
+ switch (ent.type) {
477
+ case 3 /* Text */:
478
+ case 4 /* Escaped */:
479
+ return structuredClone(ent);
480
+ case 8 /* Interpolation */:
481
+ return {
482
+ type: ent.type,
483
+ start: ent.start,
484
+ end: ent.end,
485
+ definition: ent.definition,
486
+ argument: cloneArgument(ent.argument),
487
+ expansion: ent.expansion
488
+ };
489
+ default:
490
+ return debug.never(ent);
491
+ }
492
+ })
493
+ });
329
494
  function cloneNode(node, referring) {
330
495
  switch (node.type) {
331
496
  case 7 /* BlockModifier */:
@@ -338,7 +503,7 @@ function cloneNode(node, referring) {
338
503
  mod: node.mod,
339
504
  state: void 0,
340
505
  head: structuredClone(node.head),
341
- arguments: structuredClone(node.arguments),
506
+ arguments: node.arguments.map(cloneArgument),
342
507
  content: node.content.map((x) => cloneNode(x, referring)),
343
508
  expansion: node.expansion ? cloneNodes(node.expansion) : void 0
344
509
  };
@@ -368,7 +533,7 @@ function debugPrintArgEntity(node) {
368
533
  case 4 /* Escaped */:
369
534
  return `<Escaped:${node.content}>`;
370
535
  case 8 /* Interpolation */:
371
- return `<Interp:${node.definition.name}-${node.definition.postfix}:${debugPrintArgument(node.arg)}>`;
536
+ return `<Interp:${node.definition.name}-${node.definition.postfix}:${debugPrintArgument(node.argument)}${node.expansion ? `=${node.expansion}` : ""}>`;
372
537
  default:
373
538
  return debug.never(node);
374
539
  }
@@ -377,7 +542,7 @@ function debugPrintArgument(arg) {
377
542
  return arg.content.map(debugPrintArgEntity).join("");
378
543
  }
379
544
  function debugPrintNode(node, prefix = "") {
380
- let result = `<${node.type}@${node.start}`;
545
+ let result = `<${NodeType[node.type]}@${node.start}`;
381
546
  switch (node.type) {
382
547
  case 0 /* Root */:
383
548
  case 1 /* Paragraph */:
@@ -385,14 +550,14 @@ function debugPrintNode(node, prefix = "") {
385
550
  if (content.length > 0)
386
551
  result += `>
387
552
  ${content}
388
- ${prefix}</${node.type}@${node.end}>`;
553
+ ${prefix}</${NodeType[node.type]}@${node.end}>`;
389
554
  else result += `-${node.end} />`;
390
555
  break;
391
556
  case 4 /* Escaped */:
392
557
  case 2 /* Preformatted */:
393
558
  result += `>
394
559
  ${prefix} ${node.content}
395
- ${prefix}</${node.type}@${node.end}>`;
560
+ ${prefix}</${NodeType[node.type]}@${node.end}>`;
396
561
  break;
397
562
  case 6 /* InlineModifier */:
398
563
  case 7 /* BlockModifier */:
@@ -402,7 +567,7 @@ ${prefix} (${i})@${x.start}-${x.end}=${debugPrintArgument(x)}`).join("");
402
567
  if (node.content.length > 0) {
403
568
  result += ` id=${node.mod.name}${args}>
404
569
  ` + debugPrintNodes(node.content, prefix) + `
405
- ${prefix}</${node.type}@${node.end}>`;
570
+ ${prefix}</${NodeType[node.type]}@${node.end}>`;
406
571
  } else result += `-${node.end} id=${node.mod.name}${args} />`;
407
572
  if (node.expansion) {
408
573
  const content2 = debugPrintNodes(node.expansion, prefix);
@@ -428,118 +593,67 @@ function debugPrintNodes(content, prefix = "") {
428
593
  if (dumps.length == 0) return "";
429
594
  return dumps.map((x) => `${prefix} ${x}`).join("\n");
430
595
  }
431
-
432
- // src/interface.ts
433
- var MessageSeverity = /* @__PURE__ */ ((MessageSeverity2) => {
434
- MessageSeverity2[MessageSeverity2["Info"] = 0] = "Info";
435
- MessageSeverity2[MessageSeverity2["Warning"] = 1] = "Warning";
436
- MessageSeverity2[MessageSeverity2["Error"] = 2] = "Error";
437
- return MessageSeverity2;
438
- })(MessageSeverity || {});
439
- var NodeType = /* @__PURE__ */ ((NodeType2) => {
440
- NodeType2[NodeType2["Root"] = 0] = "Root";
441
- NodeType2[NodeType2["Paragraph"] = 1] = "Paragraph";
442
- NodeType2[NodeType2["Preformatted"] = 2] = "Preformatted";
443
- NodeType2[NodeType2["Text"] = 3] = "Text";
444
- NodeType2[NodeType2["Escaped"] = 4] = "Escaped";
445
- NodeType2[NodeType2["SystemModifier"] = 5] = "SystemModifier";
446
- NodeType2[NodeType2["InlineModifier"] = 6] = "InlineModifier";
447
- NodeType2[NodeType2["BlockModifier"] = 7] = "BlockModifier";
448
- NodeType2[NodeType2["Interpolation"] = 8] = "Interpolation";
449
- return NodeType2;
450
- })(NodeType || {});
451
- var ModifierFlags = /* @__PURE__ */ ((ModifierFlags2) => {
452
- ModifierFlags2[ModifierFlags2["Normal"] = 0] = "Normal";
453
- ModifierFlags2[ModifierFlags2["Preformatted"] = 1] = "Preformatted";
454
- ModifierFlags2[ModifierFlags2["Marker"] = 2] = "Marker";
455
- return ModifierFlags2;
456
- })(ModifierFlags || {});
457
- var ModifierBase = class {
458
- constructor(name, flags = 0 /* Normal */, args) {
459
- this.name = name;
460
- this.flags = flags;
461
- if (args) Object.assign(this, args);
462
- }
463
- delayContentExpansion = false;
464
- alwaysTryExpand = false;
465
- beforeParseContent;
466
- afterParseContent;
467
- beforeProcessExpansion;
468
- afterProcessExpansion;
469
- prepareExpand;
470
- expand;
471
- };
472
- var BlockModifierDefinition = class extends ModifierBase {
473
- };
474
- var InlineModifierDefinition = class extends ModifierBase {
475
- };
476
- var SystemModifierDefinition = class extends ModifierBase {
477
- };
478
- var ArgumentInterpolatorDefinition = class {
479
- constructor(name, postfix, expand) {
480
- this.name = name;
481
- this.postfix = postfix;
482
- this.expand = expand;
483
- }
484
- };
485
- var ParseContext = class {
486
- constructor(config, variables = /* @__PURE__ */ new Map()) {
487
- this.config = config;
488
- this.variables = variables;
489
- config.initializers.forEach((x) => x(this));
490
- }
491
- data = {};
492
- init(key, obj) {
493
- assert(!(key in this.data));
494
- this.data[key] = obj;
495
- }
496
- set(key, obj) {
497
- assert(key in this.data);
498
- this.data[key] = obj;
499
- }
500
- get(key) {
501
- assert(key in this.data);
502
- return this.data[key];
503
- }
504
- #evalEntity(e) {
505
- switch (e.type) {
506
- case 3 /* Text */:
507
- case 4 /* Escaped */:
508
- return e.content;
509
- case 8 /* Interpolation */:
510
- const inner = this.evaluateArgument(e.arg);
511
- return e.definition.expand(inner, this);
512
- default:
513
- assert(false);
596
+ function debugDumpDocument(doc, source) {
597
+ const lines = linePositions(source);
598
+ function pos2lc(pos) {
599
+ let line = -1, linepos = 0;
600
+ for (let i = 1; i < lines.length; i++) {
601
+ if (lines[i] > pos) {
602
+ line = i;
603
+ linepos = lines[i - 1];
604
+ break;
605
+ }
514
606
  }
515
- }
516
- evaluateArgument(arg) {
517
- return arg.content.map((x) => this.#evalEntity(x)).join("");
518
- }
519
- };
520
- var Document2 = class {
521
- constructor(root, context, messages) {
522
- this.root = root;
523
- this.context = context;
524
- this.messages = messages;
525
- }
526
- };
527
- var Configuration = class {
528
- initializers = [];
529
- blockModifiers;
530
- inlineModifiers;
531
- systemModifiers;
532
- argumentInterpolators;
533
- reparseDepthLimit = 10;
534
- constructor(from) {
535
- this.blockModifiers = new NameManager(from?.blockModifiers);
536
- this.inlineModifiers = new NameManager(from?.inlineModifiers);
537
- this.systemModifiers = new NameManager(from?.systemModifiers);
538
- this.argumentInterpolators = new NameManager(from?.argumentInterpolators);
539
- if (from) {
540
- this.initializers = [...from.initializers];
541
- this.reparseDepthLimit = from.reparseDepthLimit;
607
+ return `l${line}c${pos - linepos + 1}`;
608
+ }
609
+ function dumpMsg(m) {
610
+ let result = `at ${pos2lc(m.position)}, len ${m.length}: ${MessageSeverity[m.severity]}[${m.code}]: ${m.info}`;
611
+ while (m instanceof ReferredMessage) {
612
+ m = m.original;
613
+ result += `
614
+ ---> original at: ${pos2lc(m.position)}, len ${m.length}`;
542
615
  }
616
+ return result;
617
+ }
618
+ let root = debugPrintNode(doc.root);
619
+ let msgs = doc.messages.map(dumpMsg).join("\n");
620
+ if (msgs.length > 0) msgs += "\n";
621
+ return `${msgs}${root}`;
622
+ }
623
+
624
+ // src/debug.ts
625
+ var DebugLevel = /* @__PURE__ */ ((DebugLevel3) => {
626
+ DebugLevel3[DebugLevel3["Trace"] = 0] = "Trace";
627
+ DebugLevel3[DebugLevel3["Info"] = 1] = "Info";
628
+ DebugLevel3[DebugLevel3["Warning"] = 2] = "Warning";
629
+ DebugLevel3[DebugLevel3["Error"] = 3] = "Error";
630
+ DebugLevel3[DebugLevel3["None"] = 4] = "None";
631
+ return DebugLevel3;
632
+ })(DebugLevel || {});
633
+ var debug = {
634
+ level: 1 /* Info */,
635
+ trace(arg0, ...args) {
636
+ if (this.level > 0 /* Trace */) return;
637
+ if (typeof arg0 == "function") arg0 = arg0();
638
+ console.info("TRACE", arg0, ...args);
639
+ },
640
+ info(arg0, ...args) {
641
+ if (this.level > 1 /* Info */) return;
642
+ if (typeof arg0 == "function") arg0 = arg0();
643
+ console.info(" INFO", arg0, ...args);
644
+ },
645
+ warning(arg0, ...args) {
646
+ if (this.level > 2 /* Warning */) return;
647
+ if (typeof arg0 == "function") arg0 = arg0();
648
+ console.warn(" WARN", arg0, ...args);
649
+ },
650
+ error(arg0, ...args) {
651
+ if (this.level > 3 /* Error */) return;
652
+ if (typeof arg0 == "function") arg0 = arg0();
653
+ console.error("ERROR", arg0, ...args);
654
+ },
655
+ never(_) {
656
+ assert(false);
543
657
  }
544
658
  };
545
659
 
@@ -719,22 +833,61 @@ var Parser = class {
719
833
  }
720
834
  return ok;
721
835
  }
836
+ #expandArgument(arg) {
837
+ if (arg.expansion !== void 0)
838
+ return arg.expansion;
839
+ let result = "";
840
+ const immediate = this.delayDepth == 0;
841
+ for (const e of arg.content) {
842
+ switch (e.type) {
843
+ case 3 /* Text */:
844
+ case 4 /* Escaped */:
845
+ result += e.content;
846
+ break;
847
+ case 8 /* Interpolation */:
848
+ if (e.expansion === void 0) {
849
+ const inner = this.#expandArgument(e.argument);
850
+ if (inner === void 0 || e.definition.expand === void 0 || !immediate && !e.definition.alwaysTryExpand)
851
+ return void 0;
852
+ e.expansion = e.definition.expand(inner, this.cxt, immediate);
853
+ if (e.expansion === void 0)
854
+ return void 0;
855
+ }
856
+ result += e.expansion;
857
+ break;
858
+ default:
859
+ debug.never(e);
860
+ }
861
+ }
862
+ arg.expansion = result;
863
+ return result;
864
+ }
865
+ #expandArguments(node) {
866
+ for (const arg of node.arguments) {
867
+ this.#expandArgument(arg);
868
+ }
869
+ }
722
870
  #expand(node, depth = 0) {
723
871
  if (node.expansion !== void 0) {
724
872
  debug.trace("already expanded, skipping:", node.mod.name);
725
873
  return true;
726
874
  }
875
+ if (depth > 0) {
876
+ this.#expandArguments(node);
877
+ }
727
878
  if (this.delayDepth > 0 && !node.mod.alwaysTryExpand) {
728
879
  debug.trace("delaying expansion of", node.mod.name);
729
880
  return true;
730
881
  }
731
882
  const immediate = this.delayDepth == 0;
732
- if (node.content.length > 0 && depth > 0) {
883
+ if (depth > 0) {
733
884
  if (node.mod.beforeParseContent)
734
885
  this.emit.message(...node.mod.beforeParseContent(node, this.cxt, immediate));
735
- if (node.mod.delayContentExpansion) this.delayDepth++;
736
- this.#reparse(node.content, depth);
737
- if (node.mod.delayContentExpansion) this.delayDepth--;
886
+ if (node.content.length > 0) {
887
+ if (node.mod.delayContentExpansion) this.delayDepth++;
888
+ this.#reparse(node.content, depth);
889
+ if (node.mod.delayContentExpansion) this.delayDepth--;
890
+ }
738
891
  if (node.mod.afterParseContent)
739
892
  this.emit.message(...node.mod.afterParseContent(node, this.cxt, immediate));
740
893
  }
@@ -773,7 +926,7 @@ var Parser = class {
773
926
  }
774
927
  parse() {
775
928
  this.DOCUMENT();
776
- return new Document2(this.emit.root, this.cxt, this.emit.messages);
929
+ return new Document(this.emit.root, this.cxt, this.emit.messages);
777
930
  }
778
931
  WHITESPACES_OR_NEWLINES() {
779
932
  while (this.scanner.acceptWhitespaceChar() !== null || this.scanner.accept("\n")) {
@@ -831,16 +984,19 @@ var Parser = class {
831
984
  const result = this.#defs(type).find((x) => this.scanner.accept(x.name));
832
985
  const mod = result ?? UnknownModifier[type];
833
986
  if (result === void 0) {
834
- const args2 = this.scanner.acceptUntil(MODIFIER_CLOSE_SIGN);
835
- if (args2 === null) this.emit.message(
836
- new ExpectedMessage(this.scanner.position(), MODIFIER_CLOSE_SIGN)
837
- );
987
+ let name = "";
988
+ while (!this.scanner.isEOF() && !this.scanner.acceptWhitespaceChar() && !this.scanner.peek(MODIFIER_CLOSE_SIGN) && !this.scanner.peek(MODIFIER_END_SIGN)) {
989
+ if (this.scanner.accept("\\")) {
990
+ if (this.scanner.isEOF()) break;
991
+ }
992
+ name += this.scanner.acceptChar();
993
+ }
838
994
  this.emit.message(
839
- new UnknownModifierMessage(posStart, this.scanner.position() - posStart)
995
+ new UnknownModifierMessage(posStart, this.scanner.position() - posStart, name)
840
996
  );
841
997
  }
842
998
  const args = this.ARGUMENTS();
843
- debug.trace(`PARSE ${type} modifier:`, mod.name);
999
+ debug.trace(`PARSE ${NodeType[type]}:`, mod.name);
844
1000
  const endsign = this.scanner.accept(MODIFIER_END_SIGN);
845
1001
  const flagMarker = has(mod.flags, 2 /* Marker */);
846
1002
  const isMarker = flagMarker || endsign;
@@ -849,16 +1005,18 @@ var Parser = class {
849
1005
  this.scanner.position(),
850
1006
  MODIFIER_CLOSE_SIGN
851
1007
  ));
1008
+ const headEnd = this.scanner.position();
852
1009
  const node = {
853
1010
  type,
854
1011
  mod,
855
- head: { start: posStart, end: this.scanner.position() },
1012
+ head: { start: posStart, end: headEnd },
856
1013
  arguments: args,
857
1014
  start: posStart,
858
- end: -1,
1015
+ end: headEnd,
859
1016
  content: [],
860
1017
  expansion: void 0
861
1018
  };
1019
+ this.#expandArguments(node);
862
1020
  const immediate = this.delayDepth == 0;
863
1021
  if (node.mod.beforeParseContent)
864
1022
  this.emit.message(...node.mod.beforeParseContent(node, this.cxt, immediate));
@@ -892,6 +1050,8 @@ var Parser = class {
892
1050
  }
893
1051
  this.emit.endBlock();
894
1052
  }
1053
+ const last = node.content.at(-1);
1054
+ node.actualEnd = last?.actualEnd ?? last?.end;
895
1055
  if (node.mod.delayContentExpansion) this.delayDepth--;
896
1056
  if (node.mod.afterParseContent)
897
1057
  this.emit.message(...node.mod.afterParseContent(node, this.cxt, immediate));
@@ -974,6 +1134,8 @@ var Parser = class {
974
1134
  while (!this.scanner.isEOF() && this.INLINE_ENTITY()) {
975
1135
  }
976
1136
  this.emit.endInline();
1137
+ const last = node.content.at(-1);
1138
+ node.actualEnd = last?.actualEnd ?? last?.end;
977
1139
  debug.trace("PARSE para end");
978
1140
  }
979
1141
  // returns false if breaking out of paragraph
@@ -1043,10 +1205,8 @@ var Parser = class {
1043
1205
  }
1044
1206
  };
1045
1207
  while (true) {
1046
- if (end !== void 0 && this.scanner.accept(end)) {
1047
- debug.trace("found end", end);
1208
+ if (end !== void 0 && this.scanner.accept(end))
1048
1209
  break;
1049
- }
1050
1210
  if (this.scanner.accept(":")) {
1051
1211
  ok = end === void 0;
1052
1212
  break;
@@ -1065,11 +1225,12 @@ var Parser = class {
1065
1225
  content.push({
1066
1226
  type: 4 /* Escaped */,
1067
1227
  content: this.scanner.acceptChar(),
1068
- start: posEnd - 2,
1069
- end: posEnd
1228
+ start: posEnd - 1,
1229
+ end: posEnd + 1
1070
1230
  });
1071
1231
  continue;
1072
1232
  }
1233
+ const beforeInterp = this.scanner.position();
1073
1234
  const result = this.cxt.config.argumentInterpolators.find(
1074
1235
  (x) => this.scanner.accept(x.name)
1075
1236
  );
@@ -1079,8 +1240,8 @@ var Parser = class {
1079
1240
  content.push({
1080
1241
  type: 8 /* Interpolation */,
1081
1242
  definition: result,
1082
- arg: inner,
1083
- start: posEnd - 2,
1243
+ argument: inner,
1244
+ start: beforeInterp,
1084
1245
  end: posEnd
1085
1246
  });
1086
1247
  if (!ok2) {
@@ -1120,6 +1281,21 @@ function parse(scanner, config) {
1120
1281
  return new Parser(scanner, config).parse();
1121
1282
  }
1122
1283
 
1284
+ // src/modifier-helper.ts
1285
+ function checkArgumentLength(node, min, max = min) {
1286
+ if (min !== void 0 && node.arguments.length < min || max !== void 0 && node.arguments.length > max) {
1287
+ return [new ArgumentCountMismatchMessage(node.head.start, node.head.end - node.head.start, min, max)];
1288
+ }
1289
+ return null;
1290
+ }
1291
+ function checkArguments(node, min, max = min) {
1292
+ const arg = node.arguments.find((x) => x.expansion === void 0);
1293
+ if (arg !== void 0) {
1294
+ return [new CannotExpandArgumentMessage(arg.start, arg.end - arg.start)];
1295
+ }
1296
+ return checkArgumentLength(node, min, max);
1297
+ }
1298
+
1123
1299
  // src/builtin/internal.ts
1124
1300
  var builtins = Symbol();
1125
1301
  function initParseContext(cxt) {
@@ -1127,18 +1303,10 @@ function initParseContext(cxt) {
1127
1303
  blockSlotDelayedStack: [],
1128
1304
  inlineSlotDelayedStack: [],
1129
1305
  blockSlotData: [],
1130
- inlineSlotData: []
1306
+ inlineSlotData: [],
1307
+ notationStack: []
1131
1308
  });
1132
1309
  }
1133
- function checkArgumentLength(node, n) {
1134
- if (node.arguments.length < n)
1135
- return new ArgumentsTooFewMessage(node.head.end - 1, 0, n);
1136
- if (node.arguments.length > n) {
1137
- const start = node.arguments[n].start - 1;
1138
- return new ArgumentsTooManyMessage(start, node.head.end - start, n);
1139
- }
1140
- return null;
1141
- }
1142
1310
  function customModifier(type, name, argNames, slotName, content) {
1143
1311
  debug.info(`registered custom ${type} modifier:`, name);
1144
1312
  debug.info("args:", argNames, `with ${slotName == "" ? "no slot name" : "slot name: " + slotName}`);
@@ -1147,9 +1315,12 @@ function customModifier(type, name, argNames, slotName, content) {
1147
1315
  const isInline = type == 6 /* InlineModifier */;
1148
1316
  mod.delayContentExpansion = true;
1149
1317
  mod.prepareExpand = (node, cxt) => {
1150
- const check = checkArgumentLength(node, argNames.length);
1151
- if (check) return [check];
1152
- node.state = { ok: true };
1318
+ let check = checkArguments(node, argNames.length);
1319
+ if (check) return check;
1320
+ node.state = {
1321
+ ok: true,
1322
+ args: new Map(node.arguments.map((x, i) => [argNames[i], x.expansion]))
1323
+ };
1153
1324
  return [];
1154
1325
  };
1155
1326
  mod.expand = (node, cxt) => {
@@ -1160,11 +1331,12 @@ function customModifier(type, name, argNames, slotName, content) {
1160
1331
  mod.beforeProcessExpansion = (node, cxt) => {
1161
1332
  if (!node.state?.ok) return [];
1162
1333
  const store = cxt.get(builtins);
1163
- const args = new Map(
1164
- node.arguments.map((x, i) => [argNames[i], cxt.evaluateArgument(x)])
1165
- );
1166
1334
  const data = isInline ? store.inlineSlotData : store.blockSlotData;
1167
- data.push([slotName, { mod, args, slotContent: node.content }]);
1335
+ data.push([slotName, {
1336
+ mod,
1337
+ args: node.state.args,
1338
+ slotContent: node.content
1339
+ }]);
1168
1340
  debug.trace(
1169
1341
  `pushed ${type} slot data for`,
1170
1342
  name,
@@ -1194,28 +1366,31 @@ var DefineBlockMod = new SystemModifierDefinition("define-block", 0 /* Normal */
1194
1366
  delayContentExpansion: true,
1195
1367
  alwaysTryExpand: true,
1196
1368
  beforeParseContent(node, cxt) {
1197
- if (node.arguments.length == 0)
1198
- return [new ArgumentsTooFewMessage(node.head.end - 1, 0)];
1369
+ const check = checkArgumentLength(node, 1, Infinity);
1370
+ if (check) return check;
1199
1371
  const msgs = [];
1200
1372
  const name = node.arguments[0];
1201
- const nameValue = cxt.evaluateArgument(name);
1202
- if (cxt.config.blockModifiers.has(nameValue))
1203
- msgs.push(new NameAlreadyDefinedMessage(
1204
- node.start,
1205
- name.end - name.start,
1206
- nameValue
1207
- ));
1373
+ const nameValue = name.expansion;
1208
1374
  let slotName = "";
1209
1375
  if (node.arguments.length > 1) {
1210
- const last = cxt.evaluateArgument(node.arguments.at(-1));
1211
- slotName = /^\(.+\)$/.test(last) ? last.substring(1, last.length - 1) : "";
1376
+ const last = node.arguments.at(-1);
1377
+ if (last.expansion)
1378
+ slotName = /^\(.+\)$/.test(last.expansion) ? last.expansion.substring(1, last.expansion.length - 1) : "";
1379
+ else msgs.push(
1380
+ new InvalidArgumentMessage(last.start, last.end - last.start)
1381
+ );
1212
1382
  }
1213
- const args = node.arguments.slice(1, slotName !== "" ? node.arguments.length - 1 : void 0).map((x) => cxt.evaluateArgument(x));
1214
- node.state = { name: nameValue, slotName, args };
1383
+ const args = node.arguments.slice(1, slotName !== "" ? node.arguments.length - 1 : void 0).map((x) => {
1384
+ if (!x.expansion) msgs.push(
1385
+ new InvalidArgumentMessage(x.start, x.end - x.start)
1386
+ );
1387
+ return x.expansion ?? "";
1388
+ });
1389
+ node.state = { name: nameValue, slotName, args, msgs };
1215
1390
  const store = cxt.get(builtins);
1216
1391
  store.blockSlotDelayedStack.push(node.state.slotName);
1217
1392
  debug.trace("entering block definition:", node.state.name);
1218
- return msgs;
1393
+ return [];
1219
1394
  },
1220
1395
  afterParseContent(node, cxt) {
1221
1396
  if (!node.state) return [];
@@ -1224,9 +1399,22 @@ var DefineBlockMod = new SystemModifierDefinition("define-block", 0 /* Normal */
1224
1399
  debug.trace("leaving block definition", node.state.name);
1225
1400
  return [];
1226
1401
  },
1402
+ prepareExpand(node, cxt, immediate) {
1403
+ if (!immediate || !node.state) return [];
1404
+ const arg = node.arguments[0];
1405
+ if (!node.state.name)
1406
+ return [new InvalidArgumentMessage(arg.start, arg.end - arg.start)];
1407
+ if (cxt.config.blockModifiers.has(node.state.name))
1408
+ return [new NameAlreadyDefinedMessage(
1409
+ arg.start,
1410
+ arg.end - arg.start,
1411
+ node.state.name
1412
+ )];
1413
+ return [];
1414
+ },
1227
1415
  expand(node, cxt, immediate) {
1228
1416
  if (!immediate) return void 0;
1229
- if (node.state) {
1417
+ if (node.state?.name) {
1230
1418
  if (cxt.config.blockModifiers.has(node.state.name))
1231
1419
  cxt.config.blockModifiers.remove(node.state.name);
1232
1420
  cxt.config.blockModifiers.add(
@@ -1249,12 +1437,12 @@ var DefineInlineMod = new SystemModifierDefinition("define-inline", 0 /* Normal
1249
1437
  delayContentExpansion: true,
1250
1438
  alwaysTryExpand: true,
1251
1439
  beforeParseContent(node, cxt) {
1252
- if (node.arguments.length == 0)
1253
- return [new ArgumentsTooFewMessage(node.head.end - 1, 0)];
1440
+ const check = checkArgumentLength(node, 1, Infinity);
1441
+ if (check) return check;
1254
1442
  const msgs = [];
1255
1443
  const name = node.arguments[0];
1256
- const nameValue = cxt.evaluateArgument(name);
1257
- if (cxt.config.inlineModifiers.has(nameValue))
1444
+ const nameValue = name.expansion;
1445
+ if (nameValue && cxt.config.inlineModifiers.has(nameValue))
1258
1446
  msgs.push(new NameAlreadyDefinedMessage(
1259
1447
  node.start,
1260
1448
  name.end - name.start,
@@ -1262,15 +1450,24 @@ var DefineInlineMod = new SystemModifierDefinition("define-inline", 0 /* Normal
1262
1450
  ));
1263
1451
  let slotName = "";
1264
1452
  if (node.arguments.length > 1) {
1265
- const last = cxt.evaluateArgument(node.arguments.at(-1));
1266
- slotName = /^\(.+\)$/.test(last) ? last.substring(1, last.length - 1) : "";
1453
+ const last = node.arguments.at(-1);
1454
+ if (last.expansion)
1455
+ slotName = /^\(.+\)$/.test(last.expansion) ? last.expansion.substring(1, last.expansion.length - 1) : "";
1456
+ else msgs.push(
1457
+ new InvalidArgumentMessage(last.start, last.end - last.start)
1458
+ );
1267
1459
  }
1268
- const args = node.arguments.slice(1, slotName !== "" ? node.arguments.length - 1 : void 0).map((x) => cxt.evaluateArgument(x));
1269
- node.state = { name: nameValue, slotName, args };
1460
+ const args = node.arguments.slice(1, slotName !== "" ? node.arguments.length - 1 : void 0).map((x) => {
1461
+ if (!x.expansion) msgs.push(
1462
+ new InvalidArgumentMessage(x.start, x.end - x.start)
1463
+ );
1464
+ return x.expansion ?? "";
1465
+ });
1466
+ node.state = { name: nameValue, slotName, args, msgs };
1270
1467
  const store = cxt.get(builtins);
1271
1468
  store.inlineSlotDelayedStack.push(node.state.slotName);
1272
1469
  debug.trace("entering inline definition:", node.state.name);
1273
- return msgs;
1470
+ return [];
1274
1471
  },
1275
1472
  afterParseContent(node, cxt) {
1276
1473
  if (!node.state) return [];
@@ -1279,9 +1476,18 @@ var DefineInlineMod = new SystemModifierDefinition("define-inline", 0 /* Normal
1279
1476
  debug.trace("leaving inline definition", node.state.name);
1280
1477
  return [];
1281
1478
  },
1282
- prepareExpand(node, cxt) {
1283
- if (!node.state) return [];
1479
+ prepareExpand(node, cxt, immediate) {
1480
+ if (!immediate || !node.state) return [];
1481
+ const arg = node.arguments[0];
1482
+ if (!node.state.name)
1483
+ return [new InvalidArgumentMessage(arg.start, arg.end - arg.start)];
1284
1484
  const msgs = [];
1485
+ if (cxt.config.inlineModifiers.has(node.state.name))
1486
+ msgs.push(new NameAlreadyDefinedMessage(
1487
+ arg.start,
1488
+ arg.end - arg.start,
1489
+ node.state.name
1490
+ ));
1285
1491
  let lastIsParagraph = false;
1286
1492
  let concat = [];
1287
1493
  for (const n of node.content) {
@@ -1309,7 +1515,7 @@ var DefineInlineMod = new SystemModifierDefinition("define-inline", 0 /* Normal
1309
1515
  },
1310
1516
  expand(node, cxt, immediate) {
1311
1517
  if (!immediate) return void 0;
1312
- if (node.state) {
1518
+ if (node.state?.name) {
1313
1519
  if (cxt.config.inlineModifiers.has(node.state.name))
1314
1520
  cxt.config.inlineModifiers.remove(node.state.name);
1315
1521
  cxt.config.inlineModifiers.add(
@@ -1326,27 +1532,68 @@ var DefineInlineMod = new SystemModifierDefinition("define-inline", 0 /* Normal
1326
1532
  }
1327
1533
  });
1328
1534
 
1535
+ // src/builtin/pushpop.ts
1536
+ var PushNotationMod = new SystemModifierDefinition(
1537
+ "push-notation",
1538
+ 2 /* Marker */,
1539
+ {
1540
+ expand(_, cxt) {
1541
+ const data = cxt.get(builtins);
1542
+ data.notationStack.push({
1543
+ blocks: cxt.config.blockModifiers.toArray(),
1544
+ inlines: cxt.config.inlineModifiers.toArray()
1545
+ });
1546
+ return [];
1547
+ }
1548
+ }
1549
+ );
1550
+ var PopNotationMod = new SystemModifierDefinition(
1551
+ "pop-notation",
1552
+ 2 /* Marker */,
1553
+ {
1554
+ prepareExpand(node, cxt) {
1555
+ const data = cxt.get(builtins);
1556
+ const result = data.notationStack.pop();
1557
+ if (!result) return [
1558
+ new CannotPopNotationMessage(node.start, node.end - node.start)
1559
+ ];
1560
+ cxt.config.blockModifiers = new NameManager(result.blocks);
1561
+ cxt.config.inlineModifiers = new NameManager(result.inlines);
1562
+ return [];
1563
+ },
1564
+ expand() {
1565
+ return [];
1566
+ }
1567
+ }
1568
+ );
1569
+
1329
1570
  // src/builtin/slot.ts
1330
1571
  function slotModifier(type) {
1331
1572
  const mod = type == 7 /* BlockModifier */ ? new BlockModifierDefinition("slot", 2 /* Marker */) : new InlineModifierDefinition("slot", 2 /* Marker */);
1332
1573
  const isInline = type == 6 /* InlineModifier */;
1333
1574
  mod.alwaysTryExpand = true;
1334
1575
  mod.prepareExpand = (node, cxt, immediate) => {
1576
+ if (node.state) return [];
1577
+ const check = checkArgumentLength(node, 0, 1);
1578
+ if (check && immediate) {
1579
+ node.state = { ok: false };
1580
+ return check;
1581
+ }
1335
1582
  const store = cxt.get(builtins);
1336
1583
  const data = isInline ? store.inlineSlotData : store.blockSlotData;
1337
- const id = node.arguments.length == 1 ? cxt.evaluateArgument(node.arguments[0]) : "";
1338
- if (data.length == 0) {
1339
- if (immediate) {
1584
+ let id = "";
1585
+ if (node.arguments.length == 1) {
1586
+ const arg = node.arguments[0];
1587
+ if (!arg.expansion) {
1340
1588
  node.state = { ok: false };
1341
- return [new SlotUsedOutsideDefinitionMessage(node.start, node.head.end - node.start)];
1589
+ return [new InvalidArgumentMessage(arg.start, arg.end - arg.start)];
1342
1590
  }
1343
- return [];
1591
+ id = arg.expansion;
1344
1592
  }
1345
- if (node.arguments.length > 1) {
1593
+ if (data.length == 0) {
1346
1594
  if (immediate) {
1347
1595
  node.state = { ok: false };
1348
- const start = node.arguments[1].start - 1;
1349
- return [new ArgumentsTooManyMessage(start, node.head.end - start)];
1596
+ return [new SlotUsedOutsideDefinitionMessage(node.start, node.head.end - node.start)];
1350
1597
  }
1351
1598
  return [];
1352
1599
  }
@@ -1417,10 +1664,10 @@ function resolveId(id, cxt) {
1417
1664
  var GetVarInlineMod = new InlineModifierDefinition("$", 2 /* Marker */, {
1418
1665
  // .$:id
1419
1666
  prepareExpand(node, cxt) {
1420
- const check = checkArgumentLength(node, 1);
1421
- if (check) return [check];
1667
+ const check = checkArguments(node, 1);
1668
+ if (check) return check;
1422
1669
  const arg = node.arguments[0];
1423
- const id = cxt.evaluateArgument(arg);
1670
+ const id = arg.expansion;
1424
1671
  if (id == "")
1425
1672
  return [new InvalidArgumentMessage(arg.start, arg.end - arg.start)];
1426
1673
  const value = resolveId(id, cxt);
@@ -1434,23 +1681,44 @@ var GetVarInlineMod = new InlineModifierDefinition("$", 2 /* Marker */, {
1434
1681
  return [{ type: 3 /* Text */, content: node.state.value, start: -1, end: -1 }];
1435
1682
  }
1436
1683
  });
1684
+ var PrintInlineMod = new InlineModifierDefinition("print", 2 /* Marker */, {
1685
+ // .print:args...
1686
+ prepareExpand(node) {
1687
+ const check = checkArguments(node);
1688
+ if (check) return check;
1689
+ node.state = { value: node.arguments.map((x) => x.expansion).join("") };
1690
+ return [];
1691
+ },
1692
+ expand(node) {
1693
+ if (!node.state) return [];
1694
+ return [{ type: 3 /* Text */, content: node.state.value, start: -1, end: -1 }];
1695
+ }
1696
+ });
1437
1697
  var GetVarInterpolator = new ArgumentInterpolatorDefinition(
1438
1698
  "$(",
1439
1699
  ")",
1440
- (content, cxt) => resolveId(content, cxt) ?? ""
1700
+ {
1701
+ alwaysTryExpand: true,
1702
+ expand(content, cxt, immediate) {
1703
+ const result = resolveId(content, cxt);
1704
+ if (result === void 0) debug.trace("var interp failed:", content);
1705
+ else debug.trace(`$(${content}) --> ${result}`);
1706
+ return result;
1707
+ }
1708
+ }
1441
1709
  );
1442
1710
  var VarMod = new SystemModifierDefinition("var", 2 /* Marker */, {
1443
1711
  // .var id:value
1444
1712
  prepareExpand(node, cxt) {
1445
- const check = checkArgumentLength(node, 2);
1446
- if (check) return [check];
1713
+ const check = checkArguments(node, 2);
1714
+ if (check) return check;
1447
1715
  const arg = node.arguments[0];
1448
- const argValue = cxt.evaluateArgument(arg);
1449
- if (argValue == "")
1716
+ const id = arg.expansion;
1717
+ if (id == "")
1450
1718
  return [new InvalidArgumentMessage(arg.start, arg.end - arg.start)];
1451
1719
  node.state = {
1452
- id: argValue,
1453
- value: cxt.evaluateArgument(node.arguments[1])
1720
+ id,
1721
+ value: node.arguments[1].expansion
1454
1722
  };
1455
1723
  return [];
1456
1724
  },
@@ -1466,39 +1734,32 @@ var VarMod = new SystemModifierDefinition("var", 2 /* Marker */, {
1466
1734
  // src/builtin/builtin.ts
1467
1735
  var basic = new Configuration();
1468
1736
  basic.initializers = [initParseContext];
1469
- basic.systemModifiers.add(DefineBlockMod, DefineInlineMod, VarMod);
1737
+ basic.systemModifiers.add(DefineBlockMod, DefineInlineMod, VarMod, PushNotationMod, PopNotationMod);
1470
1738
  basic.blockModifiers.add(SlotBlockMod);
1471
- basic.inlineModifiers.add(SlotInlineMod, GetVarInlineMod);
1739
+ basic.inlineModifiers.add(SlotInlineMod, GetVarInlineMod, PrintInlineMod);
1472
1740
  basic.argumentInterpolators.add(GetVarInterpolator);
1473
1741
  var BuiltinConfiguration = Object.freeze(basic);
1742
+
1743
+ // src/index.ts
1744
+ function setDebugLevel(level) {
1745
+ debug.level = level;
1746
+ }
1474
1747
  export {
1475
1748
  ArgumentInterpolatorDefinition,
1476
- ArgumentsTooFewMessage,
1477
- ArgumentsTooManyMessage,
1478
1749
  BlockModifierDefinition,
1479
1750
  BuiltinConfiguration,
1480
1751
  Configuration,
1481
- ContentShouldBeOnNewlineMessage,
1482
- Document2 as Document,
1483
- ExpectedMessage,
1484
- InlineDefinitonInvalidEntityMessage,
1752
+ DebugLevel,
1753
+ Document,
1485
1754
  InlineModifierDefinition,
1486
- InvalidArgumentMessage,
1487
1755
  MessageSeverity,
1488
1756
  ModifierFlags,
1489
- NameAlreadyDefinedMessage,
1490
- NewBlockShouldBeOnNewlineMessage,
1491
1757
  NodeType,
1492
1758
  ParseContext,
1493
- ReachedRecursionLimitMessage,
1494
- ReferredMessage,
1495
1759
  SimpleScanner,
1496
- SlotUsedOutsideDefinitionMessage,
1497
1760
  SystemModifierDefinition,
1498
- UnclosedInlineModifierMessage,
1499
- UndefinedVariableMessage,
1500
- UnknownModifierMessage,
1501
- UnnecessaryNewlineMessage,
1502
- parse
1761
+ messages_exports as messages,
1762
+ parse,
1763
+ setDebugLevel
1503
1764
  };
1504
1765
  //# sourceMappingURL=index.mjs.map