@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/README.md +265 -4
- package/dist/index.d.mts +95 -17
- package/dist/index.d.ts +95 -17
- package/dist/index.js +523 -280
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +525 -264
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
package/dist/index.mjs
CHANGED
|
@@ -1,32 +1,133 @@
|
|
|
1
|
-
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
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
|
|
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
|
|
144
|
-
constructor(position, length,
|
|
247
|
+
var ArgumentCountMismatchMessage = class {
|
|
248
|
+
constructor(position, length, min, max) {
|
|
145
249
|
this.position = position;
|
|
146
250
|
this.length = length;
|
|
147
|
-
|
|
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 `
|
|
264
|
+
return `argument count mismatch` + this.msg;
|
|
154
265
|
}
|
|
155
266
|
};
|
|
156
|
-
var
|
|
157
|
-
constructor(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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 `
|
|
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
|
-
|
|
290
|
-
|
|
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:
|
|
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.
|
|
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
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
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
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
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 (
|
|
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.
|
|
736
|
-
|
|
737
|
-
|
|
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
|
|
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
|
-
|
|
835
|
-
|
|
836
|
-
|
|
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}
|
|
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:
|
|
1012
|
+
head: { start: posStart, end: headEnd },
|
|
856
1013
|
arguments: args,
|
|
857
1014
|
start: posStart,
|
|
858
|
-
end:
|
|
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 -
|
|
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
|
-
|
|
1083
|
-
start:
|
|
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
|
-
|
|
1151
|
-
if (check) return
|
|
1152
|
-
node.state = {
|
|
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, {
|
|
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
|
-
|
|
1198
|
-
|
|
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 =
|
|
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 =
|
|
1211
|
-
|
|
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) =>
|
|
1214
|
-
|
|
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
|
|
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
|
-
|
|
1253
|
-
|
|
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 =
|
|
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 =
|
|
1266
|
-
|
|
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) =>
|
|
1269
|
-
|
|
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
|
|
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
|
-
|
|
1338
|
-
if (
|
|
1339
|
-
|
|
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
|
|
1589
|
+
return [new InvalidArgumentMessage(arg.start, arg.end - arg.start)];
|
|
1342
1590
|
}
|
|
1343
|
-
|
|
1591
|
+
id = arg.expansion;
|
|
1344
1592
|
}
|
|
1345
|
-
if (
|
|
1593
|
+
if (data.length == 0) {
|
|
1346
1594
|
if (immediate) {
|
|
1347
1595
|
node.state = { ok: false };
|
|
1348
|
-
|
|
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 =
|
|
1421
|
-
if (check) return
|
|
1667
|
+
const check = checkArguments(node, 1);
|
|
1668
|
+
if (check) return check;
|
|
1422
1669
|
const arg = node.arguments[0];
|
|
1423
|
-
const id =
|
|
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
|
-
|
|
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 =
|
|
1446
|
-
if (check) return
|
|
1713
|
+
const check = checkArguments(node, 2);
|
|
1714
|
+
if (check) return check;
|
|
1447
1715
|
const arg = node.arguments[0];
|
|
1448
|
-
const
|
|
1449
|
-
if (
|
|
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
|
|
1453
|
-
value:
|
|
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
|
-
|
|
1482
|
-
|
|
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
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
UnnecessaryNewlineMessage,
|
|
1502
|
-
parse
|
|
1761
|
+
messages_exports as messages,
|
|
1762
|
+
parse,
|
|
1763
|
+
setDebugLevel
|
|
1503
1764
|
};
|
|
1504
1765
|
//# sourceMappingURL=index.mjs.map
|