@hymarkx/parser 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,100 @@
1
+ import { createDiagnostic } from '@hymarkx/ast';
2
+ import { fromMarkdown } from 'mdast-util-from-markdown';
3
+ import { gfmAutolinkLiteralFromMarkdown } from 'mdast-util-gfm-autolink-literal';
4
+ import { gfmStrikethroughFromMarkdown } from 'mdast-util-gfm-strikethrough';
5
+ import { gfmTableFromMarkdown } from 'mdast-util-gfm-table';
6
+ import { gfmTaskListItemFromMarkdown } from 'mdast-util-gfm-task-list-item';
7
+ import { gfmAutolinkLiteral } from 'micromark-extension-gfm-autolink-literal';
8
+ import { gfmStrikethrough } from 'micromark-extension-gfm-strikethrough';
9
+ import { gfmTable } from 'micromark-extension-gfm-table';
10
+ import { gfmTaskListItem } from 'micromark-extension-gfm-task-list-item';
11
+ import { directiveFromMarkdown, directiveTokenizer } from './directives.js';
12
+ import { frontmatterFromMarkdown, frontmatterTokenizer } from './frontmatter.js';
13
+ import { fromMdast } from './from-mdast.js';
14
+ import { interpolationFromMarkdown, interpolationTokenizer } from './interpolation.js';
15
+ import { ParserInternalError } from './internal-error.js';
16
+ import { SourcePositions } from './positions.js';
17
+ import { HMX_VERSION } from './version.js';
18
+ const gfmExtensions = [gfmAutolinkLiteral(), gfmStrikethrough(), gfmTable(), gfmTaskListItem()];
19
+ const directiveExtension = directiveTokenizer();
20
+ const frontmatterExtension = frontmatterTokenizer();
21
+ const interpolationExtension = interpolationTokenizer();
22
+ const gfmMdastExtensions = [
23
+ gfmAutolinkLiteralFromMarkdown(),
24
+ gfmStrikethroughFromMarkdown(),
25
+ gfmTableFromMarkdown(),
26
+ gfmTaskListItemFromMarkdown(),
27
+ ];
28
+ function normalizeSource(source) {
29
+ const withoutBom = source.charCodeAt(0) === 0xfeff ? source.slice(1) : source;
30
+ return withoutBom.replace(/\r\n?/g, '\n');
31
+ }
32
+ function failureDiagnostic(error, from, positions) {
33
+ // Deep nesting overflows the stack inside mdast-util-gfm-autolink-literal, whose tree
34
+ // transform is recursive. Our own converter is iterative and handles these documents,
35
+ // so the limit is upstream's, not ours — but it is still a limit, and a user is owed an
36
+ // explanation rather than a RangeError. Tracked as P2 in BACKLOG.md.
37
+ if (error instanceof RangeError) {
38
+ return createDiagnostic({
39
+ code: 'HMX1002',
40
+ severity: 'error',
41
+ message: 'Document is nested too deeply for the Markdown engine to process.',
42
+ span: positions.span,
43
+ expected: 'fewer levels of nested block quotes, lists, or other containers',
44
+ });
45
+ }
46
+ const span = error instanceof ParserInternalError ? error.diagnostic.span : positions.span;
47
+ const detail = error instanceof Error ? error.message : String(error);
48
+ return createDiagnostic({
49
+ code: 'HMX5001',
50
+ severity: 'error',
51
+ message: `Parser failure in ${from}: ${detail}`,
52
+ span,
53
+ });
54
+ }
55
+ /**
56
+ * Parses CommonMark plus optional granular GFM extensions into the HMX AST.
57
+ *
58
+ * This function returns diagnostics instead of throwing for every string input.
59
+ */
60
+ export function parse(source, options = {}) {
61
+ const normalizedSource = normalizeSource(source);
62
+ const positions = new SourcePositions(normalizedSource);
63
+ const from = options.from ?? '<anonymous>';
64
+ const diagnostics = [];
65
+ try {
66
+ const mdastRoot = fromMarkdown(normalizedSource, {
67
+ extensions: [
68
+ ...(options.frontmatter === false ? [] : [frontmatterExtension]),
69
+ directiveExtension,
70
+ interpolationExtension,
71
+ ...(options.gfm === false ? [] : gfmExtensions),
72
+ ],
73
+ mdastExtensions: [
74
+ ...(options.frontmatter === false ? [] : [frontmatterFromMarkdown(positions)]),
75
+ directiveFromMarkdown(diagnostics, positions),
76
+ interpolationFromMarkdown(diagnostics, positions),
77
+ ...(options.gfm === false ? [] : gfmMdastExtensions),
78
+ ],
79
+ });
80
+ return {
81
+ root: fromMdast(mdastRoot, normalizedSource),
82
+ diagnostics,
83
+ source: normalizedSource,
84
+ };
85
+ }
86
+ catch (error) {
87
+ return {
88
+ root: {
89
+ type: 'root',
90
+ hmxVersion: HMX_VERSION,
91
+ children: [],
92
+ position: positions.span,
93
+ },
94
+ diagnostics: [failureDiagnostic(error, from, positions)],
95
+ source: normalizedSource,
96
+ };
97
+ }
98
+ }
99
+ export { HMX_VERSION };
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Diagnostic } from '@hymarkx/ast';
2
+ /** Internal parser failure carrying the diagnostic returned by the public API. */
3
+ export declare class ParserInternalError extends Error {
4
+ readonly diagnostic: Diagnostic;
5
+ constructor(diagnostic: Diagnostic);
6
+ }
7
+ //# sourceMappingURL=internal-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-error.d.ts","sourceRoot":"","sources":["../src/internal-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,kFAAkF;AAClF,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAE/B,YAAY,UAAU,EAAE,UAAU,EAIjC;CACF"}
@@ -0,0 +1,10 @@
1
+ /** Internal parser failure carrying the diagnostic returned by the public API. */
2
+ export class ParserInternalError extends Error {
3
+ diagnostic;
4
+ constructor(diagnostic) {
5
+ super(diagnostic.message);
6
+ this.name = 'ParserInternalError';
7
+ this.diagnostic = diagnostic;
8
+ }
9
+ }
10
+ //# sourceMappingURL=internal-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-error.js","sourceRoot":"","sources":["../src/internal-error.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,UAAU,CAAY;IAE/B,YAAY,UAAsB;QAChC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { Diagnostic } from '@hymarkx/ast';
2
+ import type { Extension } from 'mdast-util-from-markdown';
3
+ import type { Construct } from 'micromark-util-types';
4
+ import { SourcePositions } from './positions.js';
5
+ declare module 'micromark-util-types' {
6
+ interface TokenTypeMap {
7
+ hmxInterpolation: 'hmxInterpolation';
8
+ hmxInterpolationMarker: 'hmxInterpolationMarker';
9
+ hmxInterpolationUnterminated: 'hmxInterpolationUnterminated';
10
+ hmxInterpolationValue: 'hmxInterpolationValue';
11
+ }
12
+ }
13
+ /** Creates the text-only interpolation tokenizer. */
14
+ export declare function interpolationTokenizer(): {
15
+ readonly text: Readonly<Record<123, Construct>>;
16
+ };
17
+ /** Creates mdast handlers for raw interpolation nodes and unterminated recovery. */
18
+ export declare function interpolationFromMarkdown(diagnostics: Diagnostic[], positions: SourcePositions): Extension;
19
+ //# sourceMappingURL=interpolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.d.ts","sourceRoot":"","sources":["../src/interpolation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAQ,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAkB,SAAS,EAAiB,MAAM,0BAA0B,CAAA;AACxF,OAAO,KAAK,EAAQ,SAAS,EAAS,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAEhD,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,YAAY;QACpB,gBAAgB,EAAE,kBAAkB,CAAA;QACpC,sBAAsB,EAAE,wBAAwB,CAAA;QAChD,4BAA4B,EAAE,8BAA8B,CAAA;QAC5D,qBAAqB,EAAE,uBAAuB,CAAA;KAC/C;CACF;AA+HD,qDAAqD;AACrD,wBAAgB,sBAAsB,IAAI;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAA;CAAE,CAE5F;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,eAAe,GACzB,SAAS,CAgDX"}
@@ -0,0 +1,158 @@
1
+ import { createDiagnostic } from '@hymarkx/ast';
2
+ import { SourcePositions } from './positions.js';
3
+ function isLineEnding(code) {
4
+ return code === -5 || code === -4 || code === -3;
5
+ }
6
+ function interpolationNode(context) {
7
+ for (let index = context.stack.length - 1; index >= 0; index -= 1) {
8
+ const node = context.stack[index];
9
+ if (node?.type === 'interpolation' || node?.type === 'text') {
10
+ return node;
11
+ }
12
+ }
13
+ throw new TypeError('Expected an open interpolation node');
14
+ }
15
+ const interpolationConstruct = {
16
+ tokenize(effects, ok, nok) {
17
+ let interpolationToken;
18
+ let braceDepth = 0;
19
+ let quote;
20
+ let escaped = false;
21
+ const finishUnterminated = (code) => {
22
+ if (interpolationToken === undefined) {
23
+ return nok(code);
24
+ }
25
+ interpolationToken.type = 'hmxInterpolationUnterminated';
26
+ effects.exit('hmxInterpolationUnterminated');
27
+ return ok(code);
28
+ };
29
+ const unterminated = (code) => {
30
+ effects.exit('hmxInterpolationValue');
31
+ return finishUnterminated(code);
32
+ };
33
+ const inside = (code) => {
34
+ if (code === null || isLineEnding(code)) {
35
+ return unterminated(code);
36
+ }
37
+ if (quote !== undefined) {
38
+ effects.consume(code);
39
+ if (escaped) {
40
+ escaped = false;
41
+ }
42
+ else if (code === 92) {
43
+ escaped = true;
44
+ }
45
+ else if (code === quote) {
46
+ quote = undefined;
47
+ }
48
+ return inside;
49
+ }
50
+ if (code === 34 || code === 39) {
51
+ quote = code;
52
+ effects.consume(code);
53
+ return inside;
54
+ }
55
+ if (code === 123) {
56
+ braceDepth += 1;
57
+ effects.consume(code);
58
+ return inside;
59
+ }
60
+ if (code === 125 && braceDepth > 0) {
61
+ braceDepth -= 1;
62
+ effects.consume(code);
63
+ return inside;
64
+ }
65
+ if (code === 125) {
66
+ effects.exit('hmxInterpolationValue');
67
+ effects.enter('hmxInterpolationMarker');
68
+ effects.consume(code);
69
+ return close;
70
+ }
71
+ effects.consume(code);
72
+ return inside;
73
+ };
74
+ const close = (code) => {
75
+ if (code === 125) {
76
+ effects.consume(code);
77
+ effects.exit('hmxInterpolationMarker');
78
+ effects.exit('hmxInterpolation');
79
+ return ok;
80
+ }
81
+ if (code === null || isLineEnding(code)) {
82
+ effects.exit('hmxInterpolationMarker');
83
+ return finishUnterminated(code);
84
+ }
85
+ effects.exit('hmxInterpolationMarker');
86
+ effects.enter('hmxInterpolationValue');
87
+ return inside(code);
88
+ };
89
+ const secondOpening = (code) => {
90
+ if (code !== 123) {
91
+ return nok(code);
92
+ }
93
+ effects.consume(code);
94
+ effects.exit('hmxInterpolationMarker');
95
+ effects.enter('hmxInterpolationValue');
96
+ return inside;
97
+ };
98
+ return (code) => {
99
+ if (code !== 123) {
100
+ return nok(code);
101
+ }
102
+ interpolationToken = effects.enter('hmxInterpolation');
103
+ effects.enter('hmxInterpolationMarker');
104
+ effects.consume(code);
105
+ return secondOpening;
106
+ };
107
+ },
108
+ };
109
+ /** Creates the text-only interpolation tokenizer. */
110
+ export function interpolationTokenizer() {
111
+ return { text: { 123: interpolationConstruct } };
112
+ }
113
+ /** Creates mdast handlers for raw interpolation nodes and unterminated recovery. */
114
+ export function interpolationFromMarkdown(diagnostics, positions) {
115
+ const enterInterpolation = function (token) {
116
+ const openingSpan = {
117
+ start: positions.pointAt(token.start.offset),
118
+ end: positions.pointAt(Math.min(token.start.offset + 2, positions.source.length)),
119
+ };
120
+ const node = { type: 'interpolation', value: '', openingSpan };
121
+ this.enter(node, token);
122
+ this.buffer();
123
+ };
124
+ const exitUnterminated = function (token) {
125
+ const node = interpolationNode(this);
126
+ node.type = 'text';
127
+ diagnostics.push(createDiagnostic({
128
+ code: 'HMX1020',
129
+ severity: 'error',
130
+ message: 'Interpolation is not closed.',
131
+ span: node.openingSpan,
132
+ expected: 'a closing }} before the end of the line',
133
+ }));
134
+ this.resume();
135
+ node.value = positions.source.slice(token.start.offset, token.end.offset);
136
+ delete node.openingSpan;
137
+ this.exit(token);
138
+ };
139
+ const exitInterpolation = function (token) {
140
+ const node = interpolationNode(this);
141
+ this.resume();
142
+ const raw = positions.source.slice(token.start.offset, token.end.offset);
143
+ node.value = node.type === 'interpolation' ? raw.slice(2, -2).trim() : raw;
144
+ delete node.openingSpan;
145
+ this.exit(token);
146
+ };
147
+ return {
148
+ enter: {
149
+ hmxInterpolation: enterInterpolation,
150
+ hmxInterpolationUnterminated: enterInterpolation,
151
+ },
152
+ exit: {
153
+ hmxInterpolation: exitInterpolation,
154
+ hmxInterpolationUnterminated: exitUnterminated,
155
+ },
156
+ };
157
+ }
158
+ //# sourceMappingURL=interpolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../src/interpolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Point, Span } from '@hymarkx/ast';
2
+ /** Indexes normalized source using UTF-16 code units. */
3
+ export declare class SourcePositions {
4
+ #private;
5
+ readonly source: string;
6
+ readonly span: Span;
7
+ constructor(source: string);
8
+ /** Returns a 1-based line/column point for a UTF-16 offset. */
9
+ pointAt(offset: number): Point;
10
+ /** Derives an offset when an upstream point omitted it. */
11
+ offsetAt(line: number, column: number): number;
12
+ }
13
+ //# sourceMappingURL=positions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"positions.d.ts","sourceRoot":"","sources":["../src/positions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAE/C,yDAAyD;AACzD,qBAAa,eAAe;;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IAGnB,YAAY,MAAM,EAAE,MAAM,EAczB;IAED,+DAA+D;IAC/D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CA4B7B;IAED,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkB7C;CACF"}
@@ -0,0 +1,66 @@
1
+ /** Indexes normalized source using UTF-16 code units. */
2
+ export class SourcePositions {
3
+ source;
4
+ span;
5
+ #lineStarts;
6
+ constructor(source) {
7
+ this.source = source;
8
+ const lineStarts = [0];
9
+ for (let offset = 0; offset < source.length; offset += 1) {
10
+ if (source.charCodeAt(offset) === 10) {
11
+ lineStarts.push(offset + 1);
12
+ }
13
+ }
14
+ this.#lineStarts = lineStarts;
15
+ this.span = {
16
+ start: this.pointAt(0),
17
+ end: this.pointAt(source.length),
18
+ };
19
+ }
20
+ /** Returns a 1-based line/column point for a UTF-16 offset. */
21
+ pointAt(offset) {
22
+ if (!Number.isInteger(offset) || offset < 0 || offset > this.source.length) {
23
+ throw new RangeError(`Source offset is out of range: ${offset}`);
24
+ }
25
+ let low = 0;
26
+ let high = this.#lineStarts.length;
27
+ while (low < high) {
28
+ const middle = Math.floor((low + high) / 2);
29
+ const lineStart = this.#lineStarts[middle];
30
+ if (lineStart !== undefined && lineStart <= offset) {
31
+ low = middle + 1;
32
+ }
33
+ else {
34
+ high = middle;
35
+ }
36
+ }
37
+ const lineIndex = low - 1;
38
+ const lineStart = this.#lineStarts[lineIndex];
39
+ if (lineStart === undefined) {
40
+ throw new RangeError(`Could not locate source offset: ${offset}`);
41
+ }
42
+ return {
43
+ line: lineIndex + 1,
44
+ column: offset - lineStart + 1,
45
+ offset,
46
+ };
47
+ }
48
+ /** Derives an offset when an upstream point omitted it. */
49
+ offsetAt(line, column) {
50
+ if (!Number.isInteger(line) || line < 1 || !Number.isInteger(column) || column < 1) {
51
+ throw new RangeError(`Invalid source point: ${line}:${column}`);
52
+ }
53
+ const lineStart = this.#lineStarts[line - 1];
54
+ if (lineStart === undefined) {
55
+ throw new RangeError(`Source line is out of range: ${line}`);
56
+ }
57
+ const offset = lineStart + column - 1;
58
+ const nextLineStart = this.#lineStarts[line];
59
+ const maximum = nextLineStart === undefined ? this.source.length : nextLineStart - 1;
60
+ if (offset > maximum) {
61
+ throw new RangeError(`Source column is out of range: ${line}:${column}`);
62
+ }
63
+ return offset;
64
+ }
65
+ }
66
+ //# sourceMappingURL=positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"positions.js","sourceRoot":"","sources":["../src/positions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** The HMX AST language version emitted by this parser. */
2
+ export declare const HMX_VERSION = "0.0.0";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,WAAW,UAAU,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** The HMX AST language version emitted by this parser. */
2
+ export const HMX_VERSION = '0.0.0';
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAA"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@hymarkx/parser",
3
+ "version": "0.0.2",
4
+ "description": "Markdown parser producing the HyMarkX (HMX) syntax tree.",
5
+ "license": "MIT OR Apache-2.0",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/NAME0x0/HyMarkX.git",
12
+ "directory": "packages/parser"
13
+ },
14
+ "homepage": "https://github.com/NAME0x0/HyMarkX#readme",
15
+ "bugs": "https://github.com/NAME0x0/HyMarkX/issues",
16
+ "type": "module",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE-MIT",
27
+ "LICENSE-APACHE"
28
+ ],
29
+ "dependencies": {
30
+ "mdast-util-from-markdown": "^2.0.3",
31
+ "mdast-util-gfm-autolink-literal": "^2.0.1",
32
+ "mdast-util-gfm-strikethrough": "^2.0.0",
33
+ "mdast-util-gfm-table": "^2.0.0",
34
+ "mdast-util-gfm-task-list-item": "^2.0.0",
35
+ "micromark-extension-directive": "^4.0.0",
36
+ "micromark-extension-frontmatter": "^2.0.0",
37
+ "micromark-extension-gfm-autolink-literal": "^2.1.0",
38
+ "micromark-extension-gfm-strikethrough": "^2.1.0",
39
+ "micromark-extension-gfm-table": "^2.1.1",
40
+ "micromark-extension-gfm-task-list-item": "^2.1.0",
41
+ "micromark-factory-space": "^2.0.1",
42
+ "micromark-factory-whitespace": "^2.0.1",
43
+ "micromark-util-decode-string": "^2.0.1",
44
+ "micromark-util-character": "^2.1.1",
45
+ "micromark-util-types": "^2.0.2",
46
+ "@hymarkx/ast": "0.0.2"
47
+ },
48
+ "engines": {
49
+ "node": ">=22"
50
+ }
51
+ }