@fuzdev/mdz 0.1.0 → 0.2.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/MdzNodeView.svelte +30 -1
- package/dist/MdzNodeView.svelte.d.ts.map +1 -1
- package/dist/MdzStreamNodeView.svelte +31 -0
- package/dist/MdzStreamNodeView.svelte.d.ts.map +1 -1
- package/dist/context_helpers.d.ts +1 -1
- package/dist/mdz.d.ts +53 -2
- package/dist/mdz.d.ts.map +1 -1
- package/dist/mdz.js +29 -1
- package/dist/mdz_helpers.d.ts +35 -1
- package/dist/mdz_helpers.d.ts.map +1 -1
- package/dist/mdz_helpers.js +120 -0
- package/dist/mdz_lexer.d.ts +35 -1
- package/dist/mdz_lexer.d.ts.map +1 -1
- package/dist/mdz_lexer.js +211 -2
- package/dist/mdz_opcodes.d.ts +6 -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 +26 -0
- package/dist/mdz_stream_parser.d.ts.map +1 -1
- package/dist/mdz_stream_parser.js +20 -1
- package/dist/mdz_stream_parser_list.d.ts.map +1 -1
- package/dist/mdz_stream_parser_list.js +22 -1
- package/dist/mdz_stream_parser_state.d.ts +12 -0
- package/dist/mdz_stream_parser_state.d.ts.map +1 -1
- package/dist/mdz_stream_parser_state.js +1 -0
- package/dist/mdz_stream_parser_table.d.ts +72 -0
- package/dist/mdz_stream_parser_table.d.ts.map +1 -0
- package/dist/mdz_stream_parser_table.js +351 -0
- package/dist/mdz_stream_state.svelte.d.ts +5 -0
- package/dist/mdz_stream_state.svelte.d.ts.map +1 -1
- package/dist/mdz_stream_state.svelte.js +8 -0
- package/dist/mdz_to_svelte.d.ts.map +1 -1
- package/dist/mdz_to_svelte.js +37 -3
- package/dist/mdz_token_parser.d.ts +16 -0
- package/dist/mdz_token_parser.d.ts.map +1 -1
- package/dist/mdz_token_parser.js +101 -2
- package/dist/svelte_preprocess_mdz.js +2 -2
- package/package.json +8 -8
- package/src/lib/context_helpers.ts +1 -1
- package/src/lib/mdz.ts +70 -3
- package/src/lib/mdz_contexts.ts +1 -1
- package/src/lib/mdz_helpers.ts +125 -1
- package/src/lib/mdz_lexer.ts +262 -3
- package/src/lib/mdz_opcodes.ts +10 -1
- package/src/lib/mdz_opcodes_to_nodes.ts +37 -3
- package/src/lib/mdz_stream_parser.ts +26 -9
- 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_link.ts +3 -3
- package/src/lib/mdz_stream_parser_list.ts +24 -2
- package/src/lib/mdz_stream_parser_state.ts +12 -2
- package/src/lib/mdz_stream_parser_table.ts +409 -0
- package/src/lib/mdz_stream_parser_text.ts +2 -2
- package/src/lib/mdz_stream_parser_url.ts +2 -2
- package/src/lib/mdz_stream_state.svelte.ts +8 -1
- package/src/lib/mdz_to_svelte.ts +39 -5
- package/src/lib/mdz_token_parser.ts +122 -5
- package/src/lib/svelte_preprocess_mdz.ts +4 -4
- package/src/lib/tsdoc_mdz.ts +1 -1
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, PERIOD, LEFT_BRACKET, LEFT_PAREN, RIGHT_BRACKET, A_UPPER, Z_UPPER, ZERO, ONE, NINE, HR_HYPHEN_COUNT, MIN_CODEBLOCK_BACKTICKS, MAX_HEADING_LEVEL, 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, } 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, mdz_trim_url_punctuation, BACKTICK, ASTERISK, UNDERSCORE, TILDE, NEWLINE, HYPHEN, HASH, SPACE, LEFT_ANGLE, RIGHT_ANGLE, SLASH, PERIOD, LEFT_BRACKET, LEFT_PAREN, RIGHT_BRACKET, A_UPPER, Z_UPPER, ZERO, ONE, NINE, HR_HYPHEN_COUNT, MIN_CODEBLOCK_BACKTICKS, MAX_HEADING_LEVEL, 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, BACKSLASH, } from './mdz_helpers.js';
|
|
10
10
|
//
|
|
11
11
|
// Lexer
|
|
12
12
|
//
|
|
@@ -33,6 +33,12 @@ export class MdzLexer {
|
|
|
33
33
|
* scanner pre-validated every line in the run as continuation).
|
|
34
34
|
*/
|
|
35
35
|
#list_run_strip = false;
|
|
36
|
+
/**
|
|
37
|
+
* Whether `#tokenize_text` is inside a table cell: `#max_search_index` is a
|
|
38
|
+
* hard stop (the cell's trimmed end, mid-line with no newline to halt on)
|
|
39
|
+
* and `\|` unescapes to a literal pipe.
|
|
40
|
+
*/
|
|
41
|
+
#in_table_cell = false;
|
|
36
42
|
constructor(text) {
|
|
37
43
|
this.#text = text;
|
|
38
44
|
}
|
|
@@ -77,6 +83,8 @@ export class MdzLexer {
|
|
|
77
83
|
continue;
|
|
78
84
|
if (this.#tokenize_blockquote())
|
|
79
85
|
continue;
|
|
86
|
+
if (this.#tokenize_table())
|
|
87
|
+
continue;
|
|
80
88
|
}
|
|
81
89
|
// Check for paragraph break
|
|
82
90
|
if (this.#is_at_paragraph_break()) {
|
|
@@ -90,6 +98,21 @@ export class MdzLexer {
|
|
|
90
98
|
}
|
|
91
99
|
return this.#tokens;
|
|
92
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Tokenize a table cell's inline content `[cell_start, cell_end)` as a
|
|
103
|
+
* bounded inline run, with no wrapping cell tokens (the bare form of
|
|
104
|
+
* `#emit_table_cell`, sharing `#tokenize_cell_inline`). The streaming parser
|
|
105
|
+
* reuses it across a row's cells via `MdzTableCellParser`: the token buffer
|
|
106
|
+
* resets per call while the search memo — valid over the immutable bound
|
|
107
|
+
* text — carries across cells (the same reuse the sync lexer does in place).
|
|
108
|
+
*
|
|
109
|
+
* @nodocs
|
|
110
|
+
*/
|
|
111
|
+
lex_table_cell(cell_start, cell_end) {
|
|
112
|
+
this.#tokens = [];
|
|
113
|
+
this.#tokenize_cell_inline(cell_start, cell_end);
|
|
114
|
+
return this.#tokens;
|
|
115
|
+
}
|
|
93
116
|
#is_at_column_0() {
|
|
94
117
|
return this.#index === 0 || this.#text.charCodeAt(this.#index - 1) === NEWLINE;
|
|
95
118
|
}
|
|
@@ -350,6 +373,156 @@ export class MdzLexer {
|
|
|
350
373
|
this.#tokens.push({ type: 'blockquote_close', start: last_line_end, end: last_line_end });
|
|
351
374
|
this.#index = last_line_end;
|
|
352
375
|
}
|
|
376
|
+
// -- Table tokenizers --
|
|
377
|
+
/**
|
|
378
|
+
* Tokenize a table starting at a column-0 pipe row, emitting
|
|
379
|
+
* `table_open`/`table_row_open`/`table_cell_open` … structure tokens (the
|
|
380
|
+
* header row's cells first, then each body row's). Returns false with no
|
|
381
|
+
* side effects when the current line isn't a table: not a `| … |` row, or
|
|
382
|
+
* not followed by a delimiter row whose column count matches the header. The
|
|
383
|
+
* delimiter row's colons set `align`; body rows continue until a blank line,
|
|
384
|
+
* a non-pipe-row line, or EOF.
|
|
385
|
+
*/
|
|
386
|
+
#tokenize_table() {
|
|
387
|
+
const table_start = this.#index;
|
|
388
|
+
let header_end = this.#index_of('\n', this.#index);
|
|
389
|
+
if (header_end === -1)
|
|
390
|
+
header_end = this.#text.length;
|
|
391
|
+
const header_cells = mdz_split_table_row(this.#text, this.#index, header_end);
|
|
392
|
+
if (header_cells === null)
|
|
393
|
+
return false;
|
|
394
|
+
if (header_end >= this.#text.length)
|
|
395
|
+
return false; // a header needs a delimiter row beneath it
|
|
396
|
+
const delim_start = header_end + 1;
|
|
397
|
+
let delim_end = this.#index_of('\n', delim_start);
|
|
398
|
+
if (delim_end === -1)
|
|
399
|
+
delim_end = this.#text.length;
|
|
400
|
+
const align = mdz_parse_table_delimiter(this.#text, delim_start, delim_end);
|
|
401
|
+
if (align === null || align.length !== header_cells.length)
|
|
402
|
+
return false;
|
|
403
|
+
// committed — emit the table; the delimiter row is structural (not emitted)
|
|
404
|
+
this.#tokens.push({ type: 'table_open', align, start: table_start, end: header_end });
|
|
405
|
+
this.#emit_table_row(header_cells, true, table_start, header_end);
|
|
406
|
+
this.#index = delim_end;
|
|
407
|
+
let table_end = delim_end;
|
|
408
|
+
// body rows: consecutive valid pipe rows, until a blank/non-row line or EOF
|
|
409
|
+
while (this.#index < this.#text.length) {
|
|
410
|
+
const row_start = this.#index + 1; // past the newline at #index
|
|
411
|
+
let row_end = this.#index_of('\n', row_start);
|
|
412
|
+
if (row_end === -1)
|
|
413
|
+
row_end = this.#text.length;
|
|
414
|
+
const cells = mdz_split_table_row(this.#text, row_start, row_end);
|
|
415
|
+
if (cells === null)
|
|
416
|
+
break;
|
|
417
|
+
this.#emit_table_row(cells, false, row_start, row_end);
|
|
418
|
+
this.#index = row_end;
|
|
419
|
+
table_end = row_end;
|
|
420
|
+
}
|
|
421
|
+
this.#tokens.push({ type: 'table_close', start: table_end, end: table_end });
|
|
422
|
+
this.#skip_blank_lines();
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
/** Emit one table row's open / cell / close tokens. */
|
|
426
|
+
#emit_table_row(cells, header, row_start, row_end) {
|
|
427
|
+
this.#tokens.push({ type: 'table_row_open', header, start: row_start, end: row_start });
|
|
428
|
+
for (const cell of cells) {
|
|
429
|
+
this.#emit_table_cell(cell.start, cell.end);
|
|
430
|
+
}
|
|
431
|
+
this.#tokens.push({ type: 'table_row_close', start: row_end, end: row_end });
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Emit one cell's `table_cell_open`, inline-content tokens, and
|
|
435
|
+
* `table_cell_close`. Inline tokenization is bounded to the cell's trimmed
|
|
436
|
+
* span via `#max_search_index`, with `#in_table_cell` set so `#tokenize_text`
|
|
437
|
+
* stops at that bound and unescapes `\|`.
|
|
438
|
+
*/
|
|
439
|
+
#emit_table_cell(cell_start, cell_end) {
|
|
440
|
+
this.#tokens.push({ type: 'table_cell_open', start: cell_start, end: cell_start });
|
|
441
|
+
this.#tokenize_cell_inline(cell_start, cell_end);
|
|
442
|
+
this.#tokens.push({ type: 'table_cell_close', start: cell_end, end: cell_end });
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Tokenize a cell's trimmed inline span `[cell_start, cell_end)` into the
|
|
446
|
+
* current token buffer, bounded by `#max_search_index` with `#in_table_cell`
|
|
447
|
+
* set so `#tokenize_text` stops at the bound and unescapes `\|`. Shared by
|
|
448
|
+
* `#emit_table_cell` (wrapped in cell tokens) and `lex_table_cell` (bare).
|
|
449
|
+
*/
|
|
450
|
+
#tokenize_cell_inline(cell_start, cell_end) {
|
|
451
|
+
const saved_max = this.#max_search_index;
|
|
452
|
+
this.#max_search_index = cell_end;
|
|
453
|
+
this.#in_table_cell = true;
|
|
454
|
+
this.#index = cell_start;
|
|
455
|
+
while (this.#index < cell_end) {
|
|
456
|
+
this.#tokenize_inline();
|
|
457
|
+
}
|
|
458
|
+
this.#in_table_cell = false;
|
|
459
|
+
this.#max_search_index = saved_max;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Recognize an in-item table whose header row's leading `|` is at `first`
|
|
463
|
+
* (the line's indent already skipped): a pipe row whose next line is a
|
|
464
|
+
* delimiter row, both indented past `marker_indent` (so both stay inside the
|
|
465
|
+
* item). Returns the parsed header/delimiter, or null. Pure — no emission.
|
|
466
|
+
*/
|
|
467
|
+
#match_item_table_head(first, marker_indent) {
|
|
468
|
+
const header_end = this.#index_of('\n', first);
|
|
469
|
+
if (header_end === -1)
|
|
470
|
+
return null; // a header needs a delimiter line beneath it
|
|
471
|
+
const header_cells = mdz_split_table_row(this.#text, first, header_end);
|
|
472
|
+
if (header_cells === null)
|
|
473
|
+
return null;
|
|
474
|
+
const delim_line_start = header_end + 1;
|
|
475
|
+
let dj = delim_line_start;
|
|
476
|
+
while (dj < this.#text.length && is_line_whitespace(this.#text.charCodeAt(dj)))
|
|
477
|
+
dj++;
|
|
478
|
+
if (dj - delim_line_start <= marker_indent)
|
|
479
|
+
return null; // delimiter dedented out of the item
|
|
480
|
+
let delim_end = this.#index_of('\n', dj);
|
|
481
|
+
if (delim_end === -1)
|
|
482
|
+
delim_end = this.#text.length;
|
|
483
|
+
const align = mdz_parse_table_delimiter(this.#text, dj, delim_end);
|
|
484
|
+
if (align === null || align.length !== header_cells.length)
|
|
485
|
+
return null;
|
|
486
|
+
return { header_cells, header_end, align, delim_end };
|
|
487
|
+
}
|
|
488
|
+
/** Whether a table opens at `first` as a block child of an item at `marker_indent`. */
|
|
489
|
+
#is_item_table_start(first, marker_indent) {
|
|
490
|
+
return this.#match_item_table_head(first, marker_indent) !== null;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Tokenize an in-item table at `first` (a recognized table start). Mirrors
|
|
494
|
+
* `#tokenize_table` but per row skips the line's indent to the `|` and ends
|
|
495
|
+
* when a row dedents to `marker_indent` or shallower, leaving `#index` at the
|
|
496
|
+
* table's terminating newline so the list loop classifies what follows (no
|
|
497
|
+
* `#skip_blank_lines` — the list owns blank-line containment).
|
|
498
|
+
*/
|
|
499
|
+
#tokenize_item_table(first, marker_indent) {
|
|
500
|
+
const head = this.#match_item_table_head(first, marker_indent);
|
|
501
|
+
this.#tokens.push({ type: 'table_open', align: head.align, start: first, end: head.header_end });
|
|
502
|
+
this.#emit_table_row(head.header_cells, true, first, head.header_end);
|
|
503
|
+
this.#index = head.delim_end;
|
|
504
|
+
let table_end = head.delim_end;
|
|
505
|
+
while (this.#index < this.#text.length) {
|
|
506
|
+
const row_line_start = this.#index + 1; // past the newline at #index
|
|
507
|
+
let rj = row_line_start;
|
|
508
|
+
while (rj < this.#text.length && is_line_whitespace(this.#text.charCodeAt(rj)))
|
|
509
|
+
rj++;
|
|
510
|
+
if (rj - row_line_start <= marker_indent)
|
|
511
|
+
break; // dedent ends the table
|
|
512
|
+
if (this.#text.charCodeAt(rj) !== PIPE)
|
|
513
|
+
break;
|
|
514
|
+
let row_end = this.#index_of('\n', rj);
|
|
515
|
+
if (row_end === -1)
|
|
516
|
+
row_end = this.#text.length;
|
|
517
|
+
const cells = mdz_split_table_row(this.#text, rj, row_end);
|
|
518
|
+
if (cells === null)
|
|
519
|
+
break;
|
|
520
|
+
this.#emit_table_row(cells, false, rj, row_end);
|
|
521
|
+
this.#index = row_end;
|
|
522
|
+
table_end = row_end;
|
|
523
|
+
}
|
|
524
|
+
this.#tokens.push({ type: 'table_close', start: table_end, end: table_end });
|
|
525
|
+
}
|
|
353
526
|
// -- List tokenizers --
|
|
354
527
|
/**
|
|
355
528
|
* Tokenize an entire list starting at a column-0 marker line, emitting
|
|
@@ -478,6 +651,22 @@ export class MdzLexer {
|
|
|
478
651
|
continue;
|
|
479
652
|
}
|
|
480
653
|
}
|
|
654
|
+
// a deeper pipe-row line whose next line is a delimiter becomes a
|
|
655
|
+
// table child of the item it would otherwise continue (the fence/quote
|
|
656
|
+
// precedent, but a two-line lookahead)
|
|
657
|
+
if (indent > 0 && this.#text.charCodeAt(first) === PIPE) {
|
|
658
|
+
const target_idx = this.#list_continuation_target(levels, indent);
|
|
659
|
+
if (target_idx !== -1) {
|
|
660
|
+
const marker_indent = levels[target_idx].indent;
|
|
661
|
+
if (this.#is_item_table_start(first, marker_indent)) {
|
|
662
|
+
while (levels.length - 1 > target_idx) {
|
|
663
|
+
this.#list_close(levels);
|
|
664
|
+
}
|
|
665
|
+
this.#tokenize_item_table(first, marker_indent);
|
|
666
|
+
continue;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
481
670
|
// any other line deeper than an open item's marker opens a new
|
|
482
671
|
// `Paragraph` block child of that item (the item's inline run is never
|
|
483
672
|
// current here — a blank, block child, or dedent intervened)
|
|
@@ -681,6 +870,9 @@ export class MdzLexer {
|
|
|
681
870
|
if (this.#text.charCodeAt(j) === RIGHT_ANGLE && this.#is_blockquote_opener(j)) {
|
|
682
871
|
return nl; // a quote opener line interrupts the run
|
|
683
872
|
}
|
|
873
|
+
if (this.#text.charCodeAt(j) === PIPE && this.#is_item_table_start(j, deepest_indent)) {
|
|
874
|
+
return nl; // a table opener (pipe row + delimiter) interrupts the run
|
|
875
|
+
}
|
|
684
876
|
i = line_start; // continuation — keep scanning
|
|
685
877
|
}
|
|
686
878
|
}
|
|
@@ -1210,6 +1402,22 @@ export class MdzLexer {
|
|
|
1210
1402
|
let part_start = start;
|
|
1211
1403
|
while (this.#index < this.#text.length) {
|
|
1212
1404
|
const char_code = this.#text.charCodeAt(this.#index);
|
|
1405
|
+
// in a table cell: the trimmed cell end is a hard stop (no newline to
|
|
1406
|
+
// halt on mid-line), and `\|` is a literal pipe (the only mdz escape,
|
|
1407
|
+
// scoped here)
|
|
1408
|
+
if (this.#in_table_cell) {
|
|
1409
|
+
if (this.#index >= this.#max_search_index)
|
|
1410
|
+
break;
|
|
1411
|
+
if (char_code === BACKSLASH &&
|
|
1412
|
+
this.#index + 1 < this.#max_search_index &&
|
|
1413
|
+
this.#text.charCodeAt(this.#index + 1) === PIPE) {
|
|
1414
|
+
(parts ??= []).push(this.#text.slice(part_start, this.#index));
|
|
1415
|
+
parts.push('|');
|
|
1416
|
+
this.#index += 2;
|
|
1417
|
+
part_start = this.#index;
|
|
1418
|
+
continue;
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1213
1421
|
// Stop at special characters
|
|
1214
1422
|
if (char_code === BACKTICK ||
|
|
1215
1423
|
char_code === ASTERISK ||
|
|
@@ -1251,7 +1459,8 @@ export class MdzLexer {
|
|
|
1251
1459
|
next_char === HYPHEN ||
|
|
1252
1460
|
next_char === BACKTICK ||
|
|
1253
1461
|
next_char === ONE ||
|
|
1254
|
-
next_char === RIGHT_ANGLE
|
|
1462
|
+
next_char === RIGHT_ANGLE ||
|
|
1463
|
+
next_char === PIPE) {
|
|
1255
1464
|
this.#index++; // consume the newline
|
|
1256
1465
|
break;
|
|
1257
1466
|
}
|
package/dist/mdz_opcodes.d.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module
|
|
13
13
|
*/
|
|
14
|
+
import type { MdzTableAlign } from './mdz.js';
|
|
14
15
|
/**
|
|
15
16
|
* Unique monotonic identifier for each node created by the parser.
|
|
16
17
|
* IDs are never reused within a parser instance.
|
|
@@ -24,7 +25,7 @@ export type MdzNodeId = number;
|
|
|
24
25
|
* visible yet opens an optimistic `Code` container whose content streams as
|
|
25
26
|
* text children (collapsed back to `content` by consumers at `close`).
|
|
26
27
|
*/
|
|
27
|
-
export type MdzNodeTypeContainer = 'Paragraph' | 'Bold' | 'Italic' | 'Strikethrough' | 'Link' | 'Heading' | 'List' | 'ListItem' | 'Blockquote' | 'Element' | 'Component' | 'Codeblock' | 'Code';
|
|
28
|
+
export type MdzNodeTypeContainer = 'Paragraph' | 'Bold' | 'Italic' | 'Strikethrough' | 'Link' | 'Heading' | 'List' | 'ListItem' | 'Blockquote' | 'Element' | 'Component' | 'Codeblock' | 'Code' | 'Table' | 'TableRow' | 'TableCell';
|
|
28
29
|
/** Node types for self-contained leaf elements. */
|
|
29
30
|
export type MdzNodeTypeVoid = 'Hr';
|
|
30
31
|
/** Discriminant for leaf text nodes (see `MdzNodeTypeContainer` for `Code`'s dual form). */
|
|
@@ -51,6 +52,10 @@ export interface MdzOpcodeOpen {
|
|
|
51
52
|
start_number?: number;
|
|
52
53
|
/** Authored item number. Present when `node_type` is `'ListItem'` in an ordered list. */
|
|
53
54
|
number?: number;
|
|
55
|
+
/** Per-column alignment from the delimiter row. Present when `node_type` is `'Table'`. */
|
|
56
|
+
align?: Array<MdzTableAlign>;
|
|
57
|
+
/** Whether this is the header row (`thead`/`th`). Present when `node_type` is `'TableRow'`. */
|
|
58
|
+
header?: boolean;
|
|
54
59
|
}
|
|
55
60
|
/**
|
|
56
61
|
* Close a previously opened container node.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_opcodes.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_opcodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAC7B,WAAW,GACX,MAAM,GACN,QAAQ,GACR,eAAe,GACf,MAAM,GACN,SAAS,GACT,MAAM,GACN,UAAU,GACV,YAAY,GACZ,SAAS,GACT,WAAW,GACX,WAAW,GACX,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"mdz_opcodes.d.ts","sourceRoot":"../src/lib/","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":"../src/lib/","sources":["../src/lib/mdz_opcodes_to_nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EACX,OAAO,
|
|
1
|
+
{"version":3,"file":"mdz_opcodes_to_nodes.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_opcodes_to_nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EACX,OAAO,EASP,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAC,SAAS,EAAY,MAAM,kBAAkB,CAAC;AAyB3D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,KAAK,CAAC,SAAS,CAAC,KAAG,KAAK,CAAC,OAAO,CAgM7E,CAAC"}
|
|
@@ -43,6 +43,8 @@ export const mdz_opcodes_to_nodes = (opcodes) => {
|
|
|
43
43
|
ordered: op.ordered,
|
|
44
44
|
start_number: op.start_number,
|
|
45
45
|
number: op.number,
|
|
46
|
+
align: op.align,
|
|
47
|
+
header: op.header,
|
|
46
48
|
});
|
|
47
49
|
break;
|
|
48
50
|
}
|
|
@@ -359,6 +361,30 @@ const build_node = (frame, frame_children) => {
|
|
|
359
361
|
const end = frame_children.length > 0 ? frame_children[frame_children.length - 1].end : frame.end;
|
|
360
362
|
return { type: 'Blockquote', children: frame_children, start: frame.start, end };
|
|
361
363
|
}
|
|
364
|
+
case 'Table': {
|
|
365
|
+
// rows are the only children — `end` derives from the last, matching
|
|
366
|
+
// the sync token parser
|
|
367
|
+
const children = frame_children;
|
|
368
|
+
const end = children.length > 0 ? children[children.length - 1].end : frame.end;
|
|
369
|
+
return { type: 'Table', align: frame.align ?? [], children, start: frame.start, end };
|
|
370
|
+
}
|
|
371
|
+
case 'TableRow': {
|
|
372
|
+
const children = frame_children;
|
|
373
|
+
return {
|
|
374
|
+
type: 'TableRow',
|
|
375
|
+
header: frame.header ?? false,
|
|
376
|
+
children,
|
|
377
|
+
start: frame.start,
|
|
378
|
+
end: frame.end,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
case 'TableCell':
|
|
382
|
+
return {
|
|
383
|
+
type: 'TableCell',
|
|
384
|
+
children: mdz_merge_adjacent_text(frame_children),
|
|
385
|
+
start: frame.start,
|
|
386
|
+
end: frame.end,
|
|
387
|
+
};
|
|
362
388
|
case 'Code': {
|
|
363
389
|
// optimistic inline code container — concatenate children text into leaf MdzNodeCode
|
|
364
390
|
let content = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_stream_parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_stream_parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAiFhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;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"}
|
|
@@ -34,10 +34,11 @@
|
|
|
34
34
|
*
|
|
35
35
|
* @module
|
|
36
36
|
*/
|
|
37
|
-
import { BACKTICK, ASTERISK, UNDERSCORE, TILDE, NEWLINE, HYPHEN, HASH, LEFT_ANGLE, RIGHT_ANGLE, SLASH, LEFT_BRACKET, RIGHT_BRACKET, H_LOWER, H_UPPER, PERIOD, SPACE, ZERO, NINE, is_word_char, is_line_whitespace, mdz_match_blockquote_prefix, mdz_blockquote_line_has_content, mdz_blockquote_strip_width, mdz_remap_segments, } from './mdz_helpers.js';
|
|
37
|
+
import { BACKTICK, ASTERISK, UNDERSCORE, TILDE, NEWLINE, HYPHEN, HASH, PIPE, LEFT_ANGLE, RIGHT_ANGLE, SLASH, LEFT_BRACKET, RIGHT_BRACKET, H_LOWER, H_UPPER, PERIOD, SPACE, ZERO, NINE, is_word_char, is_line_whitespace, mdz_match_blockquote_prefix, mdz_blockquote_line_has_content, mdz_blockquote_strip_width, mdz_remap_segments, } from './mdz_helpers.js';
|
|
38
38
|
import { accumulate_text, alloc_id, close_all_list_levels, close_codeblock_at_eof, close_heading, close_paragraph, create_state, emit, find_open, flush_text, handle_paragraph_break, offset, pop_stack_entry, push_stack_entry, revert_failed_close, } from './mdz_stream_parser_state.js';
|
|
39
39
|
import { process_codeblock, process_codeblock_forced, process_codeblock_in_item, try_codeblock_open, try_heading, try_hr, } from './mdz_stream_parser_block.js';
|
|
40
40
|
import { process_list_line, try_list_start } from './mdz_stream_parser_list.js';
|
|
41
|
+
import { close_table, process_table_line, try_table_start } from './mdz_stream_parser_table.js';
|
|
41
42
|
import { check_close_word_boundary, close_delimiter, process_code_content, try_code, try_double_delimiter, try_italic, } from './mdz_stream_parser_inline.js';
|
|
42
43
|
import { try_close_tag, try_complete_link, try_link_open, try_tag_open, } from './mdz_stream_parser_link.js';
|
|
43
44
|
import { complete_pending_url, process_url_content, start_speculative_url, try_auto_path_absolute, try_auto_path_relative, try_auto_url_forced, } from './mdz_stream_parser_url.js';
|
|
@@ -146,6 +147,11 @@ const finish_state = (state) => {
|
|
|
146
147
|
if (state.buffer.length > 0) {
|
|
147
148
|
process_loop(state, true);
|
|
148
149
|
}
|
|
150
|
+
// close an open top-level table — forced processing ends it at the last
|
|
151
|
+
// row, but an already-drained buffer (everything consumed) needs this net
|
|
152
|
+
if (state.table) {
|
|
153
|
+
close_table(state);
|
|
154
|
+
}
|
|
149
155
|
// close an open blockquote — finishes its nested inner document (an
|
|
150
156
|
// unclosed fence inside ends at the quote's EOF, which is this) and
|
|
151
157
|
// cascades recursively through deeper quotes
|
|
@@ -477,6 +483,12 @@ const process_loop = (state, forced) => {
|
|
|
477
483
|
process_url_content(state, forced);
|
|
478
484
|
continue;
|
|
479
485
|
}
|
|
486
|
+
// open table — each line is a body row or ends the table
|
|
487
|
+
if (state.table) {
|
|
488
|
+
if (!process_table_line(state, forced))
|
|
489
|
+
return; // need more input
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
480
492
|
const char_code = state.buffer.charCodeAt(state.pos);
|
|
481
493
|
// newline handling
|
|
482
494
|
if (char_code === NEWLINE) {
|
|
@@ -567,6 +579,13 @@ const process_loop = (state, forced) => {
|
|
|
567
579
|
if (!forced && r === 'need_more')
|
|
568
580
|
return;
|
|
569
581
|
}
|
|
582
|
+
else if (char_code === PIPE) {
|
|
583
|
+
const r = try_table_start(state, forced);
|
|
584
|
+
if (r === 'consumed')
|
|
585
|
+
continue;
|
|
586
|
+
if (!forced && r === 'need_more')
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
570
589
|
}
|
|
571
590
|
// inline processing
|
|
572
591
|
if (!process_inline(state, forced))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser_list.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_stream_parser_list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser_list.d.ts","sourceRoot":"../src/lib/","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,YA+LZ,CAAC"}
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
|
-
import { BACKTICK, HYPHEN, MAX_LIST_NUMBER_DIGITS, MIN_CODEBLOCK_BACKTICKS, NEWLINE, NINE, PERIOD, RIGHT_ANGLE, SPACE, ZERO, is_line_whitespace, mdz_match_blockquote_prefix, mdz_blockquote_line_has_content, } from './mdz_helpers.js';
|
|
15
|
+
import { BACKTICK, HYPHEN, MAX_LIST_NUMBER_DIGITS, MIN_CODEBLOCK_BACKTICKS, NEWLINE, NINE, PERIOD, PIPE, RIGHT_ANGLE, SPACE, ZERO, is_line_whitespace, mdz_match_blockquote_prefix, mdz_blockquote_line_has_content, } from './mdz_helpers.js';
|
|
16
|
+
import { match_table_in_item_head, open_table_in_item } from './mdz_stream_parser_table.js';
|
|
16
17
|
import { accumulate_text, alloc_id, close_all_list_levels, close_list_item, close_list_level, close_list_run, close_paragraph, emit, extend_accumulated_end, flush_text, offset, push_stack_entry, } from './mdz_stream_parser_state.js';
|
|
17
18
|
/**
|
|
18
19
|
* Whether only line whitespace remains between `from` and the line's end —
|
|
@@ -410,6 +411,26 @@ export const process_list_line = (state, forced) => {
|
|
|
410
411
|
}
|
|
411
412
|
}
|
|
412
413
|
}
|
|
414
|
+
// a deeper pipe-row line whose next line is a delimiter becomes a table
|
|
415
|
+
// child of the item it would otherwise continue (the fence/quote precedent,
|
|
416
|
+
// a two-line lookahead held until the delimiter line arrives)
|
|
417
|
+
if (indent > 0 && buffer.charCodeAt(j) === PIPE) {
|
|
418
|
+
const target_idx = list_continuation_target(state, indent);
|
|
419
|
+
if (target_idx !== -1) {
|
|
420
|
+
const marker_indent = state.list_levels[target_idx].indent;
|
|
421
|
+
const head = match_table_in_item_head(state, j, marker_indent, forced);
|
|
422
|
+
if (head === 'pending')
|
|
423
|
+
return false;
|
|
424
|
+
if (head !== null) {
|
|
425
|
+
close_list_run(state);
|
|
426
|
+
while (state.list_levels.length - 1 > target_idx) {
|
|
427
|
+
close_list_level(state);
|
|
428
|
+
}
|
|
429
|
+
open_table_in_item(state, j, marker_indent, head);
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
413
434
|
if (run_current && indent > deepest.indent) {
|
|
414
435
|
// continuation line: soft break, structural indent stripped
|
|
415
436
|
return continue_run(state, nl_pos, j);
|
|
@@ -199,6 +199,18 @@ export interface MdzStreamParserState {
|
|
|
199
199
|
* quote (prefix stripping + nested-parser feeding) — see `MdzBlockquoteState`.
|
|
200
200
|
*/
|
|
201
201
|
blockquote: MdzBlockquoteState | null;
|
|
202
|
+
/**
|
|
203
|
+
* The open table, or null. While set, each line is consumed as a body row
|
|
204
|
+
* (or ends the table) by `process_table_line`. Holds the `Table` frame's id
|
|
205
|
+
* so the table can be closed when a non-row line or EOF ends it. `item_indent`
|
|
206
|
+
* is `null` for a top-level table (column-0 rows) or the enclosing list item's
|
|
207
|
+
* marker indent for a table nested as a block child (rows skip the indent and
|
|
208
|
+
* a dedent to that indent ends the table, returning control to the list).
|
|
209
|
+
*/
|
|
210
|
+
table: {
|
|
211
|
+
id: MdzNodeId;
|
|
212
|
+
item_indent: number | null;
|
|
213
|
+
} | null;
|
|
202
214
|
/**
|
|
203
215
|
* Whether the innermost open ListItem's first inline run is current.
|
|
204
216
|
* Content then flows directly into the ListItem frame — the sync AST
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_stream_parser_state.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_stream_parser_state.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser_state.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_stream_parser_state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,oBAAoB,EAAE,SAAS,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAGjF;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/D,cAAc;AACd,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,SAAS,CAAC;IACd,SAAS,EAAE,oBAAoB,CAAC;IAChC;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,wEAAwE;IACxE,YAAY,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,0BAA0B,EAAE,OAAO,CAAC;IACpC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAChC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,cAAc;AACd,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,SAAS,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IAClC,sCAAsC;IACtC,EAAE,EAAE,SAAS,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,oBAAoB,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,EAAE,KAAK,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAC7D,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,eAAe,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1B,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC;;;;;OAKG;IACH,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACjC;;;OAGG;IACH,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC;;;;;;;OAOG;IACH,KAAK,EAAE;QAAC,EAAE,EAAE,SAAS,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GAAG,IAAI,CAAC;IAC1D;;;;;;OAMG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAClD,8EAA8E;IAC9E,WAAW,EAAE,gBAAgB,CAAC;IAC9B,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,kBAAkB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC;;;;;;;OAOG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;;;;OAMG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,uEAAuE;IACvE,4BAA4B,EAAE,OAAO,CAAC;IACtC;;;;;OAKG;IACH,+BAA+B,EAAE,OAAO,CAAC;CACzC;AAED,cAAc;AACd,eAAO,MAAM,YAAY,QAAO,oBAiC9B,CAAC;AAEH,cAAc;AACd,eAAO,MAAM,QAAQ,GAAI,OAAO,oBAAoB,KAAG,SAA4B,CAAC;AAEpF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAC5B,OAAO,oBAAoB,EAC3B,IAAI,SAAS,EACb,WAAW,oBAAoB,EAC/B,OAAO,MAAM,EACb,YAAW,MAAW,EACtB,WAAW,MAAM,KACf,IAeF,CAAC;AAqBF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,oBAAoB,KAAG,UAI7D,CAAC;AAeF;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,oBAAoB,EAAE,MAAK,MAAkB,KAAG,MACtD,CAAC;AAgEzB;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,GAC3B,OAAO,oBAAoB,EAC3B,QAAQ,MAAM,EACd,MAAM,MAAM,KACV,MASF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,oBAAoB,EAAE,IAAI,SAAS,KAAG,IA6DjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC3B,OAAO,oBAAoB,EAC3B,MAAM,MAAM,EACZ,cAAc,MAAM,KAClB,IAMF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,EAAE,KAAK,MAAM,KAAG,IAEjF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,oBAAoB,KAAG,IAwBxD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,oBAAoB,KAAG,IAO9D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,WAAW,oBAAoB,KAAG,OACe,CAAC;AAElF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,oBAAoB,EAAE,MAAM,MAAM,gBAAgB,KAAG,MAiBrF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,oBAAoB,EAAE,YAAY,MAAM,KAAG,IAY9E,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,oBAAoB,EAAE,WAAW,MAAM,KAAG,IAwBpF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,oBAAoB,KAAG,IAgBnE,CAAC;AAEF,cAAc;AACd,eAAO,MAAM,eAAe,GAAI,OAAO,oBAAoB,KAAG,IAwB7D,CAAC;AAEF,cAAc;AACd,eAAO,MAAM,aAAa,GAAI,OAAO,oBAAoB,KAAG,IAwB3D,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,KAAG,IASpE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,oBAAoB,KAAG,IAWhE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,oBAAoB,KAAG,IAO5D,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,oBAAoB,KAAG,IAQ7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,oBAAoB,KAAG,IAK9D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,oBAAoB,KAAG,IAMnE,CAAC;AAEF,cAAc;AACd,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,KAAG,IAepE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table handlers for the streaming mdz parser.
|
|
3
|
+
*
|
|
4
|
+
* A table is recognized at a column-0 pipe row whose next line is a valid
|
|
5
|
+
* delimiter row with a matching column count — a bounded one-line lookahead:
|
|
6
|
+
* the header row holds (`need_more`) until its delimiter line arrives, then the
|
|
7
|
+
* whole header emits at once. Body rows then stream one per line. Because a row
|
|
8
|
+
* is always fully buffered before it emits (no within-row streaming), each
|
|
9
|
+
* cell's inline content is parsed with the sync reference (`MdzTableCellParser`,
|
|
10
|
+
* one `MdzLexer`/`MdzTokenParser` shared across the row's cells) and replayed
|
|
11
|
+
* as opcodes — guaranteeing sync↔stream parity by construction.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import { type MdzTableAlign } from './mdz.js';
|
|
16
|
+
import { type MdzStreamParserState, type TryResult } from './mdz_stream_parser_state.js';
|
|
17
|
+
/**
|
|
18
|
+
* Try to open a table at a column-0 pipe row. Returns `need_more` until both
|
|
19
|
+
* the header line and its delimiter line are buffered (or, in forced mode,
|
|
20
|
+
* resolvable), `not_match` when the two lines aren't a valid header+delimiter
|
|
21
|
+
* pair, and `consumed` once the table opens (closing any open paragraph first,
|
|
22
|
+
* emitting the header row, and leaving `state.pos` at the first body line).
|
|
23
|
+
*
|
|
24
|
+
* @nodocs
|
|
25
|
+
*/
|
|
26
|
+
export declare const try_table_start: (state: MdzStreamParserState, forced: boolean) => TryResult;
|
|
27
|
+
/**
|
|
28
|
+
* Process the line at `state.pos` while a table is open: emit it as a body row,
|
|
29
|
+
* or close the table when it isn't a valid pipe row. Returns false (need more
|
|
30
|
+
* input) only when a pipe-row line is started but not yet complete. A non-pipe
|
|
31
|
+
* line (including a blank line) ends the table and is left for normal
|
|
32
|
+
* processing.
|
|
33
|
+
*
|
|
34
|
+
* @nodocs
|
|
35
|
+
*/
|
|
36
|
+
export declare const process_table_line: (state: MdzStreamParserState, forced: boolean) => boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Close the open table.
|
|
39
|
+
*
|
|
40
|
+
* @nodocs
|
|
41
|
+
*/
|
|
42
|
+
export declare const close_table: (state: MdzStreamParserState) => void;
|
|
43
|
+
/** A recognized in-item table head: the header row's cells + the delimiter alignment. */
|
|
44
|
+
export interface TableInItemHead {
|
|
45
|
+
header_cells: Array<{
|
|
46
|
+
start: number;
|
|
47
|
+
end: number;
|
|
48
|
+
}>;
|
|
49
|
+
header_end: number;
|
|
50
|
+
align: Array<MdzTableAlign>;
|
|
51
|
+
delim_end: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Recognize a table opening as a block child of a list item: a pipe row at
|
|
55
|
+
* `header_first` (the line's indent already skipped) whose next line is a
|
|
56
|
+
* delimiter row, both indented past `marker_indent` (so both stay inside the
|
|
57
|
+
* item). Returns the parsed head, `'pending'` when the two-line lookahead isn't
|
|
58
|
+
* fully buffered, or `null` when it isn't a table.
|
|
59
|
+
*
|
|
60
|
+
* @nodocs
|
|
61
|
+
*/
|
|
62
|
+
export declare const match_table_in_item_head: (state: MdzStreamParserState, header_first: number, marker_indent: number, forced: boolean) => TableInItemHead | "pending" | null;
|
|
63
|
+
/**
|
|
64
|
+
* Open a table as a block child of a list item at `marker_indent`, given a
|
|
65
|
+
* `head` from `match_table_in_item_head`. Emits the `Table` open + header row
|
|
66
|
+
* and enters table mode (with `item_indent`), leaving `state.pos` at the first
|
|
67
|
+
* body line. The caller closes the item's run and pops to the attach level first.
|
|
68
|
+
*
|
|
69
|
+
* @nodocs
|
|
70
|
+
*/
|
|
71
|
+
export declare const open_table_in_item: (state: MdzStreamParserState, header_first: number, marker_indent: number, head: TableInItemHead) => void;
|
|
72
|
+
//# sourceMappingURL=mdz_stream_parser_table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdz_stream_parser_table.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_stream_parser_table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,OAAO,EAAmC,KAAK,aAAa,EAAC,MAAM,UAAU,CAAC;AAC9E,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,SAAS,EAQd,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,oBAAoB,EAAE,QAAQ,OAAO,KAAG,SAqC9E,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,oBAAoB,EAAE,QAAQ,OAAO,KAAG,OAyCjF,CAAC;AA2DF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,oBAAoB,KAAG,IAczD,CAAC;AAEF,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,GACpC,OAAO,oBAAoB,EAC3B,cAAc,MAAM,EACpB,eAAe,MAAM,EACrB,QAAQ,OAAO,KACb,eAAe,GAAG,SAAS,GAAG,IAmBhC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAC9B,OAAO,oBAAoB,EAC3B,cAAc,MAAM,EACpB,eAAe,MAAM,EACrB,MAAM,eAAe,KACnB,IAkBF,CAAC"}
|