@fuzdev/mdz 0.3.0 → 0.4.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/README.md +4 -0
- package/dist/Mdz.svelte +8 -7
- package/dist/Mdz.svelte.d.ts.map +1 -1
- package/dist/MdzNodeView.svelte +20 -12
- 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 +21 -13
- 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_contexts.d.ts.map +1 -1
- package/dist/mdz_debug_work.d.ts.map +1 -1
- package/dist/mdz_helpers.d.ts.map +1 -1
- package/dist/mdz_helpers.js +2 -2
- package/dist/mdz_lexer.d.ts.map +1 -1
- package/dist/mdz_lexer.js +27 -17
- 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 +22 -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.js +3 -3
- 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 +8 -8
- 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.map +1 -1
- package/dist/mdz_to_svelte.d.ts +1 -1
- package/dist/mdz_to_svelte.d.ts.map +1 -1
- package/dist/mdz_token_parser.js +9 -9
- package/dist/svelte_preprocess_mdz.d.ts +2 -2
- package/dist/svelte_preprocess_mdz.d.ts.map +1 -1
- package/dist/svelte_preprocess_mdz.js +11 -11
- package/package.json +24 -39
- package/src/lib/context_helpers.ts +2 -2
- package/src/lib/mdz.ts +2 -2
- package/src/lib/mdz_contexts.ts +5 -5
- package/src/lib/mdz_debug_work.ts +1 -1
- package/src/lib/mdz_helpers.ts +39 -33
- package/src/lib/mdz_lexer.ts +77 -67
- package/src/lib/mdz_opcodes.ts +1 -1
- package/src/lib/mdz_opcodes_to_nodes.ts +35 -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 +13 -13
- 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 +31 -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 +8 -8
- package/src/lib/mdz_to_svelte.ts +16 -16
- package/src/lib/mdz_token_parser.ts +38 -38
- package/src/lib/svelte_preprocess_mdz.ts +62 -58
- package/src/lib/tsdoc_mdz.ts +1 -1
|
@@ -17,7 +17,7 @@
|
|
|
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
23
|
MdzNode,
|
|
@@ -28,10 +28,10 @@ import type {
|
|
|
28
28
|
MdzNodeListItem,
|
|
29
29
|
MdzNodeTableRow,
|
|
30
30
|
MdzNodeTableCell,
|
|
31
|
-
MdzTableAlign
|
|
31
|
+
MdzTableAlign
|
|
32
32
|
} 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';
|
|
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';
|
|
35
35
|
|
|
36
36
|
interface StackFrame {
|
|
37
37
|
id: MdzNodeId;
|
|
@@ -82,7 +82,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
82
82
|
start_number: op.start_number,
|
|
83
83
|
number: op.number,
|
|
84
84
|
align: op.align,
|
|
85
|
-
header: op.header
|
|
85
|
+
header: op.header
|
|
86
86
|
});
|
|
87
87
|
break;
|
|
88
88
|
}
|
|
@@ -115,8 +115,8 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
115
115
|
case 'text': {
|
|
116
116
|
const node: MdzNodeText | MdzNodeCode =
|
|
117
117
|
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};
|
|
118
|
+
? { type: 'Code', content: op.content, start: op.start, end: op.end }
|
|
119
|
+
: { type: 'Text', content: op.content, start: op.start, end: op.end };
|
|
120
120
|
text_nodes.set(op.id, node);
|
|
121
121
|
children.push(node);
|
|
122
122
|
break;
|
|
@@ -160,7 +160,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
case 'void': {
|
|
163
|
-
children.push({type: 'Hr', start: op.start, end: op.end});
|
|
163
|
+
children.push({ type: 'Hr', start: op.start, end: op.end });
|
|
164
164
|
break;
|
|
165
165
|
}
|
|
166
166
|
|
|
@@ -224,7 +224,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
224
224
|
type: 'Text',
|
|
225
225
|
content: trimmed_content,
|
|
226
226
|
start: text_node.end,
|
|
227
|
-
end: text_node.end + trimmed_content.length
|
|
227
|
+
end: text_node.end + trimmed_content.length
|
|
228
228
|
};
|
|
229
229
|
text_nodes.set(op.trim_id, trimmed_node);
|
|
230
230
|
}
|
|
@@ -236,7 +236,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
|
|
|
236
236
|
children: [text_node],
|
|
237
237
|
link_type: op.link_type,
|
|
238
238
|
start: op.start,
|
|
239
|
-
end: op.end
|
|
239
|
+
end: op.end
|
|
240
240
|
};
|
|
241
241
|
|
|
242
242
|
// replace text node with [Link, trimmed?] in the buffer
|
|
@@ -278,7 +278,7 @@ const insert_replacement = (
|
|
|
278
278
|
stack: Array<StackFrame>,
|
|
279
279
|
reverted_idx: number,
|
|
280
280
|
at: number,
|
|
281
|
-
op: {replacement_text?: string; start: number}
|
|
281
|
+
op: { replacement_text?: string; start: number }
|
|
282
282
|
): void => {
|
|
283
283
|
const text = op.replacement_text!;
|
|
284
284
|
const parent_start = reverted_idx > 0 ? stack[reverted_idx - 1]!.children_start : 0;
|
|
@@ -303,7 +303,12 @@ const insert_replacement = (
|
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
305
|
// 3. standalone Text node
|
|
306
|
-
const node: MdzNode = {
|
|
306
|
+
const node: MdzNode = {
|
|
307
|
+
type: 'Text',
|
|
308
|
+
content: text,
|
|
309
|
+
start: op.start,
|
|
310
|
+
end: op.start + text.length
|
|
311
|
+
};
|
|
307
312
|
if (at >= children.length) {
|
|
308
313
|
children.push(node);
|
|
309
314
|
} else {
|
|
@@ -337,7 +342,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
337
342
|
type: 'Paragraph',
|
|
338
343
|
children,
|
|
339
344
|
start: children[0]!.start,
|
|
340
|
-
end: children[children.length - 1]!.end
|
|
345
|
+
end: children[children.length - 1]!.end
|
|
341
346
|
};
|
|
342
347
|
}
|
|
343
348
|
|
|
@@ -350,7 +355,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
350
355
|
id,
|
|
351
356
|
children,
|
|
352
357
|
start: frame.start,
|
|
353
|
-
end: frame.end
|
|
358
|
+
end: frame.end!
|
|
354
359
|
} as MdzNodeHeading;
|
|
355
360
|
}
|
|
356
361
|
|
|
@@ -359,7 +364,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
359
364
|
type: 'Bold',
|
|
360
365
|
children: mdz_merge_adjacent_text(frame_children),
|
|
361
366
|
start: frame.start,
|
|
362
|
-
end: frame.end
|
|
367
|
+
end: frame.end!
|
|
363
368
|
};
|
|
364
369
|
|
|
365
370
|
case 'Italic':
|
|
@@ -367,7 +372,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
367
372
|
type: 'Italic',
|
|
368
373
|
children: mdz_merge_adjacent_text(frame_children),
|
|
369
374
|
start: frame.start,
|
|
370
|
-
end: frame.end
|
|
375
|
+
end: frame.end!
|
|
371
376
|
};
|
|
372
377
|
|
|
373
378
|
case 'Strikethrough':
|
|
@@ -375,7 +380,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
375
380
|
type: 'Strikethrough',
|
|
376
381
|
children: mdz_merge_adjacent_text(frame_children),
|
|
377
382
|
start: frame.start,
|
|
378
|
-
end: frame.end
|
|
383
|
+
end: frame.end!
|
|
379
384
|
};
|
|
380
385
|
|
|
381
386
|
case 'Link':
|
|
@@ -385,7 +390,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
385
390
|
children: mdz_merge_adjacent_text(frame_children),
|
|
386
391
|
link_type: frame.link_type ?? 'internal',
|
|
387
392
|
start: frame.start,
|
|
388
|
-
end: frame.end
|
|
393
|
+
end: frame.end!
|
|
389
394
|
};
|
|
390
395
|
|
|
391
396
|
case 'List': {
|
|
@@ -400,10 +405,10 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
400
405
|
start_number: frame.start_number ?? 1,
|
|
401
406
|
children,
|
|
402
407
|
start: frame.start,
|
|
403
|
-
end
|
|
408
|
+
end
|
|
404
409
|
};
|
|
405
410
|
}
|
|
406
|
-
return {type: 'List', ordered: false, children, start: frame.start, end};
|
|
411
|
+
return { type: 'List', ordered: false, children, start: frame.start, end };
|
|
407
412
|
}
|
|
408
413
|
|
|
409
414
|
case 'ListItem': {
|
|
@@ -411,9 +416,9 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
411
416
|
// childless means an empty item — its close carried the marker end
|
|
412
417
|
const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
|
|
413
418
|
if (frame.number !== undefined) {
|
|
414
|
-
return {type: 'ListItem', number: frame.number, children, start: frame.start, end};
|
|
419
|
+
return { type: 'ListItem', number: frame.number, children, start: frame.start, end };
|
|
415
420
|
}
|
|
416
|
-
return {type: 'ListItem', children, start: frame.start, end};
|
|
421
|
+
return { type: 'ListItem', children, start: frame.start, end };
|
|
417
422
|
}
|
|
418
423
|
|
|
419
424
|
case 'Blockquote': {
|
|
@@ -421,7 +426,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
421
426
|
// sync token parser (the close offset is cosmetic)
|
|
422
427
|
const end =
|
|
423
428
|
frame_children.length > 0 ? frame_children[frame_children.length - 1]!.end : frame.end!;
|
|
424
|
-
return {type: 'Blockquote', children: frame_children, start: frame.start, end};
|
|
429
|
+
return { type: 'Blockquote', children: frame_children, start: frame.start, end };
|
|
425
430
|
}
|
|
426
431
|
|
|
427
432
|
case 'Table': {
|
|
@@ -429,7 +434,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
429
434
|
// the sync token parser
|
|
430
435
|
const children = frame_children as Array<MdzNodeTableRow>;
|
|
431
436
|
const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
|
|
432
|
-
return {type: 'Table', align: frame.align ?? [], children, start: frame.start, end};
|
|
437
|
+
return { type: 'Table', align: frame.align ?? [], children, start: frame.start, end };
|
|
433
438
|
}
|
|
434
439
|
|
|
435
440
|
case 'TableRow': {
|
|
@@ -439,7 +444,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
439
444
|
header: frame.header ?? false,
|
|
440
445
|
children,
|
|
441
446
|
start: frame.start,
|
|
442
|
-
end: frame.end
|
|
447
|
+
end: frame.end!
|
|
443
448
|
};
|
|
444
449
|
}
|
|
445
450
|
|
|
@@ -448,7 +453,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
448
453
|
type: 'TableCell',
|
|
449
454
|
children: mdz_merge_adjacent_text(frame_children),
|
|
450
455
|
start: frame.start,
|
|
451
|
-
end: frame.end
|
|
456
|
+
end: frame.end!
|
|
452
457
|
};
|
|
453
458
|
|
|
454
459
|
case 'Code': {
|
|
@@ -461,7 +466,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
461
466
|
type: 'Code',
|
|
462
467
|
content,
|
|
463
468
|
start: frame.start,
|
|
464
|
-
end: frame.end
|
|
469
|
+
end: frame.end!
|
|
465
470
|
};
|
|
466
471
|
}
|
|
467
472
|
|
|
@@ -476,7 +481,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
476
481
|
lang: frame.lang ?? null,
|
|
477
482
|
content,
|
|
478
483
|
start: frame.start,
|
|
479
|
-
end: frame.end
|
|
484
|
+
end: frame.end!
|
|
480
485
|
};
|
|
481
486
|
}
|
|
482
487
|
|
|
@@ -486,7 +491,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
486
491
|
name: frame.name ?? '',
|
|
487
492
|
children: mdz_merge_adjacent_text(frame_children),
|
|
488
493
|
start: frame.start,
|
|
489
|
-
end: frame.end
|
|
494
|
+
end: frame.end!
|
|
490
495
|
};
|
|
491
496
|
|
|
492
497
|
case 'Component':
|
|
@@ -495,7 +500,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
|
|
|
495
500
|
name: frame.name ?? '',
|
|
496
501
|
children: mdz_merge_adjacent_text(frame_children),
|
|
497
502
|
start: frame.start,
|
|
498
|
-
end: frame.end
|
|
503
|
+
end: frame.end!
|
|
499
504
|
};
|
|
500
505
|
|
|
501
506
|
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
|