@fuzdev/mdz 0.3.0 → 0.5.0
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/LICENSE +10 -17
- package/README.md +6 -3
- package/dist/Mdz.svelte +8 -7
- package/dist/Mdz.svelte.d.ts.map +1 -1
- package/dist/MdzNodeView.svelte +74 -30
- package/dist/MdzNodeView.svelte.d.ts +1 -2
- package/dist/MdzNodeView.svelte.d.ts.map +1 -1
- package/dist/MdzPrecompiled.svelte +3 -3
- package/dist/MdzPrecompiled.svelte.d.ts.map +1 -1
- package/dist/MdzRoot.svelte +3 -3
- package/dist/MdzRoot.svelte.d.ts.map +1 -1
- package/dist/MdzStream.svelte +3 -3
- package/dist/MdzStream.svelte.d.ts.map +1 -1
- package/dist/MdzStreamNodeView.svelte +79 -31
- package/dist/MdzStreamNodeView.svelte.d.ts +1 -2
- package/dist/MdzStreamNodeView.svelte.d.ts.map +1 -1
- package/dist/context_helpers.js +1 -1
- package/dist/mdz.d.ts +12 -1
- package/dist/mdz.d.ts.map +1 -1
- package/dist/mdz.js +1 -1
- package/dist/mdz_contexts.d.ts +33 -6
- package/dist/mdz_contexts.d.ts.map +1 -1
- package/dist/mdz_debug_work.d.ts.map +1 -1
- package/dist/mdz_helpers.d.ts +31 -3
- package/dist/mdz_helpers.d.ts.map +1 -1
- package/dist/mdz_helpers.js +104 -12
- package/dist/mdz_lexer.d.ts +3 -1
- package/dist/mdz_lexer.d.ts.map +1 -1
- package/dist/mdz_lexer.js +115 -31
- package/dist/mdz_opcodes.d.ts +3 -1
- package/dist/mdz_opcodes.d.ts.map +1 -1
- package/dist/mdz_opcodes_to_nodes.d.ts.map +1 -1
- package/dist/mdz_opcodes_to_nodes.js +25 -17
- package/dist/mdz_stream_parser.d.ts.map +1 -1
- package/dist/mdz_stream_parser.js +8 -8
- package/dist/mdz_stream_parser_block.js +5 -5
- package/dist/mdz_stream_parser_inline.js +4 -4
- package/dist/mdz_stream_parser_link.d.ts.map +1 -1
- package/dist/mdz_stream_parser_link.js +83 -11
- package/dist/mdz_stream_parser_list.d.ts.map +1 -1
- package/dist/mdz_stream_parser_list.js +13 -7
- package/dist/mdz_stream_parser_state.d.ts.map +1 -1
- package/dist/mdz_stream_parser_state.js +7 -7
- package/dist/mdz_stream_parser_table.d.ts.map +1 -1
- package/dist/mdz_stream_parser_table.js +16 -9
- package/dist/mdz_stream_parser_text.js +2 -2
- package/dist/mdz_stream_parser_url.js +7 -7
- package/dist/mdz_stream_state.svelte.d.ts +3 -1
- package/dist/mdz_stream_state.svelte.d.ts.map +1 -1
- package/dist/mdz_stream_state.svelte.js +4 -0
- package/dist/mdz_to_svelte.d.ts +17 -4
- package/dist/mdz_to_svelte.d.ts.map +1 -1
- package/dist/mdz_to_svelte.js +22 -9
- package/dist/mdz_token_parser.d.ts.map +1 -1
- package/dist/mdz_token_parser.js +25 -11
- package/dist/svelte_preprocess_mdz.d.ts +6 -3
- package/dist/svelte_preprocess_mdz.d.ts.map +1 -1
- package/dist/svelte_preprocess_mdz.js +11 -11
- package/package.json +25 -40
- package/src/lib/context_helpers.ts +2 -2
- package/src/lib/mdz.ts +15 -3
- package/src/lib/mdz_contexts.ts +41 -11
- package/src/lib/mdz_debug_work.ts +1 -1
- package/src/lib/mdz_helpers.ts +164 -43
- package/src/lib/mdz_lexer.ts +173 -80
- package/src/lib/mdz_opcodes.ts +3 -1
- package/src/lib/mdz_opcodes_to_nodes.ts +40 -30
- package/src/lib/mdz_stream_parser.ts +17 -17
- package/src/lib/mdz_stream_parser_block.ts +14 -14
- package/src/lib/mdz_stream_parser_inline.ts +18 -18
- package/src/lib/mdz_stream_parser_link.ts +88 -18
- package/src/lib/mdz_stream_parser_list.ts +31 -25
- package/src/lib/mdz_stream_parser_state.ts +27 -27
- package/src/lib/mdz_stream_parser_table.ts +38 -31
- package/src/lib/mdz_stream_parser_text.ts +3 -3
- package/src/lib/mdz_stream_parser_url.ts +11 -11
- package/src/lib/mdz_stream_state.svelte.ts +11 -8
- package/src/lib/mdz_to_svelte.ts +71 -27
- package/src/lib/mdz_token_parser.ts +52 -38
- package/src/lib/svelte_preprocess_mdz.ts +66 -60
- package/src/lib/tsdoc_mdz.ts +1 -1
|
@@ -17,9 +17,10 @@
|
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import {DEV} from 'esm-env';
|
|
20
|
+
import { DEV } from 'esm-env';
|
|
21
21
|
|
|
22
22
|
import type {
|
|
23
|
+
MdzAttribute,
|
|
23
24
|
MdzNode,
|
|
24
25
|
MdzNodeText,
|
|
25
26
|
MdzNodeLink,
|
|
@@ -28,10 +29,10 @@ import type {
|
|
|
28
29
|
MdzNodeListItem,
|
|
29
30
|
MdzNodeTableRow,
|
|
30
31
|
MdzNodeTableCell,
|
|
31
|
-
MdzTableAlign
|
|
32
|
+
MdzTableAlign
|
|
32
33
|
} from './mdz.ts';
|
|
33
|
-
import type {MdzOpcode, MdzNodeId} from './mdz_opcodes.ts';
|
|
34
|
-
import {mdz_extract_single_tag, mdz_heading_id, mdz_merge_adjacent_text} from './mdz_helpers.ts';
|
|
34
|
+
import type { MdzOpcode, MdzNodeId } from './mdz_opcodes.ts';
|
|
35
|
+
import { mdz_extract_single_tag, mdz_heading_id, mdz_merge_adjacent_text } from './mdz_helpers.ts';
|
|
35
36
|
|
|
36
37
|
interface StackFrame {
|
|
37
38
|
id: MdzNodeId;
|
|
@@ -42,6 +43,7 @@ interface StackFrame {
|
|
|
42
43
|
// metadata from open opcode
|
|
43
44
|
level?: number;
|
|
44
45
|
name?: string;
|
|
46
|
+
attributes?: Array<MdzAttribute>;
|
|
45
47
|
lang?: string | null;
|
|
46
48
|
ordered?: boolean;
|
|
47
49
|
start_number?: number;
|
|
@@ -77,12 +79,13 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
77
79
|
start: op.start,
|
|
78
80
|
level: op.level,
|
|
79
81
|
name: op.name,
|
|
82
|
+
attributes: op.attributes,
|
|
80
83
|
lang: op.lang,
|
|
81
84
|
ordered: op.ordered,
|
|
82
85
|
start_number: op.start_number,
|
|
83
86
|
number: op.number,
|
|
84
87
|
align: op.align,
|
|
85
|
-
header: op.header
|
|
88
|
+
header: op.header
|
|
86
89
|
});
|
|
87
90
|
break;
|
|
88
91
|
}
|
|
@@ -115,8 +118,8 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
115
118
|
case 'text': {
|
|
116
119
|
const node: MdzNodeText | MdzNodeCode =
|
|
117
120
|
op.text_type === 'Code'
|
|
118
|
-
? {type: 'Code', content: op.content, start: op.start, end: op.end}
|
|
119
|
-
: {type: 'Text', content: op.content, start: op.start, end: op.end};
|
|
121
|
+
? { type: 'Code', content: op.content, start: op.start, end: op.end }
|
|
122
|
+
: { type: 'Text', content: op.content, start: op.start, end: op.end };
|
|
120
123
|
text_nodes.set(op.id, node);
|
|
121
124
|
children.push(node);
|
|
122
125
|
break;
|
|
@@ -160,7 +163,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
case 'void': {
|
|
163
|
-
children.push({type: 'Hr', start: op.start, end: op.end});
|
|
166
|
+
children.push({ type: 'Hr', start: op.start, end: op.end });
|
|
164
167
|
break;
|
|
165
168
|
}
|
|
166
169
|
|
|
@@ -224,7 +227,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
224
227
|
type: 'Text',
|
|
225
228
|
content: trimmed_content,
|
|
226
229
|
start: text_node.end,
|
|
227
|
-
end: text_node.end + trimmed_content.length
|
|
230
|
+
end: text_node.end + trimmed_content.length
|
|
228
231
|
};
|
|
229
232
|
text_nodes.set(op.trim_id, trimmed_node);
|
|
230
233
|
}
|
|
@@ -236,7 +239,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
236
239
|
children: [text_node],
|
|
237
240
|
link_type: op.link_type,
|
|
238
241
|
start: op.start,
|
|
239
|
-
end: op.end
|
|
242
|
+
end: op.end
|
|
240
243
|
};
|
|
241
244
|
|
|
242
245
|
// replace text node with [Link, trimmed?] in the buffer
|
|
@@ -278,7 +281,7 @@ const insert_replacement = (
|
|
|
278
281
|
stack: Array<StackFrame>,
|
|
279
282
|
reverted_idx: number,
|
|
280
283
|
at: number,
|
|
281
|
-
op: {replacement_text?: string; start: number}
|
|
284
|
+
op: { replacement_text?: string; start: number }
|
|
282
285
|
): void => {
|
|
283
286
|
const text = op.replacement_text!;
|
|
284
287
|
const parent_start = reverted_idx > 0 ? stack[reverted_idx - 1]!.children_start : 0;
|
|
@@ -303,7 +306,12 @@ const insert_replacement = (
|
|
|
303
306
|
}
|
|
304
307
|
}
|
|
305
308
|
// 3. standalone Text node
|
|
306
|
-
const node: MdzNode = {
|
|
309
|
+
const node: MdzNode = {
|
|
310
|
+
type: 'Text',
|
|
311
|
+
content: text,
|
|
312
|
+
start: op.start,
|
|
313
|
+
end: op.start + text.length
|
|
314
|
+
};
|
|
307
315
|
if (at >= children.length) {
|
|
308
316
|
children.push(node);
|
|
309
317
|
} else {
|
|
@@ -337,7 +345,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
337
345
|
type: 'Paragraph',
|
|
338
346
|
children,
|
|
339
347
|
start: children[0]!.start,
|
|
340
|
-
end: children[children.length - 1]!.end
|
|
348
|
+
end: children[children.length - 1]!.end
|
|
341
349
|
};
|
|
342
350
|
}
|
|
343
351
|
|
|
@@ -350,7 +358,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
350
358
|
id,
|
|
351
359
|
children,
|
|
352
360
|
start: frame.start,
|
|
353
|
-
end: frame.end
|
|
361
|
+
end: frame.end!
|
|
354
362
|
} as MdzNodeHeading;
|
|
355
363
|
}
|
|
356
364
|
|
|
@@ -359,7 +367,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
359
367
|
type: 'Bold',
|
|
360
368
|
children: mdz_merge_adjacent_text(frame_children),
|
|
361
369
|
start: frame.start,
|
|
362
|
-
end: frame.end
|
|
370
|
+
end: frame.end!
|
|
363
371
|
};
|
|
364
372
|
|
|
365
373
|
case 'Italic':
|
|
@@ -367,7 +375,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
367
375
|
type: 'Italic',
|
|
368
376
|
children: mdz_merge_adjacent_text(frame_children),
|
|
369
377
|
start: frame.start,
|
|
370
|
-
end: frame.end
|
|
378
|
+
end: frame.end!
|
|
371
379
|
};
|
|
372
380
|
|
|
373
381
|
case 'Strikethrough':
|
|
@@ -375,7 +383,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
375
383
|
type: 'Strikethrough',
|
|
376
384
|
children: mdz_merge_adjacent_text(frame_children),
|
|
377
385
|
start: frame.start,
|
|
378
|
-
end: frame.end
|
|
386
|
+
end: frame.end!
|
|
379
387
|
};
|
|
380
388
|
|
|
381
389
|
case 'Link':
|
|
@@ -385,7 +393,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
385
393
|
children: mdz_merge_adjacent_text(frame_children),
|
|
386
394
|
link_type: frame.link_type ?? 'internal',
|
|
387
395
|
start: frame.start,
|
|
388
|
-
end: frame.end
|
|
396
|
+
end: frame.end!
|
|
389
397
|
};
|
|
390
398
|
|
|
391
399
|
case 'List': {
|
|
@@ -400,10 +408,10 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
400
408
|
start_number: frame.start_number ?? 1,
|
|
401
409
|
children,
|
|
402
410
|
start: frame.start,
|
|
403
|
-
end
|
|
411
|
+
end
|
|
404
412
|
};
|
|
405
413
|
}
|
|
406
|
-
return {type: 'List', ordered: false, children, start: frame.start, end};
|
|
414
|
+
return { type: 'List', ordered: false, children, start: frame.start, end };
|
|
407
415
|
}
|
|
408
416
|
|
|
409
417
|
case 'ListItem': {
|
|
@@ -411,9 +419,9 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
411
419
|
// childless means an empty item — its close carried the marker end
|
|
412
420
|
const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
|
|
413
421
|
if (frame.number !== undefined) {
|
|
414
|
-
return {type: 'ListItem', number: frame.number, children, start: frame.start, end};
|
|
422
|
+
return { type: 'ListItem', number: frame.number, children, start: frame.start, end };
|
|
415
423
|
}
|
|
416
|
-
return {type: 'ListItem', children, start: frame.start, end};
|
|
424
|
+
return { type: 'ListItem', children, start: frame.start, end };
|
|
417
425
|
}
|
|
418
426
|
|
|
419
427
|
case 'Blockquote': {
|
|
@@ -421,7 +429,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
421
429
|
// sync token parser (the close offset is cosmetic)
|
|
422
430
|
const end =
|
|
423
431
|
frame_children.length > 0 ? frame_children[frame_children.length - 1]!.end : frame.end!;
|
|
424
|
-
return {type: 'Blockquote', children: frame_children, start: frame.start, end};
|
|
432
|
+
return { type: 'Blockquote', children: frame_children, start: frame.start, end };
|
|
425
433
|
}
|
|
426
434
|
|
|
427
435
|
case 'Table': {
|
|
@@ -429,7 +437,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
429
437
|
// the sync token parser
|
|
430
438
|
const children = frame_children as Array<MdzNodeTableRow>;
|
|
431
439
|
const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
|
|
432
|
-
return {type: 'Table', align: frame.align ?? [], children, start: frame.start, end};
|
|
440
|
+
return { type: 'Table', align: frame.align ?? [], children, start: frame.start, end };
|
|
433
441
|
}
|
|
434
442
|
|
|
435
443
|
case 'TableRow': {
|
|
@@ -439,7 +447,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
439
447
|
header: frame.header ?? false,
|
|
440
448
|
children,
|
|
441
449
|
start: frame.start,
|
|
442
|
-
end: frame.end
|
|
450
|
+
end: frame.end!
|
|
443
451
|
};
|
|
444
452
|
}
|
|
445
453
|
|
|
@@ -448,7 +456,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
448
456
|
type: 'TableCell',
|
|
449
457
|
children: mdz_merge_adjacent_text(frame_children),
|
|
450
458
|
start: frame.start,
|
|
451
|
-
end: frame.end
|
|
459
|
+
end: frame.end!
|
|
452
460
|
};
|
|
453
461
|
|
|
454
462
|
case 'Code': {
|
|
@@ -461,7 +469,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
461
469
|
type: 'Code',
|
|
462
470
|
content,
|
|
463
471
|
start: frame.start,
|
|
464
|
-
end: frame.end
|
|
472
|
+
end: frame.end!
|
|
465
473
|
};
|
|
466
474
|
}
|
|
467
475
|
|
|
@@ -476,7 +484,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
476
484
|
lang: frame.lang ?? null,
|
|
477
485
|
content,
|
|
478
486
|
start: frame.start,
|
|
479
|
-
end: frame.end
|
|
487
|
+
end: frame.end!
|
|
480
488
|
};
|
|
481
489
|
}
|
|
482
490
|
|
|
@@ -484,18 +492,20 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
484
492
|
return {
|
|
485
493
|
type: 'Element',
|
|
486
494
|
name: frame.name ?? '',
|
|
495
|
+
attributes: frame.attributes ?? [],
|
|
487
496
|
children: mdz_merge_adjacent_text(frame_children),
|
|
488
497
|
start: frame.start,
|
|
489
|
-
end: frame.end
|
|
498
|
+
end: frame.end!
|
|
490
499
|
};
|
|
491
500
|
|
|
492
501
|
case 'Component':
|
|
493
502
|
return {
|
|
494
503
|
type: 'Component',
|
|
495
504
|
name: frame.name ?? '',
|
|
505
|
+
attributes: frame.attributes ?? [],
|
|
496
506
|
children: mdz_merge_adjacent_text(frame_children),
|
|
497
507
|
start: frame.start,
|
|
498
|
-
end: frame.end
|
|
508
|
+
end: frame.end!
|
|
499
509
|
};
|
|
500
510
|
|
|
501
511
|
default:
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
* @module
|
|
36
36
|
*/
|
|
37
37
|
|
|
38
|
-
import type {MdzOpcode} from './mdz_opcodes.ts';
|
|
38
|
+
import type { MdzOpcode } from './mdz_opcodes.ts';
|
|
39
39
|
import {
|
|
40
40
|
BACKTICK,
|
|
41
41
|
ASTERISK,
|
|
@@ -61,7 +61,7 @@ import {
|
|
|
61
61
|
mdz_match_blockquote_prefix,
|
|
62
62
|
mdz_blockquote_line_has_content,
|
|
63
63
|
mdz_blockquote_strip_width,
|
|
64
|
-
mdz_remap_segments
|
|
64
|
+
mdz_remap_segments
|
|
65
65
|
} from './mdz_helpers.ts';
|
|
66
66
|
import {
|
|
67
67
|
type MdzStreamParserState,
|
|
@@ -80,7 +80,7 @@ import {
|
|
|
80
80
|
offset,
|
|
81
81
|
pop_stack_entry,
|
|
82
82
|
push_stack_entry,
|
|
83
|
-
revert_failed_close
|
|
83
|
+
revert_failed_close
|
|
84
84
|
} from './mdz_stream_parser_state.ts';
|
|
85
85
|
import {
|
|
86
86
|
process_codeblock,
|
|
@@ -88,23 +88,23 @@ import {
|
|
|
88
88
|
process_codeblock_in_item,
|
|
89
89
|
try_codeblock_open,
|
|
90
90
|
try_heading,
|
|
91
|
-
try_hr
|
|
91
|
+
try_hr
|
|
92
92
|
} from './mdz_stream_parser_block.ts';
|
|
93
|
-
import {process_list_line, try_list_start} from './mdz_stream_parser_list.ts';
|
|
94
|
-
import {close_table, process_table_line, try_table_start} from './mdz_stream_parser_table.ts';
|
|
93
|
+
import { process_list_line, try_list_start } from './mdz_stream_parser_list.ts';
|
|
94
|
+
import { close_table, process_table_line, try_table_start } from './mdz_stream_parser_table.ts';
|
|
95
95
|
import {
|
|
96
96
|
check_close_word_boundary,
|
|
97
97
|
close_delimiter,
|
|
98
98
|
process_code_content,
|
|
99
99
|
try_code,
|
|
100
100
|
try_double_delimiter,
|
|
101
|
-
try_italic
|
|
101
|
+
try_italic
|
|
102
102
|
} from './mdz_stream_parser_inline.ts';
|
|
103
103
|
import {
|
|
104
104
|
try_close_tag,
|
|
105
105
|
try_complete_link,
|
|
106
106
|
try_link_open,
|
|
107
|
-
try_tag_open
|
|
107
|
+
try_tag_open
|
|
108
108
|
} from './mdz_stream_parser_link.ts';
|
|
109
109
|
import {
|
|
110
110
|
complete_pending_url,
|
|
@@ -112,9 +112,9 @@ import {
|
|
|
112
112
|
start_speculative_url,
|
|
113
113
|
try_auto_path_absolute,
|
|
114
114
|
try_auto_path_relative,
|
|
115
|
-
try_auto_url_forced
|
|
115
|
+
try_auto_url_forced
|
|
116
116
|
} from './mdz_stream_parser_url.ts';
|
|
117
|
-
import {consume_delimiter_as_text, consume_text_run} from './mdz_stream_parser_text.ts';
|
|
117
|
+
import { consume_delimiter_as_text, consume_text_run } from './mdz_stream_parser_text.ts';
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
120
|
* Streaming opcode parser for mdz content.
|
|
@@ -277,7 +277,7 @@ const finish_state = (state: MdzStreamParserState): void => {
|
|
|
277
277
|
const open_blockquote = (state: MdzStreamParserState, item_indent: number): void => {
|
|
278
278
|
const id = alloc_id(state);
|
|
279
279
|
const start = offset(state);
|
|
280
|
-
emit(state, {type: 'open', id, node_type: 'Blockquote', start});
|
|
280
|
+
emit(state, { type: 'open', id, node_type: 'Blockquote', start });
|
|
281
281
|
push_stack_entry(state, id, 'Blockquote', start);
|
|
282
282
|
const inner = create_state();
|
|
283
283
|
inner.next_id = state.next_id;
|
|
@@ -285,10 +285,10 @@ const open_blockquote = (state: MdzStreamParserState, item_indent: number): void
|
|
|
285
285
|
state.blockquote = {
|
|
286
286
|
id,
|
|
287
287
|
inner,
|
|
288
|
-
segments: [{inner_start: 0, source_start: offset(state, strip)}],
|
|
288
|
+
segments: [{ inner_start: 0, source_start: offset(state, strip) }],
|
|
289
289
|
inner_len: 0,
|
|
290
290
|
text_inner_ends: new Map(),
|
|
291
|
-
item_indent
|
|
291
|
+
item_indent
|
|
292
292
|
};
|
|
293
293
|
state.pos = strip;
|
|
294
294
|
state.prev_char = SPACE;
|
|
@@ -315,7 +315,7 @@ const forward_inner_opcodes = (state: MdzStreamParserState): void => {
|
|
|
315
315
|
const ops = blockquote.inner.opcodes;
|
|
316
316
|
if (ops.length === 0) return;
|
|
317
317
|
blockquote.inner.opcodes = [];
|
|
318
|
-
const {segments, text_inner_ends} = blockquote;
|
|
318
|
+
const { segments, text_inner_ends } = blockquote;
|
|
319
319
|
for (const op of ops) {
|
|
320
320
|
switch (op.type) {
|
|
321
321
|
case 'open':
|
|
@@ -367,7 +367,7 @@ const finish_blockquote = (state: MdzStreamParserState): void => {
|
|
|
367
367
|
state.next_id = blockquote.inner.next_id;
|
|
368
368
|
state.blockquote = null;
|
|
369
369
|
const entry = pop_stack_entry(state);
|
|
370
|
-
emit(state, {type: 'close', id: entry.id, end: offset(state)});
|
|
370
|
+
emit(state, { type: 'close', id: entry.id, end: offset(state) });
|
|
371
371
|
state.active_text_id = null;
|
|
372
372
|
};
|
|
373
373
|
|
|
@@ -400,7 +400,7 @@ const try_blockquote_start = (state: MdzStreamParserState, forced: boolean): Try
|
|
|
400
400
|
*/
|
|
401
401
|
const process_blockquote = (state: MdzStreamParserState, forced: boolean): boolean => {
|
|
402
402
|
const blockquote = state.blockquote!;
|
|
403
|
-
const {buffer} = state;
|
|
403
|
+
const { buffer } = state;
|
|
404
404
|
// mid-line: feed content through to the line's newline (or buffer end —
|
|
405
405
|
// content streams as it arrives; `pos` is the fed watermark)
|
|
406
406
|
if (state.pos < buffer.length && buffer.charCodeAt(state.pos) !== NEWLINE) {
|
|
@@ -441,7 +441,7 @@ const process_blockquote = (state: MdzStreamParserState, forced: boolean): boole
|
|
|
441
441
|
const strip = first + mdz_blockquote_strip_width(buffer, first);
|
|
442
442
|
blockquote.segments.push({
|
|
443
443
|
inner_start: blockquote.inner_len,
|
|
444
|
-
source_start: offset(state, strip)
|
|
444
|
+
source_start: offset(state, strip)
|
|
445
445
|
});
|
|
446
446
|
state.pos = strip;
|
|
447
447
|
state.column = strip - line_start;
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
MIN_CODEBLOCK_BACKTICKS,
|
|
17
17
|
NEWLINE,
|
|
18
18
|
SPACE,
|
|
19
|
-
is_line_whitespace
|
|
19
|
+
is_line_whitespace
|
|
20
20
|
} from './mdz_helpers.ts';
|
|
21
21
|
import {
|
|
22
22
|
type CodeblockState,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
emit,
|
|
28
28
|
flush_text,
|
|
29
29
|
offset,
|
|
30
|
-
push_stack_entry
|
|
30
|
+
push_stack_entry
|
|
31
31
|
} from './mdz_stream_parser_state.ts';
|
|
32
32
|
|
|
33
33
|
/**
|
|
@@ -81,7 +81,7 @@ export const try_heading = (state: MdzStreamParserState): TryResult => {
|
|
|
81
81
|
id,
|
|
82
82
|
node_type: 'Heading',
|
|
83
83
|
start: heading_start,
|
|
84
|
-
level: hash_count as 1 | 2 | 3 | 4 | 5 | 6
|
|
84
|
+
level: hash_count as 1 | 2 | 3 | 4 | 5 | 6
|
|
85
85
|
});
|
|
86
86
|
push_stack_entry(state, id, 'Heading', heading_start);
|
|
87
87
|
state.in_heading = true;
|
|
@@ -131,7 +131,7 @@ export const try_hr = (state: MdzStreamParserState, forced = false): TryResult =
|
|
|
131
131
|
id,
|
|
132
132
|
node_type: 'Hr',
|
|
133
133
|
start: offset(state, start),
|
|
134
|
-
end: offset(state, i)
|
|
134
|
+
end: offset(state, i)
|
|
135
135
|
});
|
|
136
136
|
// `i` sits at the line's newline, or at the buffer end — in forced mode
|
|
137
137
|
// always the buffer end (a newline would have resolved this line during
|
|
@@ -197,8 +197,8 @@ export const try_codeblock_open = (state: MdzStreamParserState): TryResult => {
|
|
|
197
197
|
|
|
198
198
|
const id = alloc_id(state);
|
|
199
199
|
const cb_start = offset(state, start);
|
|
200
|
-
emit(state, {type: 'open', id, node_type: 'Codeblock', start: cb_start, lang});
|
|
201
|
-
state.codeblock = {id, backtick_count, text_id: null, fence_indent: 0, start: cb_start};
|
|
200
|
+
emit(state, { type: 'open', id, node_type: 'Codeblock', start: cb_start, lang });
|
|
201
|
+
state.codeblock = { id, backtick_count, text_id: null, fence_indent: 0, start: cb_start };
|
|
202
202
|
state.pos = i;
|
|
203
203
|
state.column = 0;
|
|
204
204
|
state.prev_char = NEWLINE;
|
|
@@ -217,10 +217,10 @@ export const emit_codeblock_text = (
|
|
|
217
217
|
state: MdzStreamParserState,
|
|
218
218
|
cb: CodeblockState,
|
|
219
219
|
content: string,
|
|
220
|
-
content_start: number
|
|
220
|
+
content_start: number
|
|
221
221
|
): void => {
|
|
222
222
|
if (cb.text_id !== null) {
|
|
223
|
-
emit(state, {type: 'append_text', id: cb.text_id, content});
|
|
223
|
+
emit(state, { type: 'append_text', id: cb.text_id, content });
|
|
224
224
|
} else {
|
|
225
225
|
const id = alloc_id(state);
|
|
226
226
|
const text_start = offset(state, content_start);
|
|
@@ -230,7 +230,7 @@ export const emit_codeblock_text = (
|
|
|
230
230
|
content,
|
|
231
231
|
text_type: 'Text',
|
|
232
232
|
start: text_start,
|
|
233
|
-
end: text_start + content.length
|
|
233
|
+
end: text_start + content.length
|
|
234
234
|
});
|
|
235
235
|
cb.text_id = id;
|
|
236
236
|
}
|
|
@@ -271,7 +271,7 @@ export const process_codeblock_forced = (state: MdzStreamParserState): void => {
|
|
|
271
271
|
// whose hold retains at most a trailing newline plus a partial
|
|
272
272
|
// fence line. So — like the non-forced path's `fence_match - 1` —
|
|
273
273
|
// the close `end` excludes any line terminator
|
|
274
|
-
emit(state, {type: 'close', id: cb.id, end: offset(state, fence_match)});
|
|
274
|
+
emit(state, { type: 'close', id: cb.id, end: offset(state, fence_match) });
|
|
275
275
|
state.pos = fence_match;
|
|
276
276
|
state.codeblock = null;
|
|
277
277
|
return;
|
|
@@ -325,7 +325,7 @@ export const process_codeblock = (state: MdzStreamParserState): boolean => {
|
|
|
325
325
|
}
|
|
326
326
|
|
|
327
327
|
// codeblock end = position of newline after closing fence (exclusive)
|
|
328
|
-
emit(state, {type: 'close', id: cb.id, end: offset(state, fence_match - 1)});
|
|
328
|
+
emit(state, { type: 'close', id: cb.id, end: offset(state, fence_match - 1) });
|
|
329
329
|
state.pos = fence_match;
|
|
330
330
|
state.codeblock = null;
|
|
331
331
|
state.column = 0;
|
|
@@ -385,7 +385,7 @@ export const process_codeblock = (state: MdzStreamParserState): boolean => {
|
|
|
385
385
|
*/
|
|
386
386
|
export const process_codeblock_in_item = (
|
|
387
387
|
state: MdzStreamParserState,
|
|
388
|
-
forced: boolean
|
|
388
|
+
forced: boolean
|
|
389
389
|
): boolean => {
|
|
390
390
|
const cb = state.codeblock!;
|
|
391
391
|
while (state.pos < state.buffer.length) {
|
|
@@ -416,7 +416,7 @@ export const process_codeblock_in_item = (
|
|
|
416
416
|
}
|
|
417
417
|
if (m >= state.buffer.length && !forced) return false; // trailing content could disqualify
|
|
418
418
|
if (m >= state.buffer.length || state.buffer.charCodeAt(m) === NEWLINE) {
|
|
419
|
-
emit(state, {type: 'close', id: cb.id, end: offset(state, m)});
|
|
419
|
+
emit(state, { type: 'close', id: cb.id, end: offset(state, m) });
|
|
420
420
|
state.codeblock = null;
|
|
421
421
|
state.pos = m; // at the closer's newline (or EOF)
|
|
422
422
|
state.column = m - line_start;
|
|
@@ -454,7 +454,7 @@ export const process_codeblock_in_item = (
|
|
|
454
454
|
export const match_codeblock_close = (
|
|
455
455
|
state: MdzStreamParserState,
|
|
456
456
|
backtick_count: number,
|
|
457
|
-
forced: boolean = false
|
|
457
|
+
forced: boolean = false
|
|
458
458
|
): number => {
|
|
459
459
|
let i = state.pos;
|
|
460
460
|
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
is_line_whitespace,
|
|
14
14
|
is_word_char,
|
|
15
15
|
mdz_blockquote_line_has_content,
|
|
16
|
-
mdz_match_blockquote_prefix
|
|
16
|
+
mdz_match_blockquote_prefix
|
|
17
17
|
} from './mdz_helpers.ts';
|
|
18
18
|
import {
|
|
19
19
|
type MdzStreamParserState,
|
|
@@ -27,10 +27,10 @@ import {
|
|
|
27
27
|
offset,
|
|
28
28
|
pop_stack_entry,
|
|
29
29
|
push_stack_entry,
|
|
30
|
-
revert_above
|
|
30
|
+
revert_above
|
|
31
31
|
} from './mdz_stream_parser_state.ts';
|
|
32
|
-
import {match_fence_opener, match_list_marker} from './mdz_stream_parser_list.ts';
|
|
33
|
-
import {consume_delimiter_as_text} from './mdz_stream_parser_text.ts';
|
|
32
|
+
import { match_fence_opener, match_list_marker } from './mdz_stream_parser_list.ts';
|
|
33
|
+
import { consume_delimiter_as_text } from './mdz_stream_parser_text.ts';
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Whether `buffer` contains a paragraph break — a newline followed (across
|
|
@@ -78,9 +78,9 @@ const has_run_boundary_between = (
|
|
|
78
78
|
state: MdzStreamParserState,
|
|
79
79
|
from: number,
|
|
80
80
|
to: number,
|
|
81
|
-
forced: boolean
|
|
81
|
+
forced: boolean
|
|
82
82
|
): boolean => {
|
|
83
|
-
const {buffer} = state;
|
|
83
|
+
const { buffer } = state;
|
|
84
84
|
if (state.list_levels.length === 0) {
|
|
85
85
|
return has_paragraph_break_between(buffer, from, to);
|
|
86
86
|
}
|
|
@@ -149,7 +149,7 @@ export const try_double_delimiter = (
|
|
|
149
149
|
state: MdzStreamParserState,
|
|
150
150
|
delimiter: '**' | '~~',
|
|
151
151
|
node_type: 'Bold' | 'Strikethrough',
|
|
152
|
-
forced = false
|
|
152
|
+
forced = false
|
|
153
153
|
): boolean => {
|
|
154
154
|
// we know we're at the doubled delimiter (the caller checked both chars)
|
|
155
155
|
// and there's no matching open container
|
|
@@ -170,7 +170,7 @@ export const try_double_delimiter = (
|
|
|
170
170
|
|
|
171
171
|
const id = alloc_id(state);
|
|
172
172
|
const start = offset(state);
|
|
173
|
-
emit(state, {type: 'open', id, node_type, start});
|
|
173
|
+
emit(state, { type: 'open', id, node_type, start });
|
|
174
174
|
push_stack_entry(state, id, node_type, start, delimiter);
|
|
175
175
|
state.active_text_id = null;
|
|
176
176
|
state.pos += 2;
|
|
@@ -221,7 +221,7 @@ export const try_italic = (state: MdzStreamParserState, forced = false): boolean
|
|
|
221
221
|
|
|
222
222
|
const id = alloc_id(state);
|
|
223
223
|
const start = offset(state);
|
|
224
|
-
emit(state, {type: 'open', id, node_type: 'Italic', start});
|
|
224
|
+
emit(state, { type: 'open', id, node_type: 'Italic', start });
|
|
225
225
|
push_stack_entry(state, id, 'Italic', start, '_');
|
|
226
226
|
state.active_text_id = null;
|
|
227
227
|
state.pos++;
|
|
@@ -267,18 +267,18 @@ export const close_delimiter = (state: MdzStreamParserState, stack_idx: number):
|
|
|
267
267
|
// revert anything between the container and the top of the stack
|
|
268
268
|
revert_above(state, stack_idx);
|
|
269
269
|
const entry = pop_stack_entry(state);
|
|
270
|
-
const {delimiter} = entry;
|
|
270
|
+
const { delimiter } = entry;
|
|
271
271
|
// check for empty container — revert to literal text instead of closing
|
|
272
272
|
if (!entry.has_children) {
|
|
273
273
|
emit(state, {
|
|
274
274
|
type: 'revert',
|
|
275
275
|
id: entry.id,
|
|
276
276
|
replacement_text: delimiter,
|
|
277
|
-
start: entry.start
|
|
277
|
+
start: entry.start
|
|
278
278
|
});
|
|
279
279
|
accumulate_text(state, delimiter, offset(state));
|
|
280
280
|
} else {
|
|
281
|
-
emit(state, {type: 'close', id: entry.id, end: offset(state) + delimiter.length});
|
|
281
|
+
emit(state, { type: 'close', id: entry.id, end: offset(state) + delimiter.length });
|
|
282
282
|
}
|
|
283
283
|
state.active_text_id = null;
|
|
284
284
|
state.pos += delimiter.length;
|
|
@@ -312,7 +312,7 @@ export const close_delimiter = (state: MdzStreamParserState, stack_idx: number):
|
|
|
312
312
|
*/
|
|
313
313
|
export const scan_closer_boundary = (
|
|
314
314
|
state: MdzStreamParserState,
|
|
315
|
-
forced = false
|
|
315
|
+
forced = false
|
|
316
316
|
): 'confirmed' | 'rejected' | 'pending' => {
|
|
317
317
|
const search_start = state.pos + 1;
|
|
318
318
|
const buffer = state.buffer;
|
|
@@ -371,7 +371,7 @@ export const try_code = (state: MdzStreamParserState, forced = false): boolean =
|
|
|
371
371
|
content,
|
|
372
372
|
text_type: 'Code',
|
|
373
373
|
start: offset(state, start),
|
|
374
|
-
end: offset(state, terminator + 1)
|
|
374
|
+
end: offset(state, terminator + 1)
|
|
375
375
|
});
|
|
376
376
|
state.active_text_id = null;
|
|
377
377
|
state.pos = terminator + 1;
|
|
@@ -417,7 +417,7 @@ export const try_code = (state: MdzStreamParserState, forced = false): boolean =
|
|
|
417
417
|
ensure_paragraph(state);
|
|
418
418
|
const id = alloc_id(state);
|
|
419
419
|
const code_start = offset(state, start);
|
|
420
|
-
emit(state, {type: 'open', id, node_type: 'Code', start: code_start});
|
|
420
|
+
emit(state, { type: 'open', id, node_type: 'Code', start: code_start });
|
|
421
421
|
push_stack_entry(state, id, 'Code', code_start, '`');
|
|
422
422
|
state.in_code = true;
|
|
423
423
|
state.active_text_id = null;
|
|
@@ -493,10 +493,10 @@ export const process_code_content = (state: MdzStreamParserState): void => {
|
|
|
493
493
|
const entry = pop_stack_entry(state);
|
|
494
494
|
if (!entry.has_children) {
|
|
495
495
|
// empty code `` — revert opener, accumulate closer as text
|
|
496
|
-
emit(state, {type: 'revert', id: entry.id, replacement_text: '`', start: entry.start});
|
|
496
|
+
emit(state, { type: 'revert', id: entry.id, replacement_text: '`', start: entry.start });
|
|
497
497
|
accumulate_text(state, '`', offset(state));
|
|
498
498
|
} else {
|
|
499
|
-
emit(state, {type: 'close', id: entry.id, end: offset(state) + 1});
|
|
499
|
+
emit(state, { type: 'close', id: entry.id, end: offset(state) + 1 });
|
|
500
500
|
}
|
|
501
501
|
state.in_code = false;
|
|
502
502
|
state.active_text_id = null;
|
|
@@ -510,7 +510,7 @@ export const process_code_content = (state: MdzStreamParserState): void => {
|
|
|
510
510
|
// code spans can't cross lines — revert
|
|
511
511
|
flush_text(state);
|
|
512
512
|
const entry = pop_stack_entry(state);
|
|
513
|
-
emit(state, {type: 'revert', id: entry.id, replacement_text: '`', start: entry.start});
|
|
513
|
+
emit(state, { type: 'revert', id: entry.id, replacement_text: '`', start: entry.start });
|
|
514
514
|
state.in_code = false;
|
|
515
515
|
state.active_text_id = null;
|
|
516
516
|
// don't consume newline — outer loop handles it
|