@fuzdev/mdz 0.9.0 → 0.10.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/dist/Mdz.svelte +37 -1
- package/dist/Mdz.svelte.d.ts +35 -0
- package/dist/Mdz.svelte.d.ts.map +1 -1
- package/dist/MdzNodeView.svelte +143 -27
- package/dist/MdzNodeView.svelte.d.ts +13 -1
- package/dist/MdzNodeView.svelte.d.ts.map +1 -1
- package/dist/MdzPrecompiled.svelte.d.ts.map +1 -1
- package/dist/MdzRoot.svelte.d.ts.map +1 -1
- package/dist/MdzStream.svelte.d.ts.map +1 -1
- package/dist/MdzStreamNodeView.svelte.d.ts.map +1 -1
- package/dist/context_helpers.d.ts.map +1 -1
- package/dist/mdz.d.ts +4 -1
- package/dist/mdz.d.ts.map +1 -1
- package/dist/mdz.js +4 -1
- package/dist/mdz_contexts.d.ts +14 -2
- 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 +57 -7
- package/dist/mdz_helpers.d.ts.map +1 -1
- package/dist/mdz_helpers.js +113 -50
- package/dist/mdz_lexer.d.ts.map +1 -1
- package/dist/mdz_lexer.js +21 -17
- package/dist/mdz_opcodes.d.ts.map +1 -1
- package/dist/mdz_opcodes_to_nodes.d.ts.map +1 -1
- package/dist/mdz_stream_parser.d.ts +16 -3
- package/dist/mdz_stream_parser.d.ts.map +1 -1
- package/dist/mdz_stream_parser.js +16 -3
- package/dist/mdz_stream_parser_block.d.ts +2 -2
- package/dist/mdz_stream_parser_block.d.ts.map +1 -1
- package/dist/mdz_stream_parser_block.js +2 -2
- package/dist/mdz_stream_parser_inline.d.ts.map +1 -1
- 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_list.d.ts.map +1 -1
- package/dist/mdz_stream_parser_state.d.ts +32 -12
- package/dist/mdz_stream_parser_state.d.ts.map +1 -1
- package/dist/mdz_stream_parser_state.js +21 -14
- package/dist/mdz_stream_parser_table.d.ts.map +1 -1
- package/dist/mdz_stream_parser_text.d.ts.map +1 -1
- package/dist/mdz_stream_parser_text.js +7 -4
- package/dist/mdz_stream_parser_url.d.ts +3 -2
- package/dist/mdz_stream_parser_url.d.ts.map +1 -1
- package/dist/mdz_stream_parser_url.js +114 -42
- package/dist/mdz_stream_state.svelte.d.ts.map +1 -1
- package/dist/mdz_to_svelte.d.ts.map +1 -1
- package/dist/mdz_token_parser.d.ts.map +1 -1
- package/dist/svelte_preprocess_mdz.d.ts.map +1 -1
- package/dist/svelte_preprocess_mdz.js +8 -0
- package/dist/tsdoc_mdz.d.ts +8 -4
- package/dist/tsdoc_mdz.d.ts.map +1 -1
- package/dist/tsdoc_mdz.js +14 -4
- package/package.json +5 -5
- package/src/lib/mdz.ts +4 -1
- package/src/lib/mdz_contexts.ts +20 -2
- package/src/lib/mdz_helpers.ts +117 -49
- package/src/lib/mdz_lexer.ts +31 -14
- package/src/lib/mdz_stream_parser.ts +16 -3
- package/src/lib/mdz_stream_parser_block.ts +2 -2
- package/src/lib/mdz_stream_parser_inline.ts +4 -4
- package/src/lib/mdz_stream_parser_state.ts +34 -13
- package/src/lib/mdz_stream_parser_text.ts +13 -6
- package/src/lib/mdz_stream_parser_url.ts +130 -49
- package/src/lib/svelte_preprocess_mdz.ts +8 -0
- package/src/lib/tsdoc_mdz.ts +15 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_helpers.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_helpers.d.ts","sourceRoot":"","sources":["../src/lib/mdz_helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/mdz_helpers.js
CHANGED
|
@@ -466,6 +466,16 @@ export const is_tag_name_char = (char_code) => is_letter(char_code) ||
|
|
|
466
466
|
export const is_word_char = (char_code) => (char_code >= A_UPPER && char_code <= Z_UPPER) ||
|
|
467
467
|
(char_code >= A_LOWER && char_code <= Z_LOWER) ||
|
|
468
468
|
(char_code >= ZERO && char_code <= NINE);
|
|
469
|
+
/**
|
|
470
|
+
* Whether a char next to an italic `_` blocks it from opening (the char
|
|
471
|
+
* before) or closing (the char after): a word char, or `_` itself — italic is
|
|
472
|
+
* self-opaque, so runs like `__init__` never pair. The one italic boundary
|
|
473
|
+
* predicate, shared by the lexer, the streaming parser, and the streaming
|
|
474
|
+
* auto-link span resolution.
|
|
475
|
+
*
|
|
476
|
+
* @nodocs
|
|
477
|
+
*/
|
|
478
|
+
export const is_italic_boundary_blocker = (char_code) => is_word_char(char_code) || char_code === UNDERSCORE;
|
|
469
479
|
/**
|
|
470
480
|
* Lookup table for valid URI path characters per RFC 3986.
|
|
471
481
|
* Replaces a 16-comparison chain with a single array access.
|
|
@@ -524,7 +534,7 @@ export const TEXT_CLASS_STOP = 1;
|
|
|
524
534
|
export const TEXT_CLASS_NEWLINE = 2;
|
|
525
535
|
/** `h`/`H` — potential URL scheme start, needs the prefix probe. @nodocs */
|
|
526
536
|
export const TEXT_CLASS_URL = 4;
|
|
527
|
-
/** `/` and `.` — potential path start, needs the
|
|
537
|
+
/** `/` and `.` — potential path start, needs the `is_path_boundary` probe. @nodocs */
|
|
528
538
|
export const TEXT_CLASS_PATH = 8;
|
|
529
539
|
/** `\` — a literal-pipe escape candidate inside table cells only. @nodocs */
|
|
530
540
|
export const TEXT_CLASS_BACKSLASH = 16;
|
|
@@ -546,10 +556,21 @@ export const TEXT_SCAN_CLASS = (() => {
|
|
|
546
556
|
t[BACKSLASH] = TEXT_CLASS_BACKSLASH;
|
|
547
557
|
return t;
|
|
548
558
|
})();
|
|
559
|
+
// trailing chars that never end a URL/path reference
|
|
560
|
+
const is_trailing_punctuation = (char_code) => char_code === PERIOD ||
|
|
561
|
+
char_code === COMMA ||
|
|
562
|
+
char_code === SEMICOLON ||
|
|
563
|
+
char_code === COLON ||
|
|
564
|
+
char_code === EXCLAMATION ||
|
|
565
|
+
char_code === QUESTION ||
|
|
566
|
+
char_code === RIGHT_BRACKET;
|
|
549
567
|
/**
|
|
550
|
-
* Trim trailing
|
|
551
|
-
*
|
|
552
|
-
*
|
|
568
|
+
* Trim the trailing characters a URL/path scan consumed that read as
|
|
569
|
+
* surrounding prose rather than the reference, per GFM's autolink
|
|
570
|
+
* conventions, repeated until nothing more trims:
|
|
571
|
+
* - trailing punctuation `.,;:!?]`
|
|
572
|
+
* - an unbalanced trailing `)` (parens are valid in path components, so a
|
|
573
|
+
* balanced `(…)` stays)
|
|
553
574
|
*
|
|
554
575
|
* Note on `]`: the mdz parsers (`mdz.ts`, `mdz_stream_parser_url.ts`,
|
|
555
576
|
* `mdz_lexer.ts`) scan URL/path chars through `is_valid_path_char`, which
|
|
@@ -557,56 +578,101 @@ export const TEXT_SCAN_CLASS = (() => {
|
|
|
557
578
|
* The `]` branch here is for external callers using this helper directly on
|
|
558
579
|
* arbitrary URL-ish input as part of the published `@fuzdev/mdz` surface.
|
|
559
580
|
*
|
|
560
|
-
*
|
|
581
|
+
* Tracks the end index and slices once, avoiding O(n²) string slicing.
|
|
561
582
|
*/
|
|
562
583
|
export const mdz_trim_url_punctuation = (url) => {
|
|
563
584
|
let end = url.length;
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
last_char === QUESTION ||
|
|
572
|
-
last_char === RIGHT_BRACKET) {
|
|
585
|
+
// paren counts over the untrimmed prefix — counted once, on the first
|
|
586
|
+
// trailing `)`; the chars trimmed after that hold no parens except the
|
|
587
|
+
// trimmed `)` themselves, which decrement `close_count`
|
|
588
|
+
let open_count = -1;
|
|
589
|
+
let close_count = 0;
|
|
590
|
+
for (;;) {
|
|
591
|
+
while (end > 0 && is_trailing_punctuation(url.charCodeAt(end - 1)))
|
|
573
592
|
end--;
|
|
574
|
-
|
|
575
|
-
else {
|
|
593
|
+
if (end === 0 || url.charCodeAt(end - 1) !== RIGHT_PAREN)
|
|
576
594
|
break;
|
|
595
|
+
if (open_count === -1) {
|
|
596
|
+
open_count = 0;
|
|
597
|
+
for (let i = 0; i < end; i++) {
|
|
598
|
+
const char = url.charCodeAt(i);
|
|
599
|
+
if (char === LEFT_PAREN)
|
|
600
|
+
open_count++;
|
|
601
|
+
else if (char === RIGHT_PAREN)
|
|
602
|
+
close_count++;
|
|
603
|
+
}
|
|
577
604
|
}
|
|
605
|
+
if (close_count <= open_count)
|
|
606
|
+
break; // balanced — the `)` belongs to the reference
|
|
607
|
+
end--;
|
|
608
|
+
close_count--;
|
|
578
609
|
}
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
610
|
+
return end === url.length ? url : url.slice(0, end);
|
|
611
|
+
};
|
|
612
|
+
/**
|
|
613
|
+
* End of the URI-char run starting at `start` — where an auto-link scan
|
|
614
|
+
* stops, before any trailing trim. A path opened by `(` (`paren_opened`,
|
|
615
|
+
* see `is_path_boundary`) also ends before the `)` that matches that opener:
|
|
616
|
+
* a `(` inside the path raises the depth, so `(./Foo_(bar))` scans
|
|
617
|
+
* `./Foo_(bar)`.
|
|
618
|
+
*
|
|
619
|
+
* @nodocs
|
|
620
|
+
*/
|
|
621
|
+
export const scan_uri_chars_end = (text, start, paren_opened) => {
|
|
622
|
+
let i = start;
|
|
623
|
+
let depth = 0;
|
|
624
|
+
while (i < text.length) {
|
|
625
|
+
const c = text.charCodeAt(i);
|
|
626
|
+
if (!is_valid_path_char(c))
|
|
627
|
+
break;
|
|
628
|
+
if (paren_opened) {
|
|
629
|
+
if (c === LEFT_PAREN)
|
|
630
|
+
depth++;
|
|
631
|
+
else if (c === RIGHT_PAREN) {
|
|
632
|
+
if (depth === 0)
|
|
633
|
+
break;
|
|
634
|
+
depth--;
|
|
601
635
|
}
|
|
602
636
|
}
|
|
637
|
+
i++;
|
|
603
638
|
}
|
|
604
|
-
|
|
605
|
-
return end === url.length ? url : url.slice(0, end);
|
|
639
|
+
return i;
|
|
606
640
|
};
|
|
641
|
+
/**
|
|
642
|
+
* Whether an internal path reference is only its prefix (`/`, `./`, `../`)
|
|
643
|
+
* with nothing after it — such a reference never links, since a path is its
|
|
644
|
+
* prefix plus at least one URI char.
|
|
645
|
+
*
|
|
646
|
+
* @nodocs
|
|
647
|
+
*/
|
|
648
|
+
export const is_bare_path_prefix = (reference) => reference === '/' || reference === './' || reference === '../';
|
|
649
|
+
// the char code `distance` chars before `index`, or `-1` past the start of input
|
|
650
|
+
const char_code_before = (text, index, distance) => index >= distance ? text.charCodeAt(index - distance) : -1;
|
|
651
|
+
/**
|
|
652
|
+
* Whether an auto-detected path (`/…`, `./…`, `../…`) may start after the
|
|
653
|
+
* given characters: at the start of input, after a space, tab, or newline, or
|
|
654
|
+
* after an opening `(` that is itself neither glued to a word char nor the
|
|
655
|
+
* `](` of markdown link syntax. The paren case covers parenthesized
|
|
656
|
+
* references like `(./foo.md)` and `(see /docs)` — a path opened by `(` ends
|
|
657
|
+
* at its matching `)` (`scan_uri_chars_end`), and an unbalanced `)` after a
|
|
658
|
+
* whitespace-opened path is trimmed by `mdz_trim_url_punctuation` — while
|
|
659
|
+
* call-shaped `foo(./bar)` and a failed link's `[text](./foo bar)` stay
|
|
660
|
+
* literal. Every other preceding character (word chars, `[`, `{`, quotes,
|
|
661
|
+
* `*`, `_`, `~`, `/`, `.`) keeps a following path literal.
|
|
662
|
+
*
|
|
663
|
+
* @param prev - the char code directly before the path, or `-1` at the start of input
|
|
664
|
+
* @param before_prev - the char code before `prev`, or `-1` at the start of input
|
|
665
|
+
* @nodocs
|
|
666
|
+
*/
|
|
667
|
+
export const is_path_boundary = (prev, before_prev) => prev === -1 ||
|
|
668
|
+
prev === SPACE ||
|
|
669
|
+
prev === NEWLINE ||
|
|
670
|
+
prev === TAB ||
|
|
671
|
+
(prev === LEFT_PAREN && before_prev !== RIGHT_BRACKET && !is_word_char(before_prev));
|
|
607
672
|
/**
|
|
608
673
|
* Check if position in text is the start of an absolute path (starts with `/`).
|
|
609
|
-
* Must
|
|
674
|
+
* Must sit at a path boundary (see `is_path_boundary`): start of input,
|
|
675
|
+
* whitespace, or a `(` not glued to a word or a `]`.
|
|
610
676
|
* Rejects `//` (comments/protocol-relative) and slash followed by whitespace.
|
|
611
677
|
*
|
|
612
678
|
* @nodocs
|
|
@@ -614,10 +680,8 @@ export const mdz_trim_url_punctuation = (url) => {
|
|
|
614
680
|
export const is_at_absolute_path = (text, index) => {
|
|
615
681
|
if (text.charCodeAt(index) !== SLASH)
|
|
616
682
|
return false;
|
|
617
|
-
if (index
|
|
618
|
-
|
|
619
|
-
if (prev_char !== SPACE && prev_char !== NEWLINE && prev_char !== TAB)
|
|
620
|
-
return false;
|
|
683
|
+
if (!is_path_boundary(char_code_before(text, index, 1), char_code_before(text, index, 2))) {
|
|
684
|
+
return false;
|
|
621
685
|
}
|
|
622
686
|
if (index + 1 >= text.length)
|
|
623
687
|
return false;
|
|
@@ -626,7 +690,8 @@ export const is_at_absolute_path = (text, index) => {
|
|
|
626
690
|
};
|
|
627
691
|
/**
|
|
628
692
|
* Check if position in text is the start of a relative path (`./` or `../`).
|
|
629
|
-
* Must
|
|
693
|
+
* Must sit at a path boundary (see `is_path_boundary`): start of input,
|
|
694
|
+
* whitespace, or a `(` not glued to a word or a `]`.
|
|
630
695
|
* Rejects prefix followed by whitespace, slash, or end of string.
|
|
631
696
|
*
|
|
632
697
|
* @nodocs
|
|
@@ -634,10 +699,8 @@ export const is_at_absolute_path = (text, index) => {
|
|
|
634
699
|
export const is_at_relative_path = (text, index) => {
|
|
635
700
|
if (text.charCodeAt(index) !== PERIOD)
|
|
636
701
|
return false;
|
|
637
|
-
if (index
|
|
638
|
-
|
|
639
|
-
if (prev_char !== SPACE && prev_char !== NEWLINE && prev_char !== TAB)
|
|
640
|
-
return false;
|
|
702
|
+
if (!is_path_boundary(char_code_before(text, index, 1), char_code_before(text, index, 2))) {
|
|
703
|
+
return false;
|
|
641
704
|
}
|
|
642
705
|
const remaining = text.length - index;
|
|
643
706
|
// Check for ../ (at least 4 chars: ../x)
|
package/dist/mdz_lexer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_lexer.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_lexer.d.ts","sourceRoot":"","sources":["../src/lib/mdz_lexer.ts"],"names":[],"mappings":"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"}
|
package/dist/mdz_lexer.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
import { mdz_is_url, mdz_is_safe_reference, is_letter, is_tag_name_char, is_word_char, is_valid_path_char, mdz_trim_url_punctuation, BACKTICK, ASTERISK, UNDERSCORE, TILDE, NEWLINE, HYPHEN, HASH, SPACE, LEFT_ANGLE, RIGHT_ANGLE, SLASH, EQUALS, APOSTROPHE, DOUBLE_QUOTE, PERIOD, LEFT_BRACKET, LEFT_PAREN, RIGHT_BRACKET, A_UPPER, Z_UPPER, ZERO, ONE, NINE, HR_HYPHEN_COUNT, MIN_CODEBLOCK_BACKTICKS, MAX_HEADING_LEVEL, MAX_INLINE_NESTING_DEPTH, MAX_LIST_NUMBER_DIGITS, match_url_prefix_case_insensitive, is_at_absolute_path, is_at_relative_path, is_line_whitespace, mdz_match_blockquote_prefix, mdz_blockquote_line_has_content, mdz_blockquote_strip_width, mdz_remap_segments, mdz_split_table_row, mdz_parse_table_delimiter, PIPE, TEXT_CLASS_BACKSLASH, TEXT_CLASS_NEWLINE, TEXT_CLASS_STOP, TEXT_CLASS_URL, TEXT_SCAN_CLASS } from './mdz_helpers.js';
|
|
9
|
+
import { mdz_is_url, mdz_is_safe_reference, is_letter, is_tag_name_char, is_word_char, is_valid_path_char, is_bare_path_prefix, is_italic_boundary_blocker, scan_uri_chars_end, mdz_trim_url_punctuation, BACKTICK, ASTERISK, UNDERSCORE, TILDE, NEWLINE, HYPHEN, HASH, SPACE, LEFT_ANGLE, RIGHT_ANGLE, SLASH, EQUALS, APOSTROPHE, DOUBLE_QUOTE, PERIOD, LEFT_BRACKET, LEFT_PAREN, RIGHT_BRACKET, A_UPPER, Z_UPPER, ZERO, ONE, NINE, HR_HYPHEN_COUNT, MIN_CODEBLOCK_BACKTICKS, MAX_HEADING_LEVEL, MAX_INLINE_NESTING_DEPTH, MAX_LIST_NUMBER_DIGITS, match_url_prefix_case_insensitive, is_at_absolute_path, is_at_relative_path, is_line_whitespace, mdz_match_blockquote_prefix, mdz_blockquote_line_has_content, mdz_blockquote_strip_width, mdz_remap_segments, mdz_split_table_row, mdz_parse_table_delimiter, PIPE, TEXT_CLASS_BACKSLASH, TEXT_CLASS_NEWLINE, TEXT_CLASS_STOP, TEXT_CLASS_URL, TEXT_SCAN_CLASS } from './mdz_helpers.js';
|
|
10
10
|
import { mdz_debug_work } from './mdz_debug_work.js';
|
|
11
11
|
//
|
|
12
12
|
// Lexer
|
|
@@ -1723,6 +1723,12 @@ export class MdzLexer {
|
|
|
1723
1723
|
let reference = this.#text.slice(start, this.#index);
|
|
1724
1724
|
reference = mdz_trim_url_punctuation(reference);
|
|
1725
1725
|
this.#index = start + reference.length;
|
|
1726
|
+
// a bare scheme (`https://`) left after trimming isn't a URL — literal text,
|
|
1727
|
+
// matching the streaming parser's completion check
|
|
1728
|
+
if (reference.length <= match_url_prefix_case_insensitive(reference, 0)) {
|
|
1729
|
+
this.#emit_text(reference, start);
|
|
1730
|
+
return;
|
|
1731
|
+
}
|
|
1726
1732
|
this.#tokens.push({
|
|
1727
1733
|
type: 'autolink',
|
|
1728
1734
|
reference,
|
|
@@ -1733,17 +1739,17 @@ export class MdzLexer {
|
|
|
1733
1739
|
}
|
|
1734
1740
|
#tokenize_auto_link_internal() {
|
|
1735
1741
|
const start = this.#index;
|
|
1736
|
-
//
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
if (char_code === SPACE || char_code === NEWLINE || !is_valid_path_char(char_code)) {
|
|
1740
|
-
break;
|
|
1741
|
-
}
|
|
1742
|
-
this.#index++;
|
|
1743
|
-
}
|
|
1742
|
+
// collect path characters — a path opened by `(` ends at its matching `)`
|
|
1743
|
+
// (the probes only admit a `(` before a path at a valid boundary)
|
|
1744
|
+
this.#index = scan_uri_chars_end(this.#text, start, start > 0 && this.#text.charCodeAt(start - 1) === LEFT_PAREN);
|
|
1744
1745
|
let reference = this.#text.slice(start, this.#index);
|
|
1745
1746
|
reference = mdz_trim_url_punctuation(reference);
|
|
1746
1747
|
this.#index = start + reference.length;
|
|
1748
|
+
// a bare prefix (`./`, `/`) left after trimming isn't a path — literal text
|
|
1749
|
+
if (is_bare_path_prefix(reference)) {
|
|
1750
|
+
this.#emit_text(reference, start);
|
|
1751
|
+
return;
|
|
1752
|
+
}
|
|
1747
1753
|
this.#tokens.push({
|
|
1748
1754
|
type: 'autolink',
|
|
1749
1755
|
reference,
|
|
@@ -1823,15 +1829,13 @@ export class MdzLexer {
|
|
|
1823
1829
|
* transparent (so `_~~x~~_` nests).
|
|
1824
1830
|
*/
|
|
1825
1831
|
#is_at_word_boundary(index, check_before, check_after) {
|
|
1826
|
-
if (check_before && index > 0) {
|
|
1827
|
-
|
|
1828
|
-
if (is_word_char(prev) || prev === UNDERSCORE)
|
|
1829
|
-
return false;
|
|
1832
|
+
if (check_before && index > 0 && is_italic_boundary_blocker(this.#text.charCodeAt(index - 1))) {
|
|
1833
|
+
return false;
|
|
1830
1834
|
}
|
|
1831
|
-
if (check_after &&
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
+
if (check_after &&
|
|
1836
|
+
index < this.#text.length &&
|
|
1837
|
+
is_italic_boundary_blocker(this.#text.charCodeAt(index))) {
|
|
1838
|
+
return false;
|
|
1835
1839
|
}
|
|
1836
1840
|
return true;
|
|
1837
1841
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_opcodes.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_opcodes.d.ts","sourceRoot":"","sources":["../src/lib/mdz_opcodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_opcodes_to_nodes.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_opcodes_to_nodes.d.ts","sourceRoot":"","sources":["../src/lib/mdz_opcodes_to_nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAEX,OAAO,EASP,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,kBAAkB,CAAC;AA0B7D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,KAAK,CAAC,SAAS,CAAC,KAAG,KAAK,CAAC,OAAO,CAiM7E,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* corrections are bounded, explicit opcodes (`revert`, `wrap`, `trim_text`).
|
|
8
8
|
*
|
|
9
9
|
* The design is derived from
|
|
10
|
-
*
|
|
10
|
+
* [@pngwn.at](https://bsky.app/profile/pngwn.at/post/3mi527zntb22n)'s
|
|
11
11
|
* ideas: restrict the syntax so streaming is tractable, render
|
|
12
12
|
* optimistically and correct when wrong, emit serializable opcodes to avoid
|
|
13
13
|
* re-parsing, and keep the opcodes target-agnostic so any renderer can
|
|
@@ -57,9 +57,22 @@ import type { MdzOpcode } from './mdz_opcodes.js';
|
|
|
57
57
|
* Italic is the only wedge (the only delimiter whose one-shot form rejects
|
|
58
58
|
* on a failed first closer); see `try_code`'s hold and `code_search_limit`.
|
|
59
59
|
* - **Optimistic inline code unclosed at EOF** — a `` ` `` that opened
|
|
60
|
-
* optimistically consumes its tail as raw code text, so formatting
|
|
61
|
-
* never
|
|
60
|
+
* optimistically consumes its tail as raw code text, so formatting and
|
|
61
|
+
* auto-links inside it never form (`x **b** z` and `(./a.md)` after an
|
|
62
|
+
* unclosed backtick stay flat where one-shot parses the bold and the link);
|
|
62
63
|
* the parser never re-parses, so the EOF revert can only flatten it to text.
|
|
64
|
+
* - **A span crossing a markdown link's `]`** — the one-shot parse pairs a
|
|
65
|
+
* `**`/`_`/`~~` opener with the first occurrence of its delimiter even across
|
|
66
|
+
* a `[text](url)`'s bracket, because markdown links aren't bounded by an
|
|
67
|
+
* enclosing span. With the opener before the link and that occurrence in its
|
|
68
|
+
* display text, the link forms and the opener stays literal
|
|
69
|
+
* (`**x [a b** c](/u) y**`; also when the occurrence sits in an auto-link in
|
|
70
|
+
* the display text, `_x [a https://b_.c **d** e](/u) y_`); with the opener in
|
|
71
|
+
* the display text and the closer past `]`, a link that then fails re-lexes
|
|
72
|
+
* from `[` and the span forms (`[_]_`). Streaming decides the span before it
|
|
73
|
+
* knows whether the link completes, so it closes at the bracketed
|
|
74
|
+
* occurrence, or reverts the span with the failed link; mirroring the
|
|
75
|
+
* one-shot parse would need a hold to the link's `)` or a re-parse.
|
|
63
76
|
* - **Link/tag opens at EOF** — `finish()` doesn't open links or tags, so a held
|
|
64
77
|
* tail containing complete `[text](url)` / `<Tag>…</Tag>` syntax parses flat.
|
|
65
78
|
* - **Block elements interrupt optimistic inlines** — at column 0 a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser.d.ts","sourceRoot":"","sources":["../src/lib/mdz_stream_parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiFlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,qBAAa,eAAe;;IAG3B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB;;;;;;;;;;;;;;;OAeG;IACH,MAAM,IAAI,IAAI;IAId;;;OAGG;IACH,YAAY,IAAI,KAAK,CAAC,SAAS,CAAC;CAKhC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* corrections are bounded, explicit opcodes (`revert`, `wrap`, `trim_text`).
|
|
8
8
|
*
|
|
9
9
|
* The design is derived from
|
|
10
|
-
*
|
|
10
|
+
* [@pngwn.at](https://bsky.app/profile/pngwn.at/post/3mi527zntb22n)'s
|
|
11
11
|
* ideas: restrict the syntax so streaming is tractable, render
|
|
12
12
|
* optimistically and correct when wrong, emit serializable opcodes to avoid
|
|
13
13
|
* re-parsing, and keep the opcodes target-agnostic so any renderer can
|
|
@@ -65,9 +65,22 @@ import { consume_delimiter_as_text, consume_text_run } from './mdz_stream_parser
|
|
|
65
65
|
* Italic is the only wedge (the only delimiter whose one-shot form rejects
|
|
66
66
|
* on a failed first closer); see `try_code`'s hold and `code_search_limit`.
|
|
67
67
|
* - **Optimistic inline code unclosed at EOF** — a `` ` `` that opened
|
|
68
|
-
* optimistically consumes its tail as raw code text, so formatting
|
|
69
|
-
* never
|
|
68
|
+
* optimistically consumes its tail as raw code text, so formatting and
|
|
69
|
+
* auto-links inside it never form (`x **b** z` and `(./a.md)` after an
|
|
70
|
+
* unclosed backtick stay flat where one-shot parses the bold and the link);
|
|
70
71
|
* the parser never re-parses, so the EOF revert can only flatten it to text.
|
|
72
|
+
* - **A span crossing a markdown link's `]`** — the one-shot parse pairs a
|
|
73
|
+
* `**`/`_`/`~~` opener with the first occurrence of its delimiter even across
|
|
74
|
+
* a `[text](url)`'s bracket, because markdown links aren't bounded by an
|
|
75
|
+
* enclosing span. With the opener before the link and that occurrence in its
|
|
76
|
+
* display text, the link forms and the opener stays literal
|
|
77
|
+
* (`**x [a b** c](/u) y**`; also when the occurrence sits in an auto-link in
|
|
78
|
+
* the display text, `_x [a https://b_.c **d** e](/u) y_`); with the opener in
|
|
79
|
+
* the display text and the closer past `]`, a link that then fails re-lexes
|
|
80
|
+
* from `[` and the span forms (`[_]_`). Streaming decides the span before it
|
|
81
|
+
* knows whether the link completes, so it closes at the bracketed
|
|
82
|
+
* occurrence, or reverts the span with the failed link; mirroring the
|
|
83
|
+
* one-shot parse would need a hold to the link's `)` or a re-parse.
|
|
71
84
|
* - **Link/tag opens at EOF** — `finish()` doesn't open links or tags, so a held
|
|
72
85
|
* tail containing complete `[text](url)` / `<Tag>…</Tag>` syntax parses flat.
|
|
73
86
|
* - **Block elements interrupt optimistic inlines** — at column 0 a
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Block-element handlers for the streaming mdz parser.
|
|
3
3
|
*
|
|
4
|
-
* Each `try_*` returns
|
|
5
|
-
*
|
|
4
|
+
* Each `try_*` returns `TryResult` so the orchestrator in
|
|
5
|
+
* `mdz_stream_parser.ts` can fall through or wait for more input.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser_block.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser_block.d.ts","sourceRoot":"","sources":["../src/lib/mdz_stream_parser_block.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,SAAS,EAOd,MAAM,8BAA8B,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,oBAAoB,KAAG,SAuDzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,oBAAoB,EAAE,gBAAc,KAAG,SA4CpE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,oBAAoB,KAAG,SAgDhE,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAC/B,OAAO,oBAAoB,EAC3B,IAAI,cAAc,EAClB,SAAS,MAAM,EACf,eAAe,MAAM,KACnB,IAgBF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GAAI,OAAO,oBAAoB,KAAG,IA6CtE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,oBAAoB,KAAG,OA2D/D,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,yBAAyB,GACrC,OAAO,oBAAoB,EAC3B,QAAQ,OAAO,KACb,OAmDF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,GACjC,OAAO,oBAAoB,EAC3B,gBAAgB,MAAM,EACtB,SAAQ,OAAe,KACrB,MAgCF,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Block-element handlers for the streaming mdz parser.
|
|
3
3
|
*
|
|
4
|
-
* Each `try_*` returns
|
|
5
|
-
*
|
|
4
|
+
* Each `try_*` returns `TryResult` so the orchestrator in
|
|
5
|
+
* `mdz_stream_parser.ts` can fall through or wait for more input.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser_inline.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser_inline.d.ts","sourceRoot":"","sources":["../src/lib/mdz_stream_parser_inline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EACN,KAAK,oBAAoB,EAYzB,MAAM,8BAA8B,CAAC;AA6GtC;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAChC,OAAO,oBAAoB,EAC3B,WAAW,IAAI,GAAG,IAAI,EACtB,WAAW,MAAM,GAAG,eAAe,EACnC,gBAAc,KACZ,OA2BF,CAAC;AAIF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,oBAAoB,EAAE,gBAAc,KAAG,OAyCxE,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,GAAI,OAAO,oBAAoB,KAAG,OAOvE,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,oBAAoB,EAAE,WAAW,MAAM,KAAG,OAuBhF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,oBAAoB,GAChC,OAAO,oBAAoB,EAC3B,gBAAc,KACZ,WAAW,GAAG,UAAU,GAAG,SAmB7B,CAAC;AAIF,cAAc;AACd,eAAO,MAAM,QAAQ,GAAI,OAAO,oBAAoB,EAAE,gBAAc,KAAG,OAwFtE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,oBAAoB,EAAE,MAAM,MAAM,KAAG,MAyB7E,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,GAAI,OAAO,oBAAoB,KAAG,OAO5E,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,oBAAoB,KAAG,IA2ClE,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
|
-
import { BACKTICK, NEWLINE, RIGHT_ANGLE, UNDERSCORE,
|
|
7
|
+
import { BACKTICK, NEWLINE, RIGHT_ANGLE, UNDERSCORE, is_italic_boundary_blocker, is_line_whitespace, mdz_blockquote_line_has_content, mdz_match_blockquote_prefix } from './mdz_helpers.js';
|
|
8
8
|
import { accumulate_text, alloc_id, buffer_index_of, emit, ensure_paragraph, flush_text, is_run_boundary, offset, pop_stack_entry, push_stack_entry, revert_above } from './mdz_stream_parser_state.js';
|
|
9
9
|
import { match_fence_opener, match_list_marker } from './mdz_stream_parser_list.js';
|
|
10
10
|
import { consume_delimiter_as_text } from './mdz_stream_parser_text.js';
|
|
@@ -159,7 +159,7 @@ export const try_double_delimiter = (state, delimiter, node_type, forced = false
|
|
|
159
159
|
export const try_italic = (state, forced = false) => {
|
|
160
160
|
// opening boundary: reject after a word char, or after the delimiter
|
|
161
161
|
// itself — `_` is self-opaque, so runs like `__init__` stay literal
|
|
162
|
-
if (state.prev_char !== -1 && (
|
|
162
|
+
if (state.prev_char !== -1 && is_italic_boundary_blocker(state.prev_char)) {
|
|
163
163
|
consume_delimiter_as_text(state, '_');
|
|
164
164
|
return true;
|
|
165
165
|
}
|
|
@@ -211,7 +211,7 @@ export const check_close_word_boundary = (state) => {
|
|
|
211
211
|
const next_pos = state.pos + 1;
|
|
212
212
|
if (next_pos < state.buffer.length) {
|
|
213
213
|
const next = state.buffer.charCodeAt(next_pos);
|
|
214
|
-
return !(
|
|
214
|
+
return !is_italic_boundary_blocker(next);
|
|
215
215
|
}
|
|
216
216
|
return true;
|
|
217
217
|
};
|
|
@@ -287,7 +287,7 @@ export const scan_closer_boundary = (state, forced = false) => {
|
|
|
287
287
|
const after_pos = delim_pos + 1;
|
|
288
288
|
if (after_pos < state.buffer.length) {
|
|
289
289
|
const after = state.buffer.charCodeAt(after_pos);
|
|
290
|
-
return
|
|
290
|
+
return is_italic_boundary_blocker(after) ? 'rejected' : 'confirmed';
|
|
291
291
|
}
|
|
292
292
|
// closer at end of buffer — treat as confirmed, consistent with
|
|
293
293
|
// check_close_word_boundary which also assumes boundary at buffer end
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser_link.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser_link.d.ts","sourceRoot":"","sources":["../src/lib/mdz_stream_parser_link.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,SAAS,EAYd,MAAM,8BAA8B,CAAC;AAMtC,cAAc;AACd,eAAO,MAAM,aAAa,GAAI,OAAO,oBAAoB,KAAG,OAoB3D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC9B,OAAO,oBAAoB,EAC3B,gBAAgB,MAAM,EACtB,aAAa,MAAM,KACjB,IAUF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,oBAAoB,EAAE,gBAAgB,MAAM,KAAG,OA4EvF,CAAC;AAIF,cAAc;AACd,eAAO,MAAM,YAAY,GAAI,OAAO,oBAAoB,KAAG,SAuJ1D,CAAC;AAEF,cAAc;AACd,eAAO,MAAM,aAAa,GAAI,OAAO,oBAAoB,KAAG,SAiD3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser_list.d.ts","sourceRoot":"
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser_list.d.ts","sourceRoot":"","sources":["../src/lib/mdz_stream_parser_list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAmBH,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,SAAS,EAad,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;CACf;AAoBD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAC7B,OAAO,oBAAoB,EAC3B,GAAG,MAAM,EACT,QAAQ,OAAO,KACb,mBAAmB,GAAG,SAAS,GAAG,IAsDpC,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC9B,OAAO,oBAAoB,EAC3B,GAAG,MAAM,EACT,QAAQ,OAAO,KACb,oBAAoB,GAAG,SAAS,GAAG,IAuBrC,CAAC;AAgGF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,oBAAoB,EAAE,QAAQ,OAAO,KAAG,SAY7E,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,iBAAiB,GAC7B,OAAO,oBAAoB,EAC3B,QAAQ,OAAO,KACb,OAAO,GAAG,YA2MZ,CAAC"}
|
|
@@ -159,6 +159,12 @@ export interface PendingUrl {
|
|
|
159
159
|
/** Prefix match tracking — only used when `!confirmed`. */
|
|
160
160
|
viable_https: boolean;
|
|
161
161
|
viable_http: boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Paren depth inside a path opened by `(` — the path ends at a `)` at
|
|
164
|
+
* depth zero — or `-1` for every other URL/path, which scan to their
|
|
165
|
+
* terminator.
|
|
166
|
+
*/
|
|
167
|
+
paren_depth: number;
|
|
162
168
|
}
|
|
163
169
|
/**
|
|
164
170
|
* Mutable state for the streaming parser. One instance per `MdzStreamParser`.
|
|
@@ -176,6 +182,14 @@ export interface MdzStreamParserState {
|
|
|
176
182
|
stack: Array<StackEntry>;
|
|
177
183
|
column: number;
|
|
178
184
|
prev_char: number;
|
|
185
|
+
/**
|
|
186
|
+
* The char before `prev_char` — the second char of lookbehind the path
|
|
187
|
+
* boundary needs (`is_path_boundary`: a `(` opens a path only when not
|
|
188
|
+
* glued to a word or a `]`). Only `consume_text_run` maintains it, and it's read only
|
|
189
|
+
* when `prev_char` is `(`, which only a text run leaves behind ahead of a
|
|
190
|
+
* path-start char; elsewhere it may be stale.
|
|
191
|
+
*/
|
|
192
|
+
before_prev_char: number;
|
|
179
193
|
active_text_id: MdzNodeId | null;
|
|
180
194
|
accumulated_text: string;
|
|
181
195
|
accumulated_text_start: number;
|
|
@@ -424,18 +438,24 @@ export declare const find_open: (state: MdzStreamParserState, type: keyof OpenIn
|
|
|
424
438
|
*/
|
|
425
439
|
export declare const revert_above: (state: MdzStreamParserState, target_idx: number) => void;
|
|
426
440
|
/**
|
|
427
|
-
* Revert
|
|
428
|
-
*
|
|
429
|
-
*
|
|
430
|
-
*
|
|
431
|
-
*
|
|
432
|
-
*
|
|
433
|
-
*
|
|
434
|
-
*
|
|
435
|
-
*
|
|
436
|
-
*
|
|
437
|
-
*
|
|
438
|
-
*
|
|
441
|
+
* Revert one open frame, possibly **mid-stack**, without reverting the frames
|
|
442
|
+
* above it. Two callers:
|
|
443
|
+
*
|
|
444
|
+
* - an open `Italic` whose first closer candidate failed its boundary check
|
|
445
|
+
* (italic is the only inline with closer-boundary rules) — one-shot parsing
|
|
446
|
+
* greedy-rejects the opener at the first invalid closer, so once a failed
|
|
447
|
+
* candidate is seen the optimistic open is known wrong, and reverting
|
|
448
|
+
* immediately keeps chunked output identical to the one-shot parse
|
|
449
|
+
* - the auto-link span resolution (`revert_spans_closed_inside` in
|
|
450
|
+
* `mdz_stream_parser_url.ts`), which reverts `Bold`, `Italic`,
|
|
451
|
+
* `Strikethrough`, `Element`, and `Component` frames whose span the one-shot
|
|
452
|
+
* parse leaves literal, one frame at a time and possibly beneath a `Link`
|
|
453
|
+
* frame that stays open
|
|
454
|
+
*
|
|
455
|
+
* Containers opened above the reverted frame stay open, and the consumers'
|
|
456
|
+
* revert handlers re-parent them identically for every frame type — the
|
|
457
|
+
* reverted node is still its parent's last child, and both handlers work on
|
|
458
|
+
* node ids and children only (see `mdz_opcodes_to_nodes` and
|
|
439
459
|
* `MdzStreamState`).
|
|
440
460
|
*
|
|
441
461
|
* Bypasses `emit` for the opcode push: `emit`'s heading-segment handling
|