@tabnas/markdown 0.6.1 → 0.7.1

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.
@@ -0,0 +1,69 @@
1
+ import type { Context, MakeLexMatcher, Rule, Tabnas } from '@tabnas/parser';
2
+ import { BlockParser } from './block.ts';
3
+ import type { MdNode } from './node.ts';
4
+ import type { ParserOptions } from './options.ts';
5
+ /** The `#LB` token's `use` payload: one physical line, pre-classified. */
6
+ export type LineInfo = {
7
+ /** The line's text, terminator excluded, NULs already replaced. */
8
+ text: string;
9
+ /** True when the line holds nothing but spaces and tabs. */
10
+ blank: boolean;
11
+ /**
12
+ * GFM table arming: true when the line contains a `|` or a `-` anywhere.
13
+ * A deliberate, *provable* superset of "could be a delimiter row": every
14
+ * delimiter cell requires at least one `-` (`:-:` rows open pipe-less
15
+ * single-column tables), and multi-column rows carry `|`. The real
16
+ * decision needs the container-adjusted offset only the block algorithm
17
+ * knows — a delimiter row nested in a block quote matches after the `>`
18
+ * marker — so the `gfm`-tagged alt reading this bit only *arms* the
19
+ * probe, and `tryOpenTable` re-verifies (see test/spec/mixed.tsv).
20
+ */
21
+ tblArm: boolean;
22
+ };
23
+ /** The per-parse state carried on `ctx.u.md` — seeded by `parse.prepare`. */
24
+ export type MdParseState = {
25
+ bp: BlockParser;
26
+ meta: Record<string, any> | undefined;
27
+ };
28
+ /**
29
+ * Build the `mdLine` matcher: each invocation consumes one physical line —
30
+ * terminator included — and emits a single `#LB` token carrying the line as
31
+ * `LineInfo`. The matcher owns the engine's point: `sI` advances past the
32
+ * terminator, `rI` counts rows, and `cI` resets per line (the engine's
33
+ * column is not used for indentation — the shared `BlockParser` computes
34
+ * spec §2.2 tab-expanded columns itself).
35
+ */
36
+ export declare const makeMdLineMatcher: MakeLexMatcher;
37
+ /**
38
+ * The three named actions of the `markdown`/`line` rules. Bound to resolved
39
+ * options at plugin-install time, exactly as the engine-free entry points
40
+ * are. `runInlines` is the phase-2 driver — the engine inline path from
41
+ * `engine-inline.ts` — injected so this module stays a block-phase concern.
42
+ */
43
+ export declare function makeMdActions(opts: ParserOptions, runInlines: (doc: MdNode, refmap: Record<string, any>) => void): {
44
+ /** `parse.prepare`: fresh block-parser state for every parse. */
45
+ prepare: (_tn: Tabnas, ctx: Context, meta?: any) => void;
46
+ /**
47
+ * `line` base open alt: disarm the table probe and feed the matched
48
+ * `#LB` line to the shared algorithm. Reaching this alt means the
49
+ * `gfm`-tagged alt above it did not match — the line cannot contain a
50
+ * delimiter row — or GFM is off entirely (`rule.exclude` removed the
51
+ * tagged alt, and `tryOpenTable` is closed by the option anyway).
52
+ */
53
+ line: (r: Rule, ctx: Context) => void;
54
+ /**
55
+ * `line` GFM open alt (tagged `g: 'gfm'`, condition on the token's
56
+ * `tblArm` bit): arm the table probe for this line, then feed it to the
57
+ * same shared algorithm. This is the extension seam a downstream
58
+ * dialect would use — an alt injected ahead of the base one, gated on
59
+ * a group tag so `gfm: false` can subtract it wholesale.
60
+ */
61
+ lineGfm: (r: Rule, ctx: Context) => void;
62
+ /**
63
+ * `markdown` close alt (`#ZZ`): finalize blocks, run the shared inline
64
+ * phase, and project the public AST into the rule's node. When the
65
+ * caller passed `meta.md.keepTree`, the native tree is handed back on
66
+ * the meta object — the engine-path conformance harness renders it.
67
+ */
68
+ finish: (r: Rule, ctx: Context) => void;
69
+ };
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /* Copyright (c) 2026 Richard Rodger, MIT License */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.makeMdLineMatcher = void 0;
5
+ exports.makeMdActions = makeMdActions;
6
+ const block_ts_1 = require("./block.js");
7
+ const ast_ts_1 = require("./ast.js");
8
+ /**
9
+ * Build the `mdLine` matcher: each invocation consumes one physical line —
10
+ * terminator included — and emits a single `#LB` token carrying the line as
11
+ * `LineInfo`. The matcher owns the engine's point: `sI` advances past the
12
+ * terminator, `rI` counts rows, and `cI` resets per line (the engine's
13
+ * column is not used for indentation — the shared `BlockParser` computes
14
+ * spec §2.2 tab-expanded columns itself).
15
+ */
16
+ const makeMdLineMatcher = (_cfg, _opts) => {
17
+ return (lex, _rule) => {
18
+ const pnt = lex.pnt;
19
+ const src = lex.src;
20
+ const seg = (0, block_ts_1.segmentNextLine)(src, pnt.sI);
21
+ if (null === seg)
22
+ return undefined;
23
+ const info = {
24
+ text: seg.text,
25
+ blank: (0, block_ts_1.isBlank)(seg.text),
26
+ tblArm: -1 !== seg.text.indexOf('|') || -1 !== seg.text.indexOf('-'),
27
+ };
28
+ const tkn = lex.token('#LB', seg.text, src.slice(pnt.sI, seg.next), pnt, info);
29
+ // Row/column bookkeeping is observability data (#ZZ position, traces):
30
+ // a consumed terminator starts a new row; an unterminated final line
31
+ // just widens the current one.
32
+ const terminated = seg.next > pnt.sI + seg.text.length;
33
+ pnt.sI = seg.next;
34
+ if (terminated) {
35
+ pnt.rI += 1;
36
+ pnt.cI = 1;
37
+ }
38
+ else {
39
+ pnt.cI += seg.text.length;
40
+ }
41
+ return tkn;
42
+ };
43
+ };
44
+ exports.makeMdLineMatcher = makeMdLineMatcher;
45
+ /**
46
+ * The three named actions of the `markdown`/`line` rules. Bound to resolved
47
+ * options at plugin-install time, exactly as the engine-free entry points
48
+ * are. `runInlines` is the phase-2 driver — the engine inline path from
49
+ * `engine-inline.ts` — injected so this module stays a block-phase concern.
50
+ */
51
+ function makeMdActions(opts, runInlines) {
52
+ return {
53
+ /** `parse.prepare`: fresh block-parser state for every parse. */
54
+ prepare: (_tn, ctx, meta) => {
55
+ const state = { bp: new block_ts_1.BlockParser(opts), meta };
56
+ ctx.u.md = state;
57
+ },
58
+ /**
59
+ * `line` base open alt: disarm the table probe and feed the matched
60
+ * `#LB` line to the shared algorithm. Reaching this alt means the
61
+ * `gfm`-tagged alt above it did not match — the line cannot contain a
62
+ * delimiter row — or GFM is off entirely (`rule.exclude` removed the
63
+ * tagged alt, and `tryOpenTable` is closed by the option anyway).
64
+ */
65
+ line: (r, ctx) => {
66
+ const state = ctx.u.md;
67
+ state.bp.tableArmed = false;
68
+ state.bp.incorporateLine(r.o0.use.text);
69
+ },
70
+ /**
71
+ * `line` GFM open alt (tagged `g: 'gfm'`, condition on the token's
72
+ * `tblArm` bit): arm the table probe for this line, then feed it to the
73
+ * same shared algorithm. This is the extension seam a downstream
74
+ * dialect would use — an alt injected ahead of the base one, gated on
75
+ * a group tag so `gfm: false` can subtract it wholesale.
76
+ */
77
+ lineGfm: (r, ctx) => {
78
+ const state = ctx.u.md;
79
+ state.bp.tableArmed = true;
80
+ state.bp.incorporateLine(r.o0.use.text);
81
+ },
82
+ /**
83
+ * `markdown` close alt (`#ZZ`): finalize blocks, run the shared inline
84
+ * phase, and project the public AST into the rule's node. When the
85
+ * caller passed `meta.md.keepTree`, the native tree is handed back on
86
+ * the meta object — the engine-path conformance harness renders it.
87
+ */
88
+ finish: (r, ctx) => {
89
+ const state = ctx.u.md;
90
+ const { doc, refmap } = state.bp.finish();
91
+ runInlines(doc, refmap);
92
+ const md = state.meta && state.meta.md;
93
+ if (md && true === md.keepTree)
94
+ md.tree = doc;
95
+ r.node = (0, ast_ts_1.toAst)(doc, opts);
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=engine-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-block.js","sourceRoot":"","sources":["../src/engine-block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Tabnas } from '@tabnas/parser';
2
+ import { InlineParser } from './inline.ts';
3
+ import type { MdNode } from './node.ts';
4
+ import type { ParserOptions, RefMap } from './options.ts';
5
+ /** The per-parse state carried on `ctx.u.inl` — seeded by `parse.prepare`. */
6
+ export type InlineState = {
7
+ parser: InlineParser;
8
+ block: MdNode;
9
+ };
10
+ /** The inline token alphabet, in the order the rule's alt lists them. */
11
+ export declare const INLINE_TOKENS: string[];
12
+ /**
13
+ * Build the package-private inline engine instance for one option set. All
14
+ * built-in matchers are disabled; the matcher set above is the complete
15
+ * lexical description of the inline phase.
16
+ */
17
+ export declare function makeInlineTn(opts: ParserOptions): Tabnas;
18
+ /**
19
+ * The engine-path inline phase: the same block walk as `parseInlines`, with
20
+ * each block's scan driven by the engine instance's lexer. An empty subject
21
+ * never reaches the engine (its empty-source path returns before the rules
22
+ * run), and finishes the block directly — a no-op resolve, exactly as the
23
+ * hand scanner's `parse` does.
24
+ */
25
+ export declare function parseInlinesEngine(inlineTn: Tabnas, doc: MdNode, refmap: RefMap, options: ParserOptions): void;
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ /* Copyright (c) 2026 Richard Rodger, MIT License */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.INLINE_TOKENS = void 0;
5
+ exports.makeInlineTn = makeInlineTn;
6
+ exports.parseInlinesEngine = parseInlinesEngine;
7
+ // The engine-facing inline driver: a second, package-private engine instance
8
+ // whose lexer IS the inline scanner. Each custom matcher is a thin adapter
9
+ // over one `InlineParser` scanner method — the same methods the engine-free
10
+ // path runs — so the anti-drift rule holds: recognition, node building, the
11
+ // delimiter stack and the bracket stack all live once, in `inline.ts`.
12
+ //
13
+ // Two engine features carry the design:
14
+ //
15
+ // * **Context-sensitive matchers.** Every adapter reaches the per-parse
16
+ // state through `lex.ctx.u.inl`. That is what makes the `]` matcher the
17
+ // cursor owner: `parseCloseBracket` consumes a successful link tail
18
+ // directly from the subject, and because that happens at *lex* time, the
19
+ // engine's point advances past the tail and everything after it is lexed
20
+ // fresh. The corpus-blind straddle cases (a backtick inside a successful
21
+ // destination or title, followed by a code span — see test/spec/mixed.tsv)
22
+ // are correct by construction: no token is ever cut across a tail
23
+ // boundary, so no re-lex or resynchronization machinery exists at all.
24
+ //
25
+ // * **Matcher order as precedence.** At `<`, the autolink adapter runs
26
+ // before the raw-HTML adapter, exactly as the hand scanner's dispatch
27
+ // tries them; the text-run adapter and the single-character literal
28
+ // fallback come last. The registered order *is* §6.3's precedence table,
29
+ // visible in the instance's configuration instead of buried in a switch.
30
+ //
31
+ // The one-token effects are applied at lex time on purpose. The engine's
32
+ // rule loop reads lookahead tokens before earlier alts' actions run, so any
33
+ // state a matcher consults — the tree for break trimming, the bracket stack
34
+ // for `]` — must be current when the *lexer* reaches it, not when the
35
+ // parser does. The `inline` rule therefore carries no per-token actions:
36
+ // the tokens are the observable record of the scan (subscribe with
37
+ // `tn.sub({lex})` and watch), and the rule's close action finalizes the
38
+ // block exactly as the engine-free `parse` tail does.
39
+ const parser_1 = require("@tabnas/parser");
40
+ const inline_ts_1 = require("./inline.js");
41
+ const C_NEWLINE = 10;
42
+ const C_BANG = 33;
43
+ const C_AMPERSAND = 38;
44
+ const C_ASTERISK = 42;
45
+ const C_LESSTHAN = 60;
46
+ const C_OPEN_BRACKET = 91;
47
+ const C_BACKSLASH = 92;
48
+ const C_CLOSE_BRACKET = 93;
49
+ const C_UNDERSCORE = 95;
50
+ const C_BACKTICK = 96;
51
+ const C_TILDE = 126;
52
+ /** The inline token alphabet, in the order the rule's alt lists them. */
53
+ exports.INLINE_TOKENS = [
54
+ '#IBK', // line break (soft or hard, decided against the tree)
55
+ '#IES', // backslash escape
56
+ '#ICS', // code span (or an unmatched literal backtick run)
57
+ '#IDL', // emphasis/strikethrough delimiter run
58
+ '#IOB', // [
59
+ '#IBG', // ![
60
+ '#ICB', // ] — including a consumed inline link tail
61
+ '#IAL', // angle autolink
62
+ '#IHT', // raw HTML tag
63
+ '#IEN', // entity reference
64
+ '#ITX', // ordinary text run
65
+ '#ILI', // single literal character nothing else claimed
66
+ ];
67
+ /**
68
+ * Adapt one `InlineParser` scanner method into a lexer matcher: sync the
69
+ * parser to the engine's point, run the method (which appends nodes and
70
+ * moves `pos`), and emit a token covering exactly what it consumed.
71
+ * `name` may depend on what was consumed (`!` vs `![`).
72
+ */
73
+ function adapt(guard, run, name, opts) {
74
+ return (lex) => {
75
+ const st = lex.ctx && lex.ctx.u && lex.ctx.u.inl;
76
+ if (undefined === st)
77
+ return undefined;
78
+ const pnt = lex.pnt;
79
+ const src = lex.src;
80
+ if (pnt.sI >= src.length)
81
+ return undefined;
82
+ if (!guard(src.charCodeAt(pnt.sI), opts))
83
+ return undefined;
84
+ const p = st.parser;
85
+ const start = pnt.sI;
86
+ p.pos = start;
87
+ if (!run(p, st.block))
88
+ return undefined;
89
+ const consumed = src.slice(start, p.pos);
90
+ const tkn = lex.token(name(p, start), undefined, consumed, pnt);
91
+ // Row/column bookkeeping is observability data: a matcher that consumed
92
+ // line endings (soft breaks, multiline code spans or titles) moved the
93
+ // scan onto a later row, and later tokens must say so.
94
+ let newlines = 0;
95
+ let lastNl = -1;
96
+ for (let i = 0; i < consumed.length; i++) {
97
+ if (10 === consumed.charCodeAt(i)) {
98
+ newlines += 1;
99
+ lastNl = i;
100
+ }
101
+ }
102
+ if (0 < newlines) {
103
+ pnt.rI += newlines;
104
+ pnt.cI = consumed.length - lastNl;
105
+ }
106
+ else {
107
+ pnt.cI += consumed.length;
108
+ }
109
+ pnt.sI = p.pos;
110
+ return tkn;
111
+ };
112
+ }
113
+ /** Build the inline matcher set for one option set. GFM strikethrough is a
114
+ * separate matcher registered only when the option is on — the option
115
+ * reshapes the registered matcher set itself, so the base dialect's lexer
116
+ * simply has no tilde matcher rather than a disabled branch inside one. */
117
+ function inlineMatchers(opts) {
118
+ const fixed = (n) => () => n;
119
+ const m = (order, guard, run, name) => ({ order, make: (() => adapt(guard, run, name, opts)) });
120
+ return {
121
+ inlBreak: m(1.00e5, (c) => C_NEWLINE === c, (p, b) => p.parseNewline(b), fixed('#IBK')),
122
+ inlEscape: m(1.01e5, (c) => C_BACKSLASH === c, (p, b) => p.parseBackslash(b), fixed('#IES')),
123
+ inlCode: m(1.02e5, (c) => C_BACKTICK === c, (p, b) => p.parseBackticks(b), fixed('#ICS')),
124
+ inlDelim: m(1.03e5, (c) => C_ASTERISK === c || C_UNDERSCORE === c, (p, b) => p.handleDelim(p.subject.charCodeAt(p.pos), b), fixed('#IDL')),
125
+ inlOpenBracket: m(1.04e5, (c) => C_OPEN_BRACKET === c, (p, b) => p.parseOpenBracket(b), fixed('#IOB')),
126
+ // `!` introduces an image only before `[`; otherwise it is a literal.
127
+ inlBang: m(1.05e5, (c) => C_BANG === c, (p, b) => p.parseBang(b), (p, start) => (2 === p.pos - start ? '#IBG' : '#ILI')),
128
+ // The cursor owner: on a successful inline link tail, `parseCloseBracket`
129
+ // has already consumed it when this token is emitted.
130
+ inlCloseBracket: m(1.06e5, (c) => C_CLOSE_BRACKET === c, (p, b) => p.parseCloseBracket(b), fixed('#ICB')),
131
+ // At `<`: autolink first, raw HTML second — matcher order is precedence.
132
+ inlAutolink: m(1.07e5, (c) => C_LESSTHAN === c, (p, b) => p.parseAutolink(b), fixed('#IAL')),
133
+ inlHtmlTag: m(1.08e5, (c) => C_LESSTHAN === c, (p, b) => p.parseHtmlTag(b), fixed('#IHT')),
134
+ inlEntity: m(1.09e5, (c) => C_AMPERSAND === c, (p, b) => p.parseEntity(b), fixed('#IEN')),
135
+ inlText: m(1.10e5, () => true, (p, b) => p.parseString(b), fixed('#ITX')),
136
+ // Nothing claimed the character: one literal char, same as the hand
137
+ // scanner's dispatch fallback.
138
+ inlLiteral: m(1.11e5, () => true, (p, b) => p.parseLiteralChar(b), fixed('#ILI')),
139
+ // GFM strikethrough: `~` runs join the delimiter stack only when the
140
+ // dialect is on (without it, the text matcher swallows tilde runs).
141
+ ...(true === opts.gfm
142
+ ? {
143
+ inlTilde: m(1.035e5, (c) => C_TILDE === c, (p, b) => p.handleDelim(C_TILDE, b), fixed('#IDL')),
144
+ }
145
+ : {}),
146
+ };
147
+ }
148
+ /**
149
+ * Build the package-private inline engine instance for one option set. All
150
+ * built-in matchers are disabled; the matcher set above is the complete
151
+ * lexical description of the inline phase.
152
+ */
153
+ function makeInlineTn(opts) {
154
+ const tn = new parser_1.Tabnas();
155
+ tn.options({ rule: { start: 'inline' } });
156
+ // Human descriptions for the inline alphabet, surfaced in railroad
157
+ // diagram legends (read off the live config by @tabnas/railroad).
158
+ tn.options({
159
+ config: {
160
+ modify: {
161
+ 'inl-tokendesc': (cfg) => {
162
+ cfg.tokenDesc = Object.assign(cfg.tokenDesc || {}, {
163
+ '#IBK': 'line break (soft or hard)',
164
+ '#IES': 'backslash escape',
165
+ '#ICS': 'code span',
166
+ '#IDL': 'emphasis/strikethrough delimiter run',
167
+ '#IOB': 'link opener [',
168
+ '#IBG': 'image opener ![',
169
+ '#ICB': 'closer ] (with any consumed inline link tail)',
170
+ '#IAL': 'angle autolink',
171
+ '#IHT': 'raw HTML tag',
172
+ '#IEN': 'entity reference',
173
+ '#ITX': 'text run',
174
+ '#ILI': 'literal character',
175
+ });
176
+ },
177
+ },
178
+ },
179
+ });
180
+ tn.options({
181
+ space: { lex: false },
182
+ line: { lex: false },
183
+ string: { lex: false },
184
+ comment: { lex: false },
185
+ number: { lex: false },
186
+ value: { lex: false },
187
+ text: { lex: false },
188
+ lex: { match: inlineMatchers(opts) },
189
+ parse: {
190
+ prepare: {
191
+ 'inl-reset': (_tn, ctx, meta) => {
192
+ ;
193
+ ctx.u.inl =
194
+ meta && meta.md ? { parser: meta.md.inl, block: meta.md.block } : undefined;
195
+ },
196
+ },
197
+ },
198
+ });
199
+ // One OR-position over the whole alphabet: any inline token loops the
200
+ // rule; the empty alts fall through to the close on #ZZ. The names are
201
+ // minted to tins here — the same table the matchers' lex.token calls use.
202
+ const toks = exports.INLINE_TOKENS.map((n) => tn.token(n));
203
+ tn.rule('inline', (rs) => {
204
+ return rs
205
+ .clear()
206
+ .open([{ s: [toks], r: 'inline' }, {}])
207
+ .close([
208
+ {
209
+ s: '#ZZ',
210
+ a: (_r, ctx) => {
211
+ const st = ctx.u.inl;
212
+ st.parser.finishBlock(st.block);
213
+ },
214
+ },
215
+ {},
216
+ ]);
217
+ });
218
+ return tn;
219
+ }
220
+ /**
221
+ * The engine-path inline phase: the same block walk as `parseInlines`, with
222
+ * each block's scan driven by the engine instance's lexer. An empty subject
223
+ * never reaches the engine (its empty-source path returns before the rules
224
+ * run), and finishes the block directly — a no-op resolve, exactly as the
225
+ * hand scanner's `parse` does.
226
+ */
227
+ function parseInlinesEngine(inlineTn, doc, refmap, options) {
228
+ const parser = new inline_ts_1.InlineParser(refmap, options);
229
+ (0, inline_ts_1.forEachInlineBlock)(doc, options, (block) => {
230
+ if (!parser.beginBlock(block)) {
231
+ parser.finishBlock(block);
232
+ return;
233
+ }
234
+ inlineTn.parse(parser.subject, { md: { inl: parser, block } });
235
+ });
236
+ }
237
+ //# sourceMappingURL=engine-inline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-inline.js","sourceRoot":"","sources":["../src/engine-inline.ts"],"names":[],"mappings":"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"}