@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/README.md
CHANGED
|
@@ -27,6 +27,10 @@ For more see the [docs](https://mdz.fuz.dev/docs).
|
|
|
27
27
|
AI disclosure: almost everything here was generated by machine agents except
|
|
28
28
|
for the designs and intros. mdz is the result of 5+ years of prototyping ideas.
|
|
29
29
|
|
|
30
|
+
> ⚠️ This project is pre-stable: breaking changes are expected and
|
|
31
|
+
> some features (like attributes) are not yet implemented.
|
|
32
|
+
> Feedback is welcome!
|
|
33
|
+
|
|
30
34
|
## License
|
|
31
35
|
|
|
32
36
|
[MIT](LICENSE)
|
package/dist/MdzNodeView.svelte
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import {resolve} from '$app/paths';
|
|
3
3
|
|
|
4
|
-
import type {MdzNode} from './mdz.js';
|
|
4
|
+
import type {MdzNode, MdzNodeTableRow, MdzTableAlign} from './mdz.js';
|
|
5
5
|
import {
|
|
6
6
|
mdz_resolve_relative_path,
|
|
7
7
|
mdz_is_safe_reference,
|
|
@@ -108,6 +108,25 @@
|
|
|
108
108
|
<li>{@render render_children(node.children)}</li>
|
|
109
109
|
{:else if node.type === 'Blockquote'}
|
|
110
110
|
<blockquote>{@render render_children(node.children)}</blockquote>
|
|
111
|
+
{:else if node.type === 'Table'}
|
|
112
|
+
{@const header_rows = node.children.filter((r) => r.header)}
|
|
113
|
+
{@const body_rows = node.children.filter((r) => !r.header)}
|
|
114
|
+
<table>
|
|
115
|
+
{#if header_rows.length > 0}
|
|
116
|
+
<thead>
|
|
117
|
+
{#each header_rows as row (row)}
|
|
118
|
+
<tr>{@render render_cells(row, 'th', node.align)}</tr>
|
|
119
|
+
{/each}
|
|
120
|
+
</thead>
|
|
121
|
+
{/if}
|
|
122
|
+
{#if body_rows.length > 0}
|
|
123
|
+
<tbody>
|
|
124
|
+
{#each body_rows as row (row)}
|
|
125
|
+
<tr>{@render render_cells(row, 'td', node.align)}</tr>
|
|
126
|
+
{/each}
|
|
127
|
+
</tbody>
|
|
128
|
+
{/if}
|
|
129
|
+
</table>
|
|
111
130
|
{:else if node.type === 'Hr'}
|
|
112
131
|
<hr />
|
|
113
132
|
{:else if node.type === 'Heading'}
|
|
@@ -129,6 +148,16 @@
|
|
|
129
148
|
{/each}
|
|
130
149
|
{/snippet}
|
|
131
150
|
|
|
151
|
+
{#snippet render_cells(row: MdzNodeTableRow, tag: 'th' | 'td', align: Array<MdzTableAlign>)}
|
|
152
|
+
<!-- normalize to the column count: pad short rows, ignore extra cells -->
|
|
153
|
+
{#each align as a, i (i)}
|
|
154
|
+
{@const cell = row.children[i]}
|
|
155
|
+
<svelte:element this={tag} style={a ? `text-align:${a}` : undefined}>
|
|
156
|
+
{#if cell}{@render render_children(cell.children)}{/if}
|
|
157
|
+
</svelte:element>
|
|
158
|
+
{/each}
|
|
159
|
+
{/snippet}
|
|
160
|
+
|
|
132
161
|
{#snippet render_unregistered_tag(name: string, children: Array<MdzNode>)}
|
|
133
162
|
{#if children.length > 0}
|
|
134
163
|
<code class="color_c_50"><{name}></code>{@render render_children(children)}<code
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MdzNodeView.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzNodeView.svelte"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"MdzNodeView.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzNodeView.svelte"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,OAAO,EAAiC,MAAM,UAAU,CAAC;AAMtE,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAS9C,KAAK,gBAAgB,GAAI;IACxB,IAAI,EAAE,OAAO,CAAC;CACd,CAAC;AA+JH,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
mdz_codeblock_context,
|
|
16
16
|
} from './mdz_contexts.js';
|
|
17
17
|
import type {MdzStreamNode} from './mdz_stream_state.svelte.js';
|
|
18
|
+
import type {MdzTableAlign} from './mdz.js';
|
|
18
19
|
|
|
19
20
|
const {
|
|
20
21
|
node,
|
|
@@ -117,6 +118,26 @@
|
|
|
117
118
|
<li>{@render render_children(node.children)}</li>
|
|
118
119
|
{:else if node.type === 'Blockquote'}
|
|
119
120
|
<blockquote>{@render render_children(node.children)}</blockquote>
|
|
121
|
+
{:else if node.type === 'Table'}
|
|
122
|
+
{@const align = node.align ?? []}
|
|
123
|
+
{@const header_rows = node.children.filter((r) => r.header)}
|
|
124
|
+
{@const body_rows = node.children.filter((r) => !r.header)}
|
|
125
|
+
<table>
|
|
126
|
+
{#if header_rows.length > 0}
|
|
127
|
+
<thead>
|
|
128
|
+
{#each header_rows as row (row.id)}
|
|
129
|
+
<tr>{@render render_cells(row, 'th', align)}</tr>
|
|
130
|
+
{/each}
|
|
131
|
+
</thead>
|
|
132
|
+
{/if}
|
|
133
|
+
{#if body_rows.length > 0}
|
|
134
|
+
<tbody>
|
|
135
|
+
{#each body_rows as row (row.id)}
|
|
136
|
+
<tr>{@render render_cells(row, 'td', align)}</tr>
|
|
137
|
+
{/each}
|
|
138
|
+
</tbody>
|
|
139
|
+
{/if}
|
|
140
|
+
</table>
|
|
120
141
|
{:else if node.type === 'Hr'}
|
|
121
142
|
<hr />
|
|
122
143
|
{:else if node.type === 'Heading'}
|
|
@@ -139,6 +160,16 @@
|
|
|
139
160
|
{/each}
|
|
140
161
|
{/snippet}
|
|
141
162
|
|
|
163
|
+
{#snippet render_cells(row: MdzStreamNode, tag: 'th' | 'td', align: Array<MdzTableAlign>)}
|
|
164
|
+
<!-- normalize to the column count: pad short rows, ignore extra cells -->
|
|
165
|
+
{#each align as a, i (i)}
|
|
166
|
+
{@const cell = row.children[i]}
|
|
167
|
+
<svelte:element this={tag} style={a ? `text-align:${a}` : undefined}>
|
|
168
|
+
{#if cell}{@render render_children(cell.children)}{/if}
|
|
169
|
+
</svelte:element>
|
|
170
|
+
{/each}
|
|
171
|
+
{/snippet}
|
|
172
|
+
|
|
142
173
|
{#snippet render_unregistered_tag(name: string, children: Array<MdzStreamNode>)}
|
|
143
174
|
{#if children.length > 0}
|
|
144
175
|
<code class="color_c_50"><{name}></code>{@render render_children(children)}<code
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MdzStreamNodeView.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzStreamNodeView.svelte"],"names":[],"mappings":"AAUA,OAAO,iBAAiB,MAAM,4BAA4B,CAAC;AAQ3D,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"MdzStreamNodeView.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzStreamNodeView.svelte"],"names":[],"mappings":"AAUA,OAAO,iBAAiB,MAAM,4BAA4B,CAAC;AAQ3D,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAG/D,KAAK,gBAAgB,GAAI;IACxB,IAAI,EAAE,aAAa,CAAC;CACpB,CAAC;AA2KH,QAAA,MAAM,iBAAiB,sDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* If a `fallback` is provided, the `value` argument to `set` is optional
|
|
6
6
|
* and `get_maybe` is omitted from the type.
|
|
7
7
|
*
|
|
8
|
-
* Vendored from `@fuzdev/fuz_ui/context_helpers.
|
|
8
|
+
* Vendored from `@fuzdev/fuz_ui/context_helpers.ts` — fuz_ui sits above mdz
|
|
9
9
|
* in the dependency graph, so mdz keeps its own copy for `mdz_contexts.ts`.
|
|
10
10
|
* Consumers should import fuz_ui's.
|
|
11
11
|
*
|
package/dist/mdz.d.ts
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* - inline code in backticks (creates `Code` nodes; auto-linking to identifiers/modules
|
|
20
20
|
* is handled by the rendering layer via `MdzNodeView.svelte`)
|
|
21
21
|
* - paragraph breaks (blank lines)
|
|
22
|
-
* - block elements: headings, horizontal rules, lists, blockquotes, code blocks
|
|
22
|
+
* - block elements: headings, horizontal rules, lists, blockquotes, code blocks, tables
|
|
23
23
|
* - HTML elements and Svelte components (opt-in via context)
|
|
24
24
|
*
|
|
25
25
|
* Whitespace: the parser preserves whitespace in text node content (single
|
|
@@ -56,7 +56,29 @@
|
|
|
56
56
|
* then `MdzTokenParser` builds the `MdzNode[]` tree from the tokens.
|
|
57
57
|
*/
|
|
58
58
|
export declare const mdz_parse: (text: string) => Array<MdzNode>;
|
|
59
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Parses table cells' inline content for the streaming parser, sharing one
|
|
61
|
+
* `MdzLexer` + `MdzTokenParser` across a row's cells rather than allocating a
|
|
62
|
+
* fresh pair (and search-memo `Map`) per cell. Bind to the buffer holding the
|
|
63
|
+
* row, then call `parse` once per cell `[cell_start, cell_end)` span; each
|
|
64
|
+
* call yields inline `MdzNode`s honoring code-span protection and the `\|`
|
|
65
|
+
* escape, matching the sync reference exactly — it *is* the sync lexer/parser,
|
|
66
|
+
* reset per cell, mirroring how the sync lexer already reuses one instance
|
|
67
|
+
* across a table's cells.
|
|
68
|
+
*
|
|
69
|
+
* The sync pipeline never needs this seam: its `MdzLexer` tokenizes a table's
|
|
70
|
+
* cells in place. Only the streaming path, which parses each fully-buffered
|
|
71
|
+
* cell out of band, would otherwise allocate per cell.
|
|
72
|
+
*
|
|
73
|
+
* @nodocs
|
|
74
|
+
*/
|
|
75
|
+
export declare class MdzTableCellParser {
|
|
76
|
+
#private;
|
|
77
|
+
/** @param text - the buffer the cell spans index into (stable across a row). */
|
|
78
|
+
constructor(text: string);
|
|
79
|
+
parse(cell_start: number, cell_end: number): Array<MdzNode>;
|
|
80
|
+
}
|
|
81
|
+
export type MdzNode = MdzNodeText | MdzNodeCode | MdzNodeCodeblock | MdzNodeBold | MdzNodeItalic | MdzNodeStrikethrough | MdzNodeLink | MdzNodeParagraph | MdzNodeHr | MdzNodeHeading | MdzNodeList | MdzNodeListItem | MdzNodeBlockquote | MdzNodeTable | MdzNodeTableRow | MdzNodeTableCell | MdzNodeElement | MdzNodeComponent;
|
|
60
82
|
export interface MdzNodeBase {
|
|
61
83
|
type: string;
|
|
62
84
|
start: number;
|
|
@@ -137,6 +159,35 @@ export interface MdzNodeBlockquote extends MdzNodeBase {
|
|
|
137
159
|
*/
|
|
138
160
|
children: Array<MdzNode>;
|
|
139
161
|
}
|
|
162
|
+
/** Per-column text alignment from the delimiter row's colons; `null` is the default (no alignment). */
|
|
163
|
+
export type MdzTableAlign = 'left' | 'center' | 'right' | null;
|
|
164
|
+
export interface MdzNodeTable extends MdzNodeBase {
|
|
165
|
+
type: 'Table';
|
|
166
|
+
/**
|
|
167
|
+
* Per-column alignment, length equal to the delimiter row's column count.
|
|
168
|
+
* Rendered as `text-align` on each cell; tooling can read it to re-theme
|
|
169
|
+
* (e.g. a CSP-strict consumer that avoids inline styles).
|
|
170
|
+
*/
|
|
171
|
+
align: Array<MdzTableAlign>;
|
|
172
|
+
/** The header row first, then any body rows. */
|
|
173
|
+
children: Array<MdzNodeTableRow>;
|
|
174
|
+
}
|
|
175
|
+
export interface MdzNodeTableRow extends MdzNodeBase {
|
|
176
|
+
type: 'TableRow';
|
|
177
|
+
/** `true` for the header row (renders `thead`/`th`); `false` for body rows (`tbody`/`td`). */
|
|
178
|
+
header: boolean;
|
|
179
|
+
/**
|
|
180
|
+
* The row's authored cells, preserved as written. The renderer normalizes to
|
|
181
|
+
* the column count: short rows are padded with empty cells, cells past the
|
|
182
|
+
* column count are ignored (their content survives here for tooling).
|
|
183
|
+
*/
|
|
184
|
+
children: Array<MdzNodeTableCell>;
|
|
185
|
+
}
|
|
186
|
+
export interface MdzNodeTableCell extends MdzNodeBase {
|
|
187
|
+
type: 'TableCell';
|
|
188
|
+
/** Inline content only (text, bold, italic, strikethrough, code, links). */
|
|
189
|
+
children: Array<MdzNode>;
|
|
190
|
+
}
|
|
140
191
|
export interface MdzNodeElement extends MdzNodeBase {
|
|
141
192
|
type: 'Element';
|
|
142
193
|
/** HTML element name (e.g. `div`, `span`, `aside`). */
|
package/dist/mdz.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mdz.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz.ts"],"names":[],"mappings":"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"}
|
package/dist/mdz.js
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* - inline code in backticks (creates `Code` nodes; auto-linking to identifiers/modules
|
|
20
20
|
* is handled by the rendering layer via `MdzNodeView.svelte`)
|
|
21
21
|
* - paragraph breaks (blank lines)
|
|
22
|
-
* - block elements: headings, horizontal rules, lists, blockquotes, code blocks
|
|
22
|
+
* - block elements: headings, horizontal rules, lists, blockquotes, code blocks, tables
|
|
23
23
|
* - HTML elements and Svelte components (opt-in via context)
|
|
24
24
|
*
|
|
25
25
|
* Whitespace: the parser preserves whitespace in text node content (single
|
|
@@ -59,3 +59,31 @@ import { MdzTokenParser } from './mdz_token_parser.js';
|
|
|
59
59
|
* then `MdzTokenParser` builds the `MdzNode[]` tree from the tokens.
|
|
60
60
|
*/
|
|
61
61
|
export const mdz_parse = (text) => new MdzTokenParser(new MdzLexer(text).tokenize()).parse();
|
|
62
|
+
/**
|
|
63
|
+
* Parses table cells' inline content for the streaming parser, sharing one
|
|
64
|
+
* `MdzLexer` + `MdzTokenParser` across a row's cells rather than allocating a
|
|
65
|
+
* fresh pair (and search-memo `Map`) per cell. Bind to the buffer holding the
|
|
66
|
+
* row, then call `parse` once per cell `[cell_start, cell_end)` span; each
|
|
67
|
+
* call yields inline `MdzNode`s honoring code-span protection and the `\|`
|
|
68
|
+
* escape, matching the sync reference exactly — it *is* the sync lexer/parser,
|
|
69
|
+
* reset per cell, mirroring how the sync lexer already reuses one instance
|
|
70
|
+
* across a table's cells.
|
|
71
|
+
*
|
|
72
|
+
* The sync pipeline never needs this seam: its `MdzLexer` tokenizes a table's
|
|
73
|
+
* cells in place. Only the streaming path, which parses each fully-buffered
|
|
74
|
+
* cell out of band, would otherwise allocate per cell.
|
|
75
|
+
*
|
|
76
|
+
* @nodocs
|
|
77
|
+
*/
|
|
78
|
+
export class MdzTableCellParser {
|
|
79
|
+
#lexer;
|
|
80
|
+
#parser = new MdzTokenParser([]);
|
|
81
|
+
/** @param text - the buffer the cell spans index into (stable across a row). */
|
|
82
|
+
constructor(text) {
|
|
83
|
+
this.#lexer = new MdzLexer(text);
|
|
84
|
+
}
|
|
85
|
+
parse(cell_start, cell_end) {
|
|
86
|
+
this.#parser.reset(this.#lexer.lex_table_cell(cell_start, cell_end));
|
|
87
|
+
return this.#parser.parse_inline_run();
|
|
88
|
+
}
|
|
89
|
+
}
|
package/dist/mdz_helpers.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
import type { MdzNode, MdzNodeComponent, MdzNodeElement } from './mdz.js';
|
|
9
|
+
import type { MdzNode, MdzNodeComponent, MdzNodeElement, MdzTableAlign } from './mdz.js';
|
|
10
10
|
/** @nodocs */
|
|
11
11
|
export declare const BACKTICK = 96;
|
|
12
12
|
/** @nodocs */
|
|
@@ -44,6 +44,10 @@ export declare const RIGHT_PAREN = 41;
|
|
|
44
44
|
/** @nodocs */
|
|
45
45
|
export declare const COLON = 58;
|
|
46
46
|
/** @nodocs */
|
|
47
|
+
export declare const PIPE = 124;
|
|
48
|
+
/** @nodocs */
|
|
49
|
+
export declare const BACKSLASH = 92;
|
|
50
|
+
/** @nodocs */
|
|
47
51
|
export declare const PERIOD = 46;
|
|
48
52
|
/** @nodocs */
|
|
49
53
|
export declare const COMMA = 44;
|
|
@@ -187,6 +191,36 @@ export declare const mdz_remap_segments: (segments: Array<{
|
|
|
187
191
|
inner_start: number;
|
|
188
192
|
source_start: number;
|
|
189
193
|
}>, p: number) => number;
|
|
194
|
+
/**
|
|
195
|
+
* Split a table row line `[line_start, line_end)` into its cell-content spans.
|
|
196
|
+
*
|
|
197
|
+
* A valid row starts with `|` and ends — after optional trailing whitespace —
|
|
198
|
+
* with `|`, yielding at least one cell. Returns each cell's trimmed
|
|
199
|
+
* `[start, end)` source span, or `null` when the line is not a valid pipe row
|
|
200
|
+
* (no leading `|`, no trailing `|`, or zero cells).
|
|
201
|
+
*
|
|
202
|
+
* Pipe-finding honors two protections so the cell content can hold a literal
|
|
203
|
+
* `|`: an inline-code span (a `` ` `` to its matching `` ` `` on the same line —
|
|
204
|
+
* an unclosed `` ` `` is literal and protects nothing) shields the pipes inside
|
|
205
|
+
* it, and a `\|` escape is consumed as a literal pipe. The escape is
|
|
206
|
+
* table-cell-scoped — the caller's inline tokenizer performs the matching
|
|
207
|
+
* `\|` → `|` substitution; this scanner only declines to split there.
|
|
208
|
+
*
|
|
209
|
+
* @nodocs
|
|
210
|
+
*/
|
|
211
|
+
export declare const mdz_split_table_row: (text: string, line_start: number, line_end: number) => Array<{
|
|
212
|
+
start: number;
|
|
213
|
+
end: number;
|
|
214
|
+
}> | null;
|
|
215
|
+
/**
|
|
216
|
+
* Parse a table delimiter row (`| --- | :-: | ---: |`) into its per-column
|
|
217
|
+
* alignment, or `null` when the line is not a valid delimiter row. Each cell
|
|
218
|
+
* must be an optional leading `:`, one or more `-`, and an optional trailing
|
|
219
|
+
* `:`. Splits with `mdz_split_table_row` so the column count matches the header.
|
|
220
|
+
*
|
|
221
|
+
* @nodocs
|
|
222
|
+
*/
|
|
223
|
+
export declare const mdz_parse_table_delimiter: (text: string, line_start: number, line_end: number) => Array<MdzTableAlign> | null;
|
|
190
224
|
/**
|
|
191
225
|
* Lowercase an ASCII letter code; passes other chars through.
|
|
192
226
|
* Mirrors the `[A-Z] → [a-z]` shift without touching non-ASCII.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAe,gBAAgB,EAAE,cAAc,EAAC,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"mdz_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAe,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAC,MAAM,UAAU,CAAC;AAGpG,cAAc;AACd,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,cAAc;AACd,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,cAAc;AACd,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,cAAc;AACd,eAAO,MAAM,KAAK,MAAM,CAAC;AACzB,cAAc;AACd,eAAO,MAAM,OAAO,KAAK,CAAC;AAC1B,cAAc;AACd,eAAO,MAAM,MAAM,KAAK,CAAC;AACzB,cAAc;AACd,eAAO,MAAM,IAAI,KAAK,CAAC;AACvB,cAAc;AACd,eAAO,MAAM,KAAK,KAAK,CAAC;AACxB,cAAc;AACd,eAAO,MAAM,GAAG,IAAI,CAAC;AACrB,cAAc;AACd,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,cAAc;AACd,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,cAAc;AACd,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,cAAc;AACd,eAAO,MAAM,KAAK,KAAK,CAAC;AACxB,cAAc;AACd,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,cAAc;AACd,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,cAAc;AACd,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,cAAc;AACd,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,cAAc;AACd,eAAO,MAAM,KAAK,KAAK,CAAC;AACxB,cAAc;AACd,eAAO,MAAM,IAAI,MAAM,CAAC;AACxB,cAAc;AACd,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,cAAc;AACd,eAAO,MAAM,MAAM,KAAK,CAAC;AACzB,cAAc;AACd,eAAO,MAAM,KAAK,KAAK,CAAC;AACxB,cAAc;AACd,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,cAAc;AACd,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,cAAc;AACd,eAAO,MAAM,QAAQ,KAAK,CAAC;AAE3B,cAAc;AACd,eAAO,MAAM,MAAM,KAAK,CAAC;AACzB,cAAc;AACd,eAAO,MAAM,OAAO,KAAK,CAAC;AAC1B,cAAc;AACd,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,cAAc;AACd,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,cAAc;AACd,eAAO,MAAM,IAAI,KAAK,CAAC;AACvB,cAAc;AACd,eAAO,MAAM,MAAM,KAAK,CAAC;AACzB,cAAc;AACd,eAAO,MAAM,EAAE,KAAK,CAAC;AAErB,cAAc;AACd,eAAO,MAAM,OAAO,KAAK,CAAC;AAC1B,cAAc;AACd,eAAO,MAAM,OAAO,KAAK,CAAC;AAC1B,cAAc;AACd,eAAO,MAAM,OAAO,KAAK,CAAC;AAC1B,cAAc;AACd,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,cAAc;AACd,eAAO,MAAM,IAAI,KAAK,CAAC;AACvB,cAAc;AACd,eAAO,MAAM,GAAG,KAAK,CAAC;AACtB,cAAc;AACd,eAAO,MAAM,IAAI,KAAK,CAAC;AAEvB,cAAc;AACd,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,cAAc;AACd,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,cAAc;AACd,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,cAAc;AACd,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,cAAc;AACd,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,cAAc;AACd,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,cAAc;AACd,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,cAAc;AACd,eAAO,MAAM,OAAO,KAAK,CAAC;AAE1B;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,KAAG,OACmB,CAAC;AAE3E;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,OAOjD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IACnC,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,2BAA2B,GACvC,MAAM,MAAM,EACZ,GAAG,MAAM,EACT,QAAQ,OAAO,KACb,mBAAmB,GAAG,SAAS,GAAG,IAiDpC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,GAC3C,MAAM,MAAM,EACZ,eAAe,MAAM,EACrB,QAAQ,OAAO,KACb,OAAO,GAAG,SAOZ,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,EAAE,GAAG,MAAM,KAAG,MACL,CAAC;AAEjE;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAC9B,UAAU,KAAK,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAC,CAAC,EAC5D,GAAG,MAAM,KACP,MAaF,CAAC;AAiBF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,mBAAmB,GAC/B,MAAM,MAAM,EACZ,YAAY,MAAM,EAClB,UAAU,MAAM,KACd,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC,GAAG,IA0CxC,CAAC;AAkBF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,GACrC,MAAM,MAAM,EACZ,YAAY,MAAM,EAClB,UAAU,MAAM,KACd,KAAK,CAAC,aAAa,CAAC,GAAG,IAUzB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,KAAG,MACuB,CAAC;AAE3E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iCAAiC,GAAI,GAAG,MAAM,EAAE,KAAK,MAAM,KAAG,CAAC,GAAG,CAAC,GAAG,CA4BlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW,MAAM,KAAG,OACmD,CAAC;AAElG;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,KAAG,OAI5B,CAAC;AAE1B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,KAAG,OAGR,CAAC;AA+C1C,cAAc;AACd,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,KAAG,OACH,CAAC;AAErD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GAAI,KAAK,MAAM,KAAG,MA8CtD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,OASjE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,OAsBjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,CAAC,OAAO,CAAC,KAAG,MAG9C,CAAC;AAYZ;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,KAAK,CAAC,OAAO,CAAC,KAAG,MAA0C,CAAC;AAElG;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,MAAM,MAAM,KAAG,MAAuB,CAAC;AAQhF,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,KAAG,OAA8B,CAAC;AAQtE,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,KAAG,OACQ,CAAC;AAkBnE;;;GAGG;AAIH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,OAAkC,CAAC;AAEtF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,GAAI,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,MAgB3E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,KAAG,IAU3E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,KAAK,CAAC,OAAO,CAAC,KAAG,KAAK,CAAC,OAAO,CAuC5E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAClC,OAAO,KAAK,CAAC,OAAO,CAAC,KACnB,gBAAgB,GAAG,cAAc,GAAG,IAiBtC,CAAC"}
|
package/dist/mdz_helpers.js
CHANGED
|
@@ -44,6 +44,10 @@ export const RIGHT_PAREN = 41; // )
|
|
|
44
44
|
/** @nodocs */
|
|
45
45
|
export const COLON = 58; // :
|
|
46
46
|
/** @nodocs */
|
|
47
|
+
export const PIPE = 124; // |
|
|
48
|
+
/** @nodocs */
|
|
49
|
+
export const BACKSLASH = 92; // \
|
|
50
|
+
/** @nodocs */
|
|
47
51
|
export const PERIOD = 46; // .
|
|
48
52
|
/** @nodocs */
|
|
49
53
|
export const COMMA = 44; // ,
|
|
@@ -252,6 +256,122 @@ export const mdz_remap_segments = (segments, p) => {
|
|
|
252
256
|
const seg = segments[lo];
|
|
253
257
|
return seg.source_start + (p - seg.inner_start);
|
|
254
258
|
};
|
|
259
|
+
// -- Table helpers --
|
|
260
|
+
/** Trim line-whitespace from both ends of a `[start, end)` span. */
|
|
261
|
+
const trim_table_cell = (text, start, end) => {
|
|
262
|
+
let s = start;
|
|
263
|
+
let e = end;
|
|
264
|
+
while (s < e && is_line_whitespace(text.charCodeAt(s)))
|
|
265
|
+
s++;
|
|
266
|
+
while (e > s && is_line_whitespace(text.charCodeAt(e - 1)))
|
|
267
|
+
e--;
|
|
268
|
+
return { start: s, end: e };
|
|
269
|
+
};
|
|
270
|
+
/**
|
|
271
|
+
* Split a table row line `[line_start, line_end)` into its cell-content spans.
|
|
272
|
+
*
|
|
273
|
+
* A valid row starts with `|` and ends — after optional trailing whitespace —
|
|
274
|
+
* with `|`, yielding at least one cell. Returns each cell's trimmed
|
|
275
|
+
* `[start, end)` source span, or `null` when the line is not a valid pipe row
|
|
276
|
+
* (no leading `|`, no trailing `|`, or zero cells).
|
|
277
|
+
*
|
|
278
|
+
* Pipe-finding honors two protections so the cell content can hold a literal
|
|
279
|
+
* `|`: an inline-code span (a `` ` `` to its matching `` ` `` on the same line —
|
|
280
|
+
* an unclosed `` ` `` is literal and protects nothing) shields the pipes inside
|
|
281
|
+
* it, and a `\|` escape is consumed as a literal pipe. The escape is
|
|
282
|
+
* table-cell-scoped — the caller's inline tokenizer performs the matching
|
|
283
|
+
* `\|` → `|` substitution; this scanner only declines to split there.
|
|
284
|
+
*
|
|
285
|
+
* @nodocs
|
|
286
|
+
*/
|
|
287
|
+
export const mdz_split_table_row = (text, line_start, line_end) => {
|
|
288
|
+
if (line_start >= line_end || text.charCodeAt(line_start) !== PIPE)
|
|
289
|
+
return null;
|
|
290
|
+
const cells = [];
|
|
291
|
+
let i = line_start + 1; // past the leading pipe
|
|
292
|
+
let cell_start = i;
|
|
293
|
+
while (i < line_end) {
|
|
294
|
+
const char_code = text.charCodeAt(i);
|
|
295
|
+
if (char_code === BACKTICK) {
|
|
296
|
+
// inline-code span: skip to the matching backtick; unclosed → literal
|
|
297
|
+
let close = -1;
|
|
298
|
+
for (let k = i + 1; k < line_end; k++) {
|
|
299
|
+
if (text.charCodeAt(k) === BACKTICK) {
|
|
300
|
+
close = k;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (close === -1) {
|
|
305
|
+
i++;
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
i = close + 1;
|
|
309
|
+
}
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (char_code === BACKSLASH) {
|
|
313
|
+
// `\|` is a literal pipe, never a delimiter
|
|
314
|
+
i += i + 1 < line_end && text.charCodeAt(i + 1) === PIPE ? 2 : 1;
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (char_code === PIPE) {
|
|
318
|
+
cells.push(trim_table_cell(text, cell_start, i));
|
|
319
|
+
i++;
|
|
320
|
+
cell_start = i;
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
i++;
|
|
324
|
+
}
|
|
325
|
+
// the trailing pipe is required: only whitespace may follow the last one
|
|
326
|
+
for (let k = cell_start; k < line_end; k++) {
|
|
327
|
+
if (!is_line_whitespace(text.charCodeAt(k)))
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
if (cells.length === 0)
|
|
331
|
+
return null;
|
|
332
|
+
return cells;
|
|
333
|
+
};
|
|
334
|
+
/** Classify a trimmed delimiter cell `[start, end)`; `false` when it is not a valid delimiter cell. */
|
|
335
|
+
const table_delimiter_align = (text, start, end) => {
|
|
336
|
+
let i = start;
|
|
337
|
+
let j = end;
|
|
338
|
+
if (i >= j)
|
|
339
|
+
return false;
|
|
340
|
+
const left = text.charCodeAt(i) === COLON;
|
|
341
|
+
if (left)
|
|
342
|
+
i++;
|
|
343
|
+
const right = j > i && text.charCodeAt(j - 1) === COLON;
|
|
344
|
+
if (right)
|
|
345
|
+
j--;
|
|
346
|
+
if (i >= j)
|
|
347
|
+
return false; // needs at least one dash
|
|
348
|
+
for (let k = i; k < j; k++) {
|
|
349
|
+
if (text.charCodeAt(k) !== HYPHEN)
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
return left && right ? 'center' : left ? 'left' : right ? 'right' : null;
|
|
353
|
+
};
|
|
354
|
+
/**
|
|
355
|
+
* Parse a table delimiter row (`| --- | :-: | ---: |`) into its per-column
|
|
356
|
+
* alignment, or `null` when the line is not a valid delimiter row. Each cell
|
|
357
|
+
* must be an optional leading `:`, one or more `-`, and an optional trailing
|
|
358
|
+
* `:`. Splits with `mdz_split_table_row` so the column count matches the header.
|
|
359
|
+
*
|
|
360
|
+
* @nodocs
|
|
361
|
+
*/
|
|
362
|
+
export const mdz_parse_table_delimiter = (text, line_start, line_end) => {
|
|
363
|
+
const cells = mdz_split_table_row(text, line_start, line_end);
|
|
364
|
+
if (cells === null)
|
|
365
|
+
return null;
|
|
366
|
+
const align = [];
|
|
367
|
+
for (const cell of cells) {
|
|
368
|
+
const a = table_delimiter_align(text, cell.start, cell.end);
|
|
369
|
+
if (a === false)
|
|
370
|
+
return null;
|
|
371
|
+
align.push(a);
|
|
372
|
+
}
|
|
373
|
+
return align;
|
|
374
|
+
};
|
|
255
375
|
/**
|
|
256
376
|
* Lowercase an ASCII letter code; passes other chars through.
|
|
257
377
|
* Mirrors the `[A-Z] → [a-z]` shift without touching non-ASCII.
|
package/dist/mdz_lexer.d.ts
CHANGED
|
@@ -6,11 +6,12 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
+
import type { MdzTableAlign } from './mdz.js';
|
|
9
10
|
export interface MdzTokenBase {
|
|
10
11
|
start: number;
|
|
11
12
|
end: number;
|
|
12
13
|
}
|
|
13
|
-
export type MdzToken = MdzTokenText | MdzTokenCode | MdzTokenCodeblock | MdzTokenBoldOpen | MdzTokenBoldClose | MdzTokenItalicOpen | MdzTokenItalicClose | MdzTokenStrikethroughOpen | MdzTokenStrikethroughClose | MdzTokenLinkTextOpen | MdzTokenLinkTextClose | MdzTokenLinkRef | MdzTokenAutolink | MdzTokenHeadingStart | MdzTokenHr | MdzTokenTagOpen | MdzTokenTagSelfClose | MdzTokenTagClose | MdzTokenHeadingEnd | MdzTokenParagraphBreak | MdzTokenListOpen | MdzTokenListClose | MdzTokenListItemOpen | MdzTokenListItemClose | MdzTokenBlockquoteOpen | MdzTokenBlockquoteClose;
|
|
14
|
+
export type MdzToken = MdzTokenText | MdzTokenCode | MdzTokenCodeblock | MdzTokenBoldOpen | MdzTokenBoldClose | MdzTokenItalicOpen | MdzTokenItalicClose | MdzTokenStrikethroughOpen | MdzTokenStrikethroughClose | MdzTokenLinkTextOpen | MdzTokenLinkTextClose | MdzTokenLinkRef | MdzTokenAutolink | MdzTokenHeadingStart | MdzTokenHr | MdzTokenTagOpen | MdzTokenTagSelfClose | MdzTokenTagClose | MdzTokenHeadingEnd | MdzTokenParagraphBreak | MdzTokenListOpen | MdzTokenListClose | MdzTokenListItemOpen | MdzTokenListItemClose | MdzTokenBlockquoteOpen | MdzTokenBlockquoteClose | MdzTokenTableOpen | MdzTokenTableClose | MdzTokenTableRowOpen | MdzTokenTableRowClose | MdzTokenTableCellOpen | MdzTokenTableCellClose;
|
|
14
15
|
export interface MdzTokenText extends MdzTokenBase {
|
|
15
16
|
type: 'text';
|
|
16
17
|
content: string;
|
|
@@ -106,6 +107,28 @@ export interface MdzTokenBlockquoteOpen extends MdzTokenBase {
|
|
|
106
107
|
export interface MdzTokenBlockquoteClose extends MdzTokenBase {
|
|
107
108
|
type: 'blockquote_close';
|
|
108
109
|
}
|
|
110
|
+
export interface MdzTokenTableOpen extends MdzTokenBase {
|
|
111
|
+
type: 'table_open';
|
|
112
|
+
/** Per-column alignment from the delimiter row; length is the column count. */
|
|
113
|
+
align: Array<MdzTableAlign>;
|
|
114
|
+
}
|
|
115
|
+
export interface MdzTokenTableClose extends MdzTokenBase {
|
|
116
|
+
type: 'table_close';
|
|
117
|
+
}
|
|
118
|
+
export interface MdzTokenTableRowOpen extends MdzTokenBase {
|
|
119
|
+
type: 'table_row_open';
|
|
120
|
+
/** `true` for the header row, `false` for body rows. */
|
|
121
|
+
header: boolean;
|
|
122
|
+
}
|
|
123
|
+
export interface MdzTokenTableRowClose extends MdzTokenBase {
|
|
124
|
+
type: 'table_row_close';
|
|
125
|
+
}
|
|
126
|
+
export interface MdzTokenTableCellOpen extends MdzTokenBase {
|
|
127
|
+
type: 'table_cell_open';
|
|
128
|
+
}
|
|
129
|
+
export interface MdzTokenTableCellClose extends MdzTokenBase {
|
|
130
|
+
type: 'table_cell_close';
|
|
131
|
+
}
|
|
109
132
|
/**
|
|
110
133
|
* Tokenizes mdz input into a flat `MdzToken` stream for `MdzTokenParser`.
|
|
111
134
|
*
|
|
@@ -119,5 +142,16 @@ export declare class MdzLexer {
|
|
|
119
142
|
#private;
|
|
120
143
|
constructor(text: string);
|
|
121
144
|
tokenize(): Array<MdzToken>;
|
|
145
|
+
/**
|
|
146
|
+
* Tokenize a table cell's inline content `[cell_start, cell_end)` as a
|
|
147
|
+
* bounded inline run, with no wrapping cell tokens (the bare form of
|
|
148
|
+
* `#emit_table_cell`, sharing `#tokenize_cell_inline`). The streaming parser
|
|
149
|
+
* reuses it across a row's cells via `MdzTableCellParser`: the token buffer
|
|
150
|
+
* resets per call while the search memo — valid over the immutable bound
|
|
151
|
+
* text — carries across cells (the same reuse the sync lexer does in place).
|
|
152
|
+
*
|
|
153
|
+
* @nodocs
|
|
154
|
+
*/
|
|
155
|
+
lex_table_cell(cell_start: number, cell_end: number): Array<MdzToken>;
|
|
122
156
|
}
|
|
123
157
|
//# sourceMappingURL=mdz_lexer.d.ts.map
|
package/dist/mdz_lexer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdz_lexer.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_lexer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgDH,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,QAAQ,GACjB,YAAY,GACZ,YAAY,GACZ,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,yBAAyB,GACzB,0BAA0B,GAC1B,oBAAoB,GACpB,qBAAqB,GACrB,eAAe,GACf,gBAAgB,GAChB,oBAAoB,GACpB,UAAU,GACV,eAAe,GACf,oBAAoB,GACpB,gBAAgB,GAChB,kBAAkB,GAClB,sBAAsB,GACtB,gBAAgB,GAChB,iBAAiB,GACjB,oBAAoB,GACpB,qBAAqB,GACrB,sBAAsB,GACtB,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"mdz_lexer.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/mdz_lexer.ts"],"names":[],"mappings":"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"}
|