document-ir 0.0.6

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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/esm/ArrayCollapseTransformer.d.ts +5 -0
  4. package/esm/ArrayCollapseTransformer.js +18 -0
  5. package/esm/ArrayCollapseTransformer_test.d.ts +1 -0
  6. package/esm/ExampleDocument.d.ts +2 -0
  7. package/esm/IdentityTransformer.d.ts +53 -0
  8. package/esm/IdentityTransformer.js +688 -0
  9. package/esm/IdentityTransformer_test.d.ts +1 -0
  10. package/esm/NodeVisitor.d.ts +53 -0
  11. package/esm/NodeVisitor.js +369 -0
  12. package/esm/TextCollapseTransformer.d.ts +5 -0
  13. package/esm/TextCollapseTransformer.js +36 -0
  14. package/esm/TextCollapseTransformer_test.d.ts +1 -0
  15. package/esm/TextVisitor.d.ts +12 -0
  16. package/esm/TextVisitor.js +36 -0
  17. package/esm/TextVisitor_test.d.ts +1 -0
  18. package/esm/WhitespaceStretchingTransformer.d.ts +26 -0
  19. package/esm/WhitespaceStretchingTransformer.js +119 -0
  20. package/esm/WhitespaceStretchingTransformer_test.d.ts +1 -0
  21. package/esm/WhitespaceTransformer.d.ts +12 -0
  22. package/esm/WhitespaceTransformer.js +75 -0
  23. package/esm/WhitespaceTransformer_test.d.ts +1 -0
  24. package/esm/_dnt.test_shims.d.ts +5 -0
  25. package/esm/deps/deno.land/std@0.192.0/fmt/colors.d.ts +270 -0
  26. package/esm/deps/deno.land/std@0.192.0/testing/_diff.d.ts +26 -0
  27. package/esm/deps/deno.land/std@0.192.0/testing/_format.d.ts +1 -0
  28. package/esm/deps/deno.land/std@0.192.0/testing/asserts.d.ts +284 -0
  29. package/esm/index.d.ts +8 -0
  30. package/esm/index.js +8 -0
  31. package/esm/package.json +3 -0
  32. package/esm/types.d.ts +307 -0
  33. package/esm/types.js +1 -0
  34. package/package.json +29 -0
  35. package/script/ArrayCollapseTransformer.d.ts +5 -0
  36. package/script/ArrayCollapseTransformer.js +22 -0
  37. package/script/ArrayCollapseTransformer_test.d.ts +1 -0
  38. package/script/ExampleDocument.d.ts +2 -0
  39. package/script/IdentityTransformer.d.ts +53 -0
  40. package/script/IdentityTransformer.js +692 -0
  41. package/script/IdentityTransformer_test.d.ts +1 -0
  42. package/script/NodeVisitor.d.ts +53 -0
  43. package/script/NodeVisitor.js +373 -0
  44. package/script/TextCollapseTransformer.d.ts +5 -0
  45. package/script/TextCollapseTransformer.js +40 -0
  46. package/script/TextCollapseTransformer_test.d.ts +1 -0
  47. package/script/TextVisitor.d.ts +12 -0
  48. package/script/TextVisitor.js +40 -0
  49. package/script/TextVisitor_test.d.ts +1 -0
  50. package/script/WhitespaceStretchingTransformer.d.ts +26 -0
  51. package/script/WhitespaceStretchingTransformer.js +123 -0
  52. package/script/WhitespaceStretchingTransformer_test.d.ts +1 -0
  53. package/script/WhitespaceTransformer.d.ts +12 -0
  54. package/script/WhitespaceTransformer.js +79 -0
  55. package/script/WhitespaceTransformer_test.d.ts +1 -0
  56. package/script/_dnt.test_shims.d.ts +5 -0
  57. package/script/deps/deno.land/std@0.192.0/fmt/colors.d.ts +270 -0
  58. package/script/deps/deno.land/std@0.192.0/testing/_diff.d.ts +26 -0
  59. package/script/deps/deno.land/std@0.192.0/testing/_format.d.ts +1 -0
  60. package/script/deps/deno.land/std@0.192.0/testing/asserts.d.ts +284 -0
  61. package/script/index.d.ts +8 -0
  62. package/script/index.js +32 -0
  63. package/script/package.json +3 -0
  64. package/script/types.d.ts +307 -0
  65. package/script/types.js +2 -0
@@ -0,0 +1,53 @@
1
+ import { ArrayNode, BlockNode, BlockQuoteNode, BoldNode, BreakNode, BubbleNode, CardNode, CenterNode, CodeNode, ColumnsNode, DefinitionListNode, DefinitionNode, DefinitionReferenceNode, DocumentNode, EmbedNode, EmojiNode, FigureCaptionNode, FigureImageNode, FigureNode, FormattedTextNode, HeaderNode, HighTechAlertNode, HorizontalRuleNode, ImageNode, ItalicNode, LinkNode, ListNode, Node, NoteNode, ParagraphNode, QuoteNode, RedactedNode, RegionNode, ScriptNode, SecretNode, SmallerNode, SocialNode, StickerNode, StrikeThroughNode, TableNode, TextNode, UnderlineNode, VideoNode, WarningNode } from "./types.js";
2
+ export declare class NodeVisitor {
3
+ protected beforeBlock(): void;
4
+ protected afterBlock(): void;
5
+ protected beforeInline(): void;
6
+ protected afterInline(): void;
7
+ protected chooseChildren(nodes: Node[]): void;
8
+ protected block(node: BlockNode): void;
9
+ protected blockQuote(node: BlockQuoteNode): void;
10
+ protected bold(node: BoldNode): void;
11
+ protected break_(_node: BreakNode): void;
12
+ protected bubble(node: BubbleNode): void;
13
+ protected center(node: CenterNode): void;
14
+ protected code(node: CodeNode): void;
15
+ protected columns(node: ColumnsNode): void;
16
+ protected definition(node: DefinitionNode): void;
17
+ protected definitionList(node: DefinitionListNode): void;
18
+ protected definitionReference(node: DefinitionReferenceNode): void;
19
+ protected embed(_node: EmbedNode): void;
20
+ protected emoji(_node: EmojiNode): void;
21
+ protected figure(node: FigureNode): void;
22
+ protected figureCaption(node: FigureCaptionNode): void;
23
+ protected figureImage(node: FigureImageNode): void;
24
+ protected formattedText(_node: FormattedTextNode): void;
25
+ protected header(node: HeaderNode): void;
26
+ protected highTechAlert(node: HighTechAlertNode): void;
27
+ protected horizontalRule(_node: HorizontalRuleNode): void;
28
+ protected image(_node: ImageNode): void;
29
+ protected italic(node: ItalicNode): void;
30
+ protected link(node: LinkNode): void;
31
+ protected array(node: ArrayNode): void;
32
+ protected note(node: NoteNode): void;
33
+ protected list(node: ListNode): void;
34
+ protected paragraph(node: ParagraphNode): void;
35
+ protected quote(node: QuoteNode): void;
36
+ protected redacted(node: RedactedNode): void;
37
+ protected region(node: RegionNode): void;
38
+ protected script(_node: ScriptNode): void;
39
+ protected secret(node: SecretNode): void;
40
+ protected smaller(node: SmallerNode): void;
41
+ protected sticker(node: StickerNode): void;
42
+ protected strikeThrough(node: StrikeThroughNode): void;
43
+ protected text(_node: TextNode): void;
44
+ protected table(node: TableNode): void;
45
+ protected social(_node: SocialNode): void;
46
+ protected underline(node: UnderlineNode): void;
47
+ protected video(node: VideoNode): void;
48
+ protected warning(node: WarningNode): void;
49
+ protected card(node: CardNode): void;
50
+ protected choose(node: Node): void;
51
+ protected document(node: DocumentNode): void;
52
+ visit(node: DocumentNode | Node): void;
53
+ }
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NodeVisitor = void 0;
4
+ class NodeVisitor {
5
+ beforeBlock() {
6
+ }
7
+ afterBlock() {
8
+ }
9
+ beforeInline() {
10
+ }
11
+ afterInline() {
12
+ }
13
+ chooseChildren(nodes) {
14
+ for (const child of nodes) {
15
+ this.choose(child);
16
+ }
17
+ }
18
+ block(node) {
19
+ this.beforeBlock();
20
+ this.chooseChildren(node.content);
21
+ this.afterBlock();
22
+ }
23
+ blockQuote(node) {
24
+ this.beforeBlock();
25
+ this.chooseChildren(node.content);
26
+ this.afterBlock();
27
+ }
28
+ bold(node) {
29
+ this.beforeInline();
30
+ this.chooseChildren(node.content);
31
+ this.afterInline();
32
+ }
33
+ break_(_node) {
34
+ this.beforeBlock();
35
+ this.afterBlock();
36
+ }
37
+ bubble(node) {
38
+ this.beforeBlock();
39
+ this.chooseChildren(node.content);
40
+ this.afterBlock();
41
+ }
42
+ center(node) {
43
+ this.beforeBlock();
44
+ this.chooseChildren(node.content);
45
+ this.afterBlock();
46
+ }
47
+ code(node) {
48
+ this.beforeInline();
49
+ this.chooseChildren(node.content);
50
+ this.afterInline();
51
+ }
52
+ columns(node) {
53
+ for (const column of node.columns) {
54
+ this.beforeBlock();
55
+ this.chooseChildren(column);
56
+ this.afterBlock();
57
+ }
58
+ }
59
+ definition(node) {
60
+ this.beforeBlock();
61
+ this.chooseChildren(node.abbreviation);
62
+ this.afterBlock();
63
+ this.beforeBlock();
64
+ this.chooseChildren(node.title);
65
+ this.afterBlock();
66
+ this.beforeBlock();
67
+ this.chooseChildren(node.content);
68
+ this.afterBlock();
69
+ }
70
+ definitionList(node) {
71
+ this.beforeBlock();
72
+ for (const child of node.content) {
73
+ this.definition(child);
74
+ }
75
+ this.afterBlock();
76
+ }
77
+ definitionReference(node) {
78
+ this.beforeInline();
79
+ this.chooseChildren(node.definition.abbreviation);
80
+ this.afterInline();
81
+ this.chooseChildren(node.content);
82
+ }
83
+ embed(_node) {
84
+ }
85
+ emoji(_node) {
86
+ }
87
+ figure(node) {
88
+ this.beforeBlock();
89
+ this.chooseChildren(node.content);
90
+ this.afterBlock();
91
+ }
92
+ figureCaption(node) {
93
+ this.beforeBlock();
94
+ this.chooseChildren(node.content);
95
+ this.afterBlock();
96
+ }
97
+ figureImage(node) {
98
+ this.beforeBlock();
99
+ this.chooseChildren(node.content);
100
+ this.afterBlock();
101
+ }
102
+ formattedText(_node) {
103
+ }
104
+ header(node) {
105
+ this.beforeBlock();
106
+ this.chooseChildren(node.content);
107
+ this.afterBlock();
108
+ }
109
+ highTechAlert(node) {
110
+ this.beforeBlock();
111
+ this.chooseChildren(node.content);
112
+ this.afterBlock();
113
+ this.beforeBlock();
114
+ this.chooseChildren(node.warning);
115
+ this.afterBlock();
116
+ }
117
+ horizontalRule(_node) {
118
+ }
119
+ image(_node) {
120
+ }
121
+ italic(node) {
122
+ this.beforeInline();
123
+ this.chooseChildren(node.content);
124
+ this.afterInline();
125
+ }
126
+ link(node) {
127
+ this.beforeInline();
128
+ this.chooseChildren(node.content);
129
+ this.afterInline();
130
+ }
131
+ array(node) {
132
+ this.chooseChildren(node.content);
133
+ }
134
+ note(node) {
135
+ this.beforeBlock();
136
+ this.chooseChildren(node.content);
137
+ this.afterBlock();
138
+ }
139
+ list(node) {
140
+ for (const item of node.content) {
141
+ this.beforeBlock();
142
+ this.chooseChildren(item.content);
143
+ this.afterBlock();
144
+ }
145
+ }
146
+ paragraph(node) {
147
+ this.beforeBlock();
148
+ this.chooseChildren(node.content);
149
+ this.afterBlock();
150
+ }
151
+ quote(node) {
152
+ this.beforeBlock();
153
+ this.chooseChildren(node.content);
154
+ this.afterBlock();
155
+ }
156
+ redacted(node) {
157
+ if (node.style == "block") {
158
+ this.beforeBlock();
159
+ }
160
+ else {
161
+ this.beforeInline();
162
+ }
163
+ this.chooseChildren(node.content);
164
+ if (node.style == "block") {
165
+ this.afterBlock();
166
+ }
167
+ else {
168
+ this.afterInline();
169
+ }
170
+ }
171
+ region(node) {
172
+ this.beforeBlock();
173
+ this.chooseChildren(node.content);
174
+ this.afterBlock();
175
+ }
176
+ script(_node) {
177
+ }
178
+ secret(node) {
179
+ this.beforeInline();
180
+ this.chooseChildren(node.content);
181
+ this.afterInline();
182
+ }
183
+ smaller(node) {
184
+ this.beforeInline();
185
+ this.chooseChildren(node.content);
186
+ this.afterInline();
187
+ }
188
+ sticker(node) {
189
+ this.beforeBlock();
190
+ this.chooseChildren(node.content);
191
+ this.afterBlock();
192
+ }
193
+ strikeThrough(node) {
194
+ this.beforeInline();
195
+ this.chooseChildren(node.content);
196
+ this.afterInline();
197
+ }
198
+ text(_node) {
199
+ }
200
+ table(node) {
201
+ for (const row of node.content) {
202
+ for (const cell of row) {
203
+ this.beforeBlock();
204
+ this.chooseChildren(cell.content);
205
+ this.afterBlock();
206
+ }
207
+ }
208
+ }
209
+ social(_node) {
210
+ }
211
+ underline(node) {
212
+ this.beforeInline();
213
+ this.chooseChildren(node.content);
214
+ this.afterInline();
215
+ }
216
+ video(node) {
217
+ this.beforeBlock();
218
+ node.content && this.chooseChildren(node.content);
219
+ this.afterBlock();
220
+ }
221
+ warning(node) {
222
+ this.beforeBlock();
223
+ this.chooseChildren(node.content);
224
+ this.afterBlock();
225
+ }
226
+ card(node) {
227
+ if (node.content) {
228
+ this.beforeBlock();
229
+ this.chooseChildren(node.content.content);
230
+ this.afterBlock();
231
+ }
232
+ if (node.attribution) {
233
+ if (node.attribution.title) {
234
+ this.beforeBlock();
235
+ const _title = this.chooseChildren(node.attribution.title);
236
+ this.afterBlock();
237
+ }
238
+ }
239
+ if (node.header) {
240
+ this.beforeBlock();
241
+ this.chooseChildren(node.header.title);
242
+ this.afterBlock();
243
+ }
244
+ if (node.media) {
245
+ for (const mediaNode of node.media.content) {
246
+ this.beforeBlock();
247
+ this.choose(mediaNode);
248
+ this.afterBlock();
249
+ }
250
+ }
251
+ }
252
+ choose(node) {
253
+ if (!node || !node.type) {
254
+ throw new Error(`Unexpected node, no type: ${JSON.stringify(node)}`);
255
+ }
256
+ try {
257
+ switch (node.type) {
258
+ case "block":
259
+ return this.block(node);
260
+ case "block-quote":
261
+ return this.blockQuote(node);
262
+ case "bold":
263
+ return this.bold(node);
264
+ case "break":
265
+ return this.break_(node);
266
+ case "bubble":
267
+ return this.bubble(node);
268
+ case "card":
269
+ return this.card(node);
270
+ case "center":
271
+ return this.center(node);
272
+ case "code":
273
+ return this.code(node);
274
+ case "columns":
275
+ return this.columns(node);
276
+ case "definition":
277
+ return this.definition(node);
278
+ case "definition-list":
279
+ return this.definitionList(node);
280
+ case "definition-reference":
281
+ return this.definitionReference(node);
282
+ case "embed":
283
+ return this.embed(node);
284
+ case "emoji":
285
+ return this.emoji(node);
286
+ case "figure":
287
+ return this.figure(node);
288
+ case "figure-caption":
289
+ return this.figureCaption(node);
290
+ case "figure-image":
291
+ return this.figureImage(node);
292
+ case "formatted-text":
293
+ return this.formattedText(node);
294
+ case "header":
295
+ return this.header(node);
296
+ case "high-tech-alert":
297
+ return this.highTechAlert(node);
298
+ case "horizontal-rule":
299
+ return this.horizontalRule(node);
300
+ case "image":
301
+ return this.image(node);
302
+ case "italic":
303
+ return this.italic(node);
304
+ case "link":
305
+ return this.link(node);
306
+ case "array":
307
+ return this.array(node);
308
+ case "note":
309
+ return this.note(node);
310
+ case "list":
311
+ return this.list(node);
312
+ case "paragraph":
313
+ return this.paragraph(node);
314
+ case "quote":
315
+ return this.quote(node);
316
+ case "redacted":
317
+ return this.redacted(node);
318
+ case "region":
319
+ return this.region(node);
320
+ case "script":
321
+ return this.script(node);
322
+ case "secret":
323
+ return this.secret(node);
324
+ case "smaller":
325
+ return this.smaller(node);
326
+ case "sticker":
327
+ return this.sticker(node);
328
+ case "strike-through":
329
+ return this.strikeThrough(node);
330
+ case "table":
331
+ return this.table(node);
332
+ case "text":
333
+ return this.text(node);
334
+ case "toot":
335
+ case "tweet":
336
+ case "vimeo":
337
+ case "youtube":
338
+ return this.social(node);
339
+ case "underline":
340
+ return this.underline(node);
341
+ case "video":
342
+ return this.video(node);
343
+ case "warning":
344
+ return this.warning(node);
345
+ }
346
+ }
347
+ catch (e) {
348
+ console.log(`Got exception while processing node: ${JSON.stringify(node)}`);
349
+ throw e;
350
+ }
351
+ //@ts-ignore Fall through
352
+ console.error(`Unsupported type ${node.type}`);
353
+ }
354
+ document(node) {
355
+ this.beforeBlock();
356
+ this.chooseChildren(node.content);
357
+ this.afterBlock();
358
+ this.beforeBlock();
359
+ if (node.definitions) {
360
+ this.chooseChildren(node.definitions);
361
+ }
362
+ this.afterBlock();
363
+ }
364
+ visit(node) {
365
+ if (node.type == "document") {
366
+ this.document(node);
367
+ }
368
+ else {
369
+ this.choose(node);
370
+ }
371
+ }
372
+ }
373
+ exports.NodeVisitor = NodeVisitor;
@@ -0,0 +1,5 @@
1
+ import { IdentityTransformer } from "./IdentityTransformer.js";
2
+ import { Node } from "./types.js";
3
+ export declare class TextCollapseTransformer extends IdentityTransformer {
4
+ protected chooseChildren(nodes: Node[]): Promise<Node[]>;
5
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextCollapseTransformer = void 0;
4
+ const IdentityTransformer_js_1 = require("./IdentityTransformer.js");
5
+ class TextCollapseTransformer extends IdentityTransformer_js_1.IdentityTransformer {
6
+ async chooseChildren(nodes) {
7
+ const children = await super.chooseChildren(nodes);
8
+ const results = [];
9
+ let lastText = null;
10
+ for (const child of children) {
11
+ if (child.type == "text") {
12
+ if (lastText != null) {
13
+ lastText = `${lastText}${child.text}`;
14
+ }
15
+ else {
16
+ lastText = child.text;
17
+ }
18
+ }
19
+ else {
20
+ if (lastText != null) {
21
+ results.push({
22
+ type: "text",
23
+ text: lastText,
24
+ });
25
+ lastText = null;
26
+ }
27
+ results.push(child);
28
+ }
29
+ }
30
+ if (lastText != null) {
31
+ results.push({
32
+ type: "text",
33
+ text: lastText,
34
+ });
35
+ lastText = null;
36
+ }
37
+ return results;
38
+ }
39
+ }
40
+ exports.TextCollapseTransformer = TextCollapseTransformer;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { EmojiNode, FigureImageNode, ImageNode, TextNode, VideoNode } from "./types.js";
2
+ import { NodeVisitor } from "./NodeVisitor.js";
3
+ export declare class TextVisitor extends NodeVisitor {
4
+ private textList;
5
+ constructor();
6
+ protected text(node: TextNode): void;
7
+ protected video(node: VideoNode): void;
8
+ protected image(node: ImageNode): void;
9
+ protected emoji(node: EmojiNode): void;
10
+ protected figureImage(node: FigureImageNode): void;
11
+ getText(): string;
12
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextVisitor = void 0;
4
+ const NodeVisitor_js_1 = require("./NodeVisitor.js");
5
+ class TextVisitor extends NodeVisitor_js_1.NodeVisitor {
6
+ constructor() {
7
+ super();
8
+ Object.defineProperty(this, "textList", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: void 0
13
+ });
14
+ this.textList = [];
15
+ }
16
+ text(node) {
17
+ this.textList.push(node.text);
18
+ super.text(node);
19
+ }
20
+ video(node) {
21
+ this.textList.push(node.alt);
22
+ super.video(node);
23
+ }
24
+ image(node) {
25
+ this.textList.push(node.alt);
26
+ super.image(node);
27
+ }
28
+ emoji(node) {
29
+ this.textList.push(node.alt);
30
+ super.emoji(node);
31
+ }
32
+ figureImage(node) {
33
+ this.textList.push(node.alt);
34
+ super.figureImage(node);
35
+ }
36
+ getText() {
37
+ return this.textList.join("");
38
+ }
39
+ }
40
+ exports.TextVisitor = TextVisitor;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import { IdentityTransformer } from "./IdentityTransformer.js";
2
+ import { DocumentNode, Node, TextNode } from "./types.js";
3
+ interface BlockInfo {
4
+ type: '_block';
5
+ content: WhiteSpaceContainer[];
6
+ parent: BlockInfo | InlineInfo | null;
7
+ }
8
+ interface InlineInfo {
9
+ type: '_inline';
10
+ content: WhiteSpaceContainer[];
11
+ parent: BlockInfo | InlineInfo | null;
12
+ }
13
+ type WhiteSpaceContainer = BlockInfo | InlineInfo | TextNode;
14
+ export declare class WhitespaceStretchingTransformer extends IdentityTransformer {
15
+ private root;
16
+ private cursor;
17
+ constructor();
18
+ protected beforeBlock(): Promise<void>;
19
+ protected afterBlock(): Promise<void>;
20
+ protected beforeInline(): Promise<void>;
21
+ protected afterInline(): Promise<void>;
22
+ protected reviewBlock(block: BlockInfo): void;
23
+ protected text(node: TextNode): Promise<Node | null>;
24
+ transform(node: DocumentNode): Promise<DocumentNode>;
25
+ }
26
+ export {};
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WhitespaceStretchingTransformer = void 0;
4
+ const IdentityTransformer_js_1 = require("./IdentityTransformer.js");
5
+ class WhitespaceStretchingTransformer extends IdentityTransformer_js_1.IdentityTransformer {
6
+ constructor() {
7
+ super();
8
+ Object.defineProperty(this, "root", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: void 0
13
+ });
14
+ Object.defineProperty(this, "cursor", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: void 0
19
+ });
20
+ this.root = {
21
+ type: '_block',
22
+ content: [],
23
+ parent: null
24
+ };
25
+ this.cursor = this.root;
26
+ }
27
+ // deno-lint-ignore require-await
28
+ async beforeBlock() {
29
+ const parent = this.cursor;
30
+ const block = {
31
+ type: '_block',
32
+ content: [],
33
+ parent
34
+ };
35
+ parent.content.push(block);
36
+ this.cursor = block;
37
+ }
38
+ // deno-lint-ignore require-await
39
+ async afterBlock() {
40
+ if (this.cursor.parent) {
41
+ this.cursor = this.cursor.parent;
42
+ }
43
+ }
44
+ // deno-lint-ignore require-await
45
+ async beforeInline() {
46
+ const parent = this.cursor;
47
+ const inline = {
48
+ type: '_inline',
49
+ content: [],
50
+ parent
51
+ };
52
+ parent.content.push(inline);
53
+ this.cursor = inline;
54
+ }
55
+ // deno-lint-ignore require-await
56
+ async afterInline() {
57
+ if (this.cursor.parent) {
58
+ this.cursor = this.cursor.parent;
59
+ }
60
+ }
61
+ reviewBlock(block) {
62
+ const nodes = [];
63
+ const visit = (r, level) => {
64
+ if (r.type == 'text') {
65
+ nodes.push({
66
+ node: r,
67
+ level
68
+ });
69
+ }
70
+ else if (r.type == '_block') {
71
+ this.reviewBlock(r);
72
+ nodes.push({ node: null, level });
73
+ }
74
+ else {
75
+ for (const node of r.content) {
76
+ visit(node, level + 1);
77
+ }
78
+ }
79
+ };
80
+ for (const node of block.content) {
81
+ visit(node, 0);
82
+ }
83
+ for (let i = 0; i < nodes.length; i++) {
84
+ const first = nodes[i];
85
+ const second = i + 1 < nodes.length ? nodes[i + 1] : { node: null, level: 0 };
86
+ // No use acting on a dead node
87
+ if (!first.node || !second.node) {
88
+ continue;
89
+ }
90
+ // Interesting things only happen on differing levels
91
+ if (first.level == second.level) {
92
+ continue;
93
+ }
94
+ if (first.level < second.level) {
95
+ if (second.node.text.startsWith(' ')) {
96
+ second.node.text = second.node.text.slice(1);
97
+ first.node.text += ' ';
98
+ }
99
+ }
100
+ else if (first.level > second.level) {
101
+ if (first.node.text.endsWith(' ')) {
102
+ first.node.text = first.node.text.slice(0, -1);
103
+ second.node.text = ` ${second.node.text}`;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ // deno-lint-ignore require-await
109
+ async text(node) {
110
+ const replacement = {
111
+ type: 'text',
112
+ text: `${node.text}`
113
+ };
114
+ this.cursor.content.push(replacement);
115
+ return replacement;
116
+ }
117
+ async transform(node) {
118
+ const result = await super.transform(node);
119
+ this.reviewBlock(this.root);
120
+ return result;
121
+ }
122
+ }
123
+ exports.WhitespaceStretchingTransformer = WhitespaceStretchingTransformer;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { IdentityTransformer } from "./IdentityTransformer.js";
2
+ import { DocumentNode, Node, TextNode } from "./types.js";
3
+ export declare class WhitespaceTransformer extends IdentityTransformer {
4
+ private stripWhitespace;
5
+ private lastText;
6
+ constructor();
7
+ protected text(node: TextNode): Promise<Node | null>;
8
+ private stripLastText;
9
+ protected beforeBlock(): Promise<void>;
10
+ protected afterBlock(): Promise<void>;
11
+ transform(node: DocumentNode): Promise<DocumentNode>;
12
+ }