@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.
Files changed (60) hide show
  1. package/README.md +4 -0
  2. package/dist/MdzNodeView.svelte +30 -1
  3. package/dist/MdzNodeView.svelte.d.ts.map +1 -1
  4. package/dist/MdzStreamNodeView.svelte +31 -0
  5. package/dist/MdzStreamNodeView.svelte.d.ts.map +1 -1
  6. package/dist/context_helpers.d.ts +1 -1
  7. package/dist/mdz.d.ts +53 -2
  8. package/dist/mdz.d.ts.map +1 -1
  9. package/dist/mdz.js +29 -1
  10. package/dist/mdz_helpers.d.ts +35 -1
  11. package/dist/mdz_helpers.d.ts.map +1 -1
  12. package/dist/mdz_helpers.js +120 -0
  13. package/dist/mdz_lexer.d.ts +35 -1
  14. package/dist/mdz_lexer.d.ts.map +1 -1
  15. package/dist/mdz_lexer.js +211 -2
  16. package/dist/mdz_opcodes.d.ts +6 -1
  17. package/dist/mdz_opcodes.d.ts.map +1 -1
  18. package/dist/mdz_opcodes_to_nodes.d.ts.map +1 -1
  19. package/dist/mdz_opcodes_to_nodes.js +26 -0
  20. package/dist/mdz_stream_parser.d.ts.map +1 -1
  21. package/dist/mdz_stream_parser.js +20 -1
  22. package/dist/mdz_stream_parser_list.d.ts.map +1 -1
  23. package/dist/mdz_stream_parser_list.js +22 -1
  24. package/dist/mdz_stream_parser_state.d.ts +12 -0
  25. package/dist/mdz_stream_parser_state.d.ts.map +1 -1
  26. package/dist/mdz_stream_parser_state.js +1 -0
  27. package/dist/mdz_stream_parser_table.d.ts +72 -0
  28. package/dist/mdz_stream_parser_table.d.ts.map +1 -0
  29. package/dist/mdz_stream_parser_table.js +351 -0
  30. package/dist/mdz_stream_state.svelte.d.ts +5 -0
  31. package/dist/mdz_stream_state.svelte.d.ts.map +1 -1
  32. package/dist/mdz_stream_state.svelte.js +8 -0
  33. package/dist/mdz_to_svelte.d.ts.map +1 -1
  34. package/dist/mdz_to_svelte.js +37 -3
  35. package/dist/mdz_token_parser.d.ts +16 -0
  36. package/dist/mdz_token_parser.d.ts.map +1 -1
  37. package/dist/mdz_token_parser.js +101 -2
  38. package/dist/svelte_preprocess_mdz.js +2 -2
  39. package/package.json +8 -8
  40. package/src/lib/context_helpers.ts +1 -1
  41. package/src/lib/mdz.ts +70 -3
  42. package/src/lib/mdz_contexts.ts +1 -1
  43. package/src/lib/mdz_helpers.ts +125 -1
  44. package/src/lib/mdz_lexer.ts +262 -3
  45. package/src/lib/mdz_opcodes.ts +10 -1
  46. package/src/lib/mdz_opcodes_to_nodes.ts +37 -3
  47. package/src/lib/mdz_stream_parser.ts +26 -9
  48. package/src/lib/mdz_stream_parser_block.ts +2 -2
  49. package/src/lib/mdz_stream_parser_inline.ts +4 -4
  50. package/src/lib/mdz_stream_parser_link.ts +3 -3
  51. package/src/lib/mdz_stream_parser_list.ts +24 -2
  52. package/src/lib/mdz_stream_parser_state.ts +12 -2
  53. package/src/lib/mdz_stream_parser_table.ts +409 -0
  54. package/src/lib/mdz_stream_parser_text.ts +2 -2
  55. package/src/lib/mdz_stream_parser_url.ts +2 -2
  56. package/src/lib/mdz_stream_state.svelte.ts +8 -1
  57. package/src/lib/mdz_to_svelte.ts +39 -5
  58. package/src/lib/mdz_token_parser.ts +122 -5
  59. package/src/lib/svelte_preprocess_mdz.ts +4 -4
  60. 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
  }
@@ -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":"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"}
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,EAMP,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAC,SAAS,EAAY,MAAM,kBAAkB,CAAC;AAuB3D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,KAAK,CAAC,SAAS,CAAC,KAAG,KAAK,CAAC,OAAO,CA8L7E,CAAC"}
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;AA+EhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
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;AAiBH,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,YA2KZ,CAAC"}
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":"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"}
@@ -24,6 +24,7 @@ export const create_state = () => ({
24
24
  codeblock: null,
25
25
  list_levels: [],
26
26
  blockquote: null,
27
+ table: null,
27
28
  in_list_item_run: false,
28
29
  last_empty_item_end: 0,
29
30
  base_offset: 0,
@@ -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"}