@openuji/speculator 0.5.3 → 0.5.4
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.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parse/__tests__/html-in-markdown.test.d.ts +2 -0
- package/dist/parse/__tests__/html-in-markdown.test.d.ts.map +1 -0
- package/dist/parse/__tests__/html-in-markdown.test.js +83 -0
- package/dist/parse/__tests__/html-in-markdown.test.js.map +1 -0
- package/dist/parse/__tests__/pipeline.test.js +1 -8
- package/dist/parse/__tests__/pipeline.test.js.map +1 -1
- package/dist/parse/__tests__/shorthands.test.d.ts +5 -0
- package/dist/parse/__tests__/shorthands.test.d.ts.map +1 -0
- package/dist/parse/__tests__/shorthands.test.js +96 -0
- package/dist/parse/__tests__/shorthands.test.js.map +1 -0
- package/dist/parse/assembler.d.ts.map +1 -1
- package/dist/parse/assembler.js +18 -0
- package/dist/parse/assembler.js.map +1 -1
- package/dist/parse/html/InlinesHtmlParser.d.ts.map +1 -1
- package/dist/parse/html/InlinesHtmlParser.js +11 -1
- package/dist/parse/html/InlinesHtmlParser.js.map +1 -1
- package/dist/parse/html/parser.d.ts +1 -12
- package/dist/parse/html/parser.d.ts.map +1 -1
- package/dist/parse/html/parser.js +15 -47
- package/dist/parse/html/parser.js.map +1 -1
- package/dist/parse/index.d.ts +1 -1
- package/dist/parse/index.d.ts.map +1 -1
- package/dist/parse/index.js.map +1 -1
- package/dist/parse/markdown/HtmlBlockMarkdownParser.d.ts +13 -0
- package/dist/parse/markdown/HtmlBlockMarkdownParser.d.ts.map +1 -0
- package/dist/parse/markdown/HtmlBlockMarkdownParser.js +61 -0
- package/dist/parse/markdown/HtmlBlockMarkdownParser.js.map +1 -0
- package/dist/parse/markdown/HtmlInlinesMarkdownParser.d.ts +12 -0
- package/dist/parse/markdown/HtmlInlinesMarkdownParser.d.ts.map +1 -0
- package/dist/parse/markdown/HtmlInlinesMarkdownParser.js +187 -0
- package/dist/parse/markdown/HtmlInlinesMarkdownParser.js.map +1 -0
- package/dist/parse/markdown/HtmlParagraphMarkdownParser.d.ts +15 -0
- package/dist/parse/markdown/HtmlParagraphMarkdownParser.d.ts.map +1 -0
- package/dist/parse/markdown/HtmlParagraphMarkdownParser.js +67 -0
- package/dist/parse/markdown/HtmlParagraphMarkdownParser.js.map +1 -0
- package/dist/parse/markdown/ShorthandsMarkdownParser.d.ts +29 -0
- package/dist/parse/markdown/ShorthandsMarkdownParser.d.ts.map +1 -0
- package/dist/parse/markdown/ShorthandsMarkdownParser.js +200 -0
- package/dist/parse/markdown/ShorthandsMarkdownParser.js.map +1 -0
- package/dist/parse/markdown/parser.d.ts +3 -14
- package/dist/parse/markdown/parser.d.ts.map +1 -1
- package/dist/parse/markdown/parser.js +72 -47
- package/dist/parse/markdown/parser.js.map +1 -1
- package/dist/parse/parsers.d.ts +3 -0
- package/dist/parse/parsers.d.ts.map +1 -1
- package/dist/parse/parsers.js +10 -0
- package/dist/parse/parsers.js.map +1 -1
- package/dist/parse/pipeline.d.ts.map +1 -1
- package/dist/parse/pipeline.js +8 -20
- package/dist/parse/pipeline.js.map +1 -1
- package/dist/parse/registry.d.ts +50 -91
- package/dist/parse/registry.d.ts.map +1 -1
- package/dist/parse/registry.js +39 -58
- package/dist/parse/registry.js.map +1 -1
- package/dist/parse/types.d.ts +1 -23
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/parse/types.js.map +1 -1
- package/dist/parse/utils/hast-utils.d.ts +30 -0
- package/dist/parse/utils/hast-utils.d.ts.map +1 -0
- package/dist/parse/utils/hast-utils.js +94 -0
- package/dist/parse/utils/hast-utils.js.map +1 -0
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +16 -12
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/postprocess/index.d.ts +1 -1
- package/dist/postprocess/index.d.ts.map +1 -1
- package/dist/postprocess/index.js +3 -3
- package/dist/postprocess/index.js.map +1 -1
- package/dist/postprocess/plugins/citation-resolve.d.ts +8 -0
- package/dist/postprocess/plugins/citation-resolve.d.ts.map +1 -0
- package/dist/postprocess/plugins/citation-resolve.js +33 -0
- package/dist/postprocess/plugins/citation-resolve.js.map +1 -0
- package/dist/preprocess/__tests__/pipeline.test.js +33 -45
- package/dist/preprocess/__tests__/pipeline.test.js.map +1 -1
- package/dist/preprocess/__tests__/resolver.test.js +38 -40
- package/dist/preprocess/__tests__/resolver.test.js.map +1 -1
- package/dist/preprocess/config/__tests__/rules.test.d.ts +2 -0
- package/dist/preprocess/config/__tests__/rules.test.d.ts.map +1 -0
- package/dist/preprocess/config/__tests__/rules.test.js +212 -0
- package/dist/preprocess/config/__tests__/rules.test.js.map +1 -0
- package/dist/preprocess/config/doc-config.js +1 -1
- package/dist/preprocess/config/doc-config.js.map +1 -1
- package/dist/preprocess/config/index.d.ts +3 -4
- package/dist/preprocess/config/index.d.ts.map +1 -1
- package/dist/preprocess/config/index.js +2 -2
- package/dist/preprocess/config/index.js.map +1 -1
- package/dist/preprocess/config/loader.d.ts +12 -48
- package/dist/preprocess/config/loader.d.ts.map +1 -1
- package/dist/preprocess/config/loader.js +23 -13
- package/dist/preprocess/config/loader.js.map +1 -1
- package/dist/preprocess/config/normalize.d.ts +11 -6
- package/dist/preprocess/config/normalize.d.ts.map +1 -1
- package/dist/preprocess/config/normalize.js +58 -8
- package/dist/preprocess/config/normalize.js.map +1 -1
- package/dist/preprocess/config/types.d.ts +57 -22
- package/dist/preprocess/config/types.d.ts.map +1 -1
- package/dist/preprocess/include/index.d.ts +1 -1
- package/dist/preprocess/include/index.d.ts.map +1 -1
- package/dist/preprocess/include/index.js +1 -1
- package/dist/preprocess/include/index.js.map +1 -1
- package/dist/preprocess/include/resolver.d.ts +14 -8
- package/dist/preprocess/include/resolver.d.ts.map +1 -1
- package/dist/preprocess/include/resolver.js +27 -18
- package/dist/preprocess/include/resolver.js.map +1 -1
- package/dist/preprocess/index.d.ts +6 -6
- package/dist/preprocess/index.d.ts.map +1 -1
- package/dist/preprocess/index.js +4 -4
- package/dist/preprocess/index.js.map +1 -1
- package/dist/preprocess/pipeline.d.ts +19 -16
- package/dist/preprocess/pipeline.d.ts.map +1 -1
- package/dist/preprocess/pipeline.js +43 -45
- package/dist/preprocess/pipeline.js.map +1 -1
- package/dist/preprocess/types.d.ts +21 -46
- package/dist/preprocess/types.d.ts.map +1 -1
- package/dist/preprocess/types.js +0 -6
- package/dist/preprocess/types.js.map +1 -1
- package/dist/types/ast.generated.d.ts +21 -2
- package/dist/types/ast.generated.d.ts.map +1 -1
- package/dist/types/ast.generated.js +1 -1
- package/dist/types/ast.generated.js.map +1 -1
- package/package.json +1 -1
- package/schema/spec-ast.schema.json +40 -0
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { unified } from 'unified';
|
|
8
8
|
import rehypeParse from 'rehype-parse';
|
|
9
9
|
import { defaultRegistry, } from '#src/parse/registry';
|
|
10
|
+
import { getAttr, getTextContent } from '#src/parse/utils/hast-utils';
|
|
10
11
|
/**
|
|
11
12
|
* Create source position from hast node position
|
|
12
13
|
*/
|
|
@@ -31,32 +32,6 @@ function createSourcePos(unit, node) {
|
|
|
31
32
|
}
|
|
32
33
|
return result;
|
|
33
34
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Get element attribute value
|
|
36
|
-
*/
|
|
37
|
-
function getAttr(element, name) {
|
|
38
|
-
const val = element.properties?.[name];
|
|
39
|
-
if (typeof val === 'string')
|
|
40
|
-
return val;
|
|
41
|
-
if (Array.isArray(val))
|
|
42
|
-
return val.join(' ');
|
|
43
|
-
return undefined;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Get text content of element recursively
|
|
47
|
-
*/
|
|
48
|
-
function getTextContent(element) {
|
|
49
|
-
let text = '';
|
|
50
|
-
for (const child of element.children) {
|
|
51
|
-
if (child.type === 'text') {
|
|
52
|
-
text += child.value;
|
|
53
|
-
}
|
|
54
|
-
else if (child.type === 'element') {
|
|
55
|
-
text += getTextContent(child);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return text;
|
|
59
|
-
}
|
|
60
35
|
/**
|
|
61
36
|
* HTML unit parser implementation using handler registry
|
|
62
37
|
*/
|
|
@@ -71,46 +46,39 @@ export class HtmlUnitParser {
|
|
|
71
46
|
* Parse HTML unit to AST blocks
|
|
72
47
|
*/
|
|
73
48
|
parse(unit) {
|
|
74
|
-
return this.parseWithDiagnostics(unit).blocks;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Parse HTML unit to AST blocks with diagnostics
|
|
78
|
-
*/
|
|
79
|
-
parseWithDiagnostics(unit) {
|
|
80
49
|
const tree = this.processor.parse(unit.content);
|
|
81
|
-
const diagnostics = [];
|
|
82
50
|
// Create context for handlers
|
|
83
|
-
const ctx = this.createContext(unit
|
|
51
|
+
const ctx = this.createContext(unit);
|
|
84
52
|
const results = [];
|
|
85
53
|
for (const child of tree.children) {
|
|
86
54
|
const blocks = this.transformBlock(child, ctx);
|
|
87
55
|
results.push(...blocks);
|
|
88
56
|
}
|
|
89
|
-
return
|
|
57
|
+
return results;
|
|
90
58
|
}
|
|
91
59
|
/**
|
|
92
60
|
* Create parse context for handlers
|
|
93
61
|
*/
|
|
94
|
-
createContext(unit
|
|
62
|
+
createContext(unit) {
|
|
95
63
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
96
64
|
const self = this;
|
|
97
65
|
return {
|
|
98
66
|
unit,
|
|
99
67
|
createSourcePos: (node) => createSourcePos(unit, node),
|
|
100
|
-
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
69
|
+
transformInlineChildren: (children) => self.transformInlineChildren(children, unit),
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
101
71
|
transformBlockChildren: (children) => {
|
|
102
72
|
const results = [];
|
|
103
|
-
const ctx = self.createContext(unit
|
|
73
|
+
const ctx = self.createContext(unit);
|
|
104
74
|
for (const child of children) {
|
|
105
75
|
results.push(...self.transformBlock(child, ctx));
|
|
106
76
|
}
|
|
107
77
|
return results;
|
|
108
78
|
},
|
|
109
|
-
emitDiagnostic: (diagnostic) => {
|
|
110
|
-
diagnostics.push({ ...diagnostic, file: unit.file });
|
|
111
|
-
},
|
|
112
79
|
getTextContent,
|
|
113
80
|
getAttr,
|
|
81
|
+
registry: self.registry,
|
|
114
82
|
};
|
|
115
83
|
}
|
|
116
84
|
/**
|
|
@@ -132,7 +100,7 @@ export class HtmlUnitParser {
|
|
|
132
100
|
return [result];
|
|
133
101
|
}
|
|
134
102
|
// Fallback: try to handle as inline (e.g., <dfn> or <span> at top level)
|
|
135
|
-
const inline = this.transformInline(element, ctx.unit
|
|
103
|
+
const inline = this.transformInline(element, ctx.unit);
|
|
136
104
|
if (inline) {
|
|
137
105
|
const sourcePos = ctx.createSourcePos(element);
|
|
138
106
|
const result = {
|
|
@@ -160,7 +128,7 @@ export class HtmlUnitParser {
|
|
|
160
128
|
/**
|
|
161
129
|
* Transform hast inline content to Speculator inline
|
|
162
130
|
*/
|
|
163
|
-
transformInline(node, unit
|
|
131
|
+
transformInline(node, unit) {
|
|
164
132
|
if (node.type === 'text') {
|
|
165
133
|
const textNode = node;
|
|
166
134
|
// Skip whitespace-only text
|
|
@@ -175,7 +143,7 @@ export class HtmlUnitParser {
|
|
|
175
143
|
return null;
|
|
176
144
|
const element = node;
|
|
177
145
|
const tagName = element.tagName.toLowerCase();
|
|
178
|
-
const ctx = this.createContext(unit
|
|
146
|
+
const ctx = this.createContext(unit);
|
|
179
147
|
// Look up handler in registry
|
|
180
148
|
const handler = this.registry.getHtmlInlineHandler(tagName);
|
|
181
149
|
if (handler?.handleInline) {
|
|
@@ -196,13 +164,13 @@ export class HtmlUnitParser {
|
|
|
196
164
|
/**
|
|
197
165
|
* Transform array of inline children
|
|
198
166
|
*/
|
|
199
|
-
transformInlineChildren(children, unit
|
|
167
|
+
transformInlineChildren(children, unit) {
|
|
200
168
|
const results = [];
|
|
201
169
|
for (const child of children) {
|
|
202
170
|
if (child.type === 'element') {
|
|
203
171
|
const element = child;
|
|
204
172
|
const tagName = element.tagName.toLowerCase();
|
|
205
|
-
const ctx = this.createContext(unit
|
|
173
|
+
const ctx = this.createContext(unit);
|
|
206
174
|
const handler = this.registry.getHtmlInlineHandler(tagName);
|
|
207
175
|
if (handler?.handleInline) {
|
|
208
176
|
const result = handler.handleInline(element, ctx);
|
|
@@ -217,7 +185,7 @@ export class HtmlUnitParser {
|
|
|
217
185
|
}
|
|
218
186
|
}
|
|
219
187
|
}
|
|
220
|
-
const inline = this.transformInline(child, unit
|
|
188
|
+
const inline = this.transformInline(child, unit);
|
|
221
189
|
if (inline) {
|
|
222
190
|
results.push(inline);
|
|
223
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/parse/html/parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AAWvC,OAAO,EAEH,eAAe,GAGlB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/parse/html/parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AAWvC,OAAO,EAEH,eAAe,GAGlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;GAEG;AACH,SAAS,eAAe,CAAC,IAAgB,EAAE,IAAsB;IAC7D,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAc;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;QACzC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;KAC3B,CAAC;IAEF,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IACrC,CAAC;IACD,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAClC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QACtC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAGD;;GAEG;AACH,MAAM,OAAO,cAAc;IACd,MAAM,GAAG,MAAe,CAAC;IAE1B,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,QAAQ,CAAuB;IAEvC,YAAY,WAAiC,eAAe;QACxD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAgB;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAS,CAAC;QAExD,8BAA8B;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,IAAgB;QAClC,4DAA4D;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC;QAElB,OAAO;YACH,IAAI;YACJ,eAAe,EAAE,CAAC,IAAsB,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;YACxE,8DAA8D;YAC9D,uBAAuB,EAAE,CAAC,QAAe,EAAE,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC1F,8DAA8D;YAC9D,sBAAsB,EAAE,CAAC,QAAe,EAAE,EAAE;gBACxC,MAAM,OAAO,GAAwB,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACrC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrD,CAAC;gBACD,OAAO,OAAO,CAAC;YACnB,CAAC;YACD,cAAc;YACd,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAC;IACN,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAiB,EAAE,GAAiB;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAEvC,MAAM,OAAO,GAAG,IAAe,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAE9C,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE3D,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjD,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YACzC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QAED,yEAAyE;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAmB;gBAC3B,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;aACtD,CAAC;YACF,IAAI,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QAED,4CAA4C;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAmB;gBAC3B,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,OAAO;aACpB,CAAC;YACF,IAAI,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QAGD,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAiB,EAAE,IAAgB;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAgB,CAAC;YAClC,4BAA4B;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;gBAAE,OAAO,IAAI,CAAC;YAExC,OAAO;gBACH,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,QAAQ,CAAC,KAAK;aACxB,CAAC;QACN,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAe,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAErC,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE5D,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,iCAAiC;QACjC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,QAAuB,EAAE,IAAgB;QACrE,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,KAAgB,CAAC;gBACjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAE5D,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;oBACxB,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAClD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBAClB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;4BACxB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;wBAC5B,CAAC;6BAAM,CAAC;4BACJ,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACzB,CAAC;wBACD,SAAS;oBACb,CAAC;gBACL,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
|
package/dist/parse/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
export { parse, parseCompositeSource, parseWithRegistry, registerParser } from '#src/parse/pipeline';
|
|
8
8
|
export { ParseHandlerRegistry, defaultRegistry, } from '#src/parse/registry';
|
|
9
9
|
export type { HtmlParserModule, MarkdownParserModule, ParseContext, NodeWithPosition, HandlerResult, BlockHandlerResult, InlineHandlerResult, } from '#src/parse/registry';
|
|
10
|
-
export type { UnitParser, ParsedSpec,
|
|
10
|
+
export type { UnitParser, ParsedSpec, ParseResult, } from '#src/parse/types';
|
|
11
11
|
export { createSourcePos } from '#src/parse/types';
|
|
12
12
|
export { buildSectionHierarchy, assembleDocument } from '#src/parse/assembler';
|
|
13
13
|
export { MarkdownUnitParser } from '#src/parse/markdown/index';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parse/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrG,OAAO,EACH,oBAAoB,EACpB,eAAe,GAClB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACR,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACR,UAAU,EACV,UAAU,EACV,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parse/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrG,OAAO,EACH,oBAAoB,EACpB,eAAe,GAClB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACR,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACR,UAAU,EACV,UAAU,EACV,WAAW,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/parse/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parse/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sBAAsB;AACtB,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErG,6DAA6D;AAC7D,OAAO,EACH,oBAAoB,EACpB,eAAe,GAClB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parse/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sBAAsB;AACtB,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErG,6DAA6D;AAC7D,OAAO,EACH,oBAAoB,EACpB,eAAe,GAClB,MAAM,qBAAqB,CAAC;AAmB7B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,YAAY;AACZ,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,2BAA2B;AAC3B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Block Markdown Parser
|
|
3
|
+
*
|
|
4
|
+
* Handles standalone block-level HTML nodes in mdast (e.g., <aside>, <figure>).
|
|
5
|
+
*/
|
|
6
|
+
import { type MarkdownParserModule } from '#src/parse/registry';
|
|
7
|
+
/**
|
|
8
|
+
* Markdown parser module for block-level HTML nodes.
|
|
9
|
+
*
|
|
10
|
+
* Handles standalone HTML blocks like `<aside>...</aside>` or `<figure>`.
|
|
11
|
+
*/
|
|
12
|
+
export declare const HtmlBlockMarkdownParser: MarkdownParserModule;
|
|
13
|
+
//# sourceMappingURL=HtmlBlockMarkdownParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlBlockMarkdownParser.d.ts","sourceRoot":"","sources":["../../../src/parse/markdown/HtmlBlockMarkdownParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,oBAAoB,EAAwE,MAAM,qBAAqB,CAAC;AAGtI;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,oBAsDrC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Block Markdown Parser
|
|
3
|
+
*
|
|
4
|
+
* Handles standalone block-level HTML nodes in mdast (e.g., <aside>, <figure>).
|
|
5
|
+
*/
|
|
6
|
+
import { unified } from 'unified';
|
|
7
|
+
import rehypeParse from 'rehype-parse';
|
|
8
|
+
import { createHastContext } from '#src/parse/utils/hast-utils';
|
|
9
|
+
/**
|
|
10
|
+
* Markdown parser module for block-level HTML nodes.
|
|
11
|
+
*
|
|
12
|
+
* Handles standalone HTML blocks like `<aside>...</aside>` or `<figure>`.
|
|
13
|
+
*/
|
|
14
|
+
export const HtmlBlockMarkdownParser = {
|
|
15
|
+
name: 'HtmlBlockMarkdownParser',
|
|
16
|
+
handles: ['html'],
|
|
17
|
+
order: 4, // Higher priority than fallback parsers
|
|
18
|
+
handleInline(_node, _ctx) {
|
|
19
|
+
return null;
|
|
20
|
+
},
|
|
21
|
+
handleBlock(node, ctx) {
|
|
22
|
+
if (node.type !== 'html')
|
|
23
|
+
return null;
|
|
24
|
+
const htmlNode = node;
|
|
25
|
+
const html = htmlNode.value;
|
|
26
|
+
// Parse HTML to get proper element structure
|
|
27
|
+
const processor = unified().use(rehypeParse, { fragment: true });
|
|
28
|
+
const tree = processor.parse(html);
|
|
29
|
+
if (tree.children.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
const hastCtx = createHastContext(ctx);
|
|
32
|
+
// Look for the first top-level element
|
|
33
|
+
const firstElement = tree.children.find((c) => c.type === 'element');
|
|
34
|
+
if (!firstElement) {
|
|
35
|
+
// No element found - wrap text content in paragraph
|
|
36
|
+
const children = hastCtx.transformInlineChildren(tree.children);
|
|
37
|
+
return {
|
|
38
|
+
type: 'paragraph',
|
|
39
|
+
children,
|
|
40
|
+
sourcePos: ctx.createSourcePos(node),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Look up block handler for this element
|
|
44
|
+
const tagName = firstElement.tagName.toLowerCase();
|
|
45
|
+
const handler = ctx.registry.getHtmlBlockHandler(tagName);
|
|
46
|
+
if (handler?.handleBlock) {
|
|
47
|
+
const result = handler.handleBlock(firstElement, hastCtx);
|
|
48
|
+
if (Array.isArray(result))
|
|
49
|
+
return result[0] || null;
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
// Fallback: wrap as inlines in paragraph
|
|
53
|
+
const children = hastCtx.transformInlineChildren(tree.children);
|
|
54
|
+
return {
|
|
55
|
+
type: 'paragraph',
|
|
56
|
+
children,
|
|
57
|
+
sourcePos: ctx.createSourcePos(node),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=HtmlBlockMarkdownParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlBlockMarkdownParser.js","sourceRoot":"","sources":["../../../src/parse/markdown/HtmlBlockMarkdownParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AAIvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IACzD,IAAI,EAAE,yBAAyB;IAC/B,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,EAAE,wCAAwC;IAElD,YAAY,CAAC,KAAuB,EAAE,IAAkB;QACpD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,IAAsB,EAAE,GAAiB;QACjD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAY,CAAC;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QAE5B,6CAA6C;QAC7C,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAS,CAAC;QAE3C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAEvC,uCAAuC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAEnF,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,oDAAoD;YACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAyB,CAAC,CAAC;YACjF,OAAO;gBACH,IAAI,EAAE,WAAW;gBACjB,QAAQ;gBACR,SAAS,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;aACvC,CAAC;QACN,CAAC;QAED,yCAAyC;QACzC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE1D,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACpD,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAyB,CAAC,CAAC;QACjF,OAAO;YACH,IAAI,EAAE,WAAW;YACjB,QAAQ;YACR,SAAS,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;SACvC,CAAC;IACN,CAAC;CACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Inlines Markdown Parser
|
|
3
|
+
*
|
|
4
|
+
* Handles inline HTML nodes in mdast by grouping them within paragraphs
|
|
5
|
+
* and parsing with rehype to support multi-node tags like <dfn>...</dfn>.
|
|
6
|
+
*/
|
|
7
|
+
import { type MarkdownParserModule } from '#src/parse/registry';
|
|
8
|
+
/**
|
|
9
|
+
* Markdown parser module for HTML nodes.
|
|
10
|
+
*/
|
|
11
|
+
export declare const HtmlInlinesMarkdownParser: MarkdownParserModule;
|
|
12
|
+
//# sourceMappingURL=HtmlInlinesMarkdownParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlInlinesMarkdownParser.d.ts","sourceRoot":"","sources":["../../../src/parse/markdown/HtmlInlinesMarkdownParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,KAAK,oBAAoB,EAAwE,MAAM,qBAAqB,CAAC;AAsFtI;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,oBAmGvC,CAAC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Inlines Markdown Parser
|
|
3
|
+
*
|
|
4
|
+
* Handles inline HTML nodes in mdast by grouping them within paragraphs
|
|
5
|
+
* and parsing with rehype to support multi-node tags like <dfn>...</dfn>.
|
|
6
|
+
*/
|
|
7
|
+
import { unified } from 'unified';
|
|
8
|
+
import rehypeParse from 'rehype-parse';
|
|
9
|
+
/**
|
|
10
|
+
* Get element attribute value (mirrors logic from html/parser.ts)
|
|
11
|
+
*/
|
|
12
|
+
function getAttr(element, name) {
|
|
13
|
+
const val = element.properties?.[name];
|
|
14
|
+
if (typeof val === 'string')
|
|
15
|
+
return val;
|
|
16
|
+
if (Array.isArray(val))
|
|
17
|
+
return val.join(' ');
|
|
18
|
+
if (typeof val === 'number')
|
|
19
|
+
return String(val);
|
|
20
|
+
if (typeof val === 'boolean' && val)
|
|
21
|
+
return name;
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get text content of element recursively (mirrors logic from html/parser.ts)
|
|
26
|
+
*/
|
|
27
|
+
function getTextContent(element) {
|
|
28
|
+
let text = '';
|
|
29
|
+
for (const child of element.children) {
|
|
30
|
+
if (child.type === 'text') {
|
|
31
|
+
text += child.value;
|
|
32
|
+
}
|
|
33
|
+
else if (child.type === 'element') {
|
|
34
|
+
text += getTextContent(child);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return text;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Transform a hast node to Speculator inline(s) using HTML handlers
|
|
41
|
+
*/
|
|
42
|
+
function transformHastInline(node, ctx) {
|
|
43
|
+
if (node.type === 'text') {
|
|
44
|
+
const textValue = node.value;
|
|
45
|
+
// Delegate back to Markdown's transformInlineChildren to handle shorthands (|var|)
|
|
46
|
+
const res = ctx.transformInlineChildren([{ type: 'text', value: textValue }]);
|
|
47
|
+
return res.length === 0 ? null : res;
|
|
48
|
+
}
|
|
49
|
+
if (node.type !== 'element')
|
|
50
|
+
return null;
|
|
51
|
+
const element = node;
|
|
52
|
+
const tagName = element.tagName.toLowerCase();
|
|
53
|
+
// Look up handler in the registry provided in the context
|
|
54
|
+
const handler = ctx.registry.getHtmlInlineHandler(tagName);
|
|
55
|
+
if (handler?.handleInline) {
|
|
56
|
+
return handler.handleInline(element, ctx);
|
|
57
|
+
}
|
|
58
|
+
// Fallback: recurse into children if no handler for this tag
|
|
59
|
+
return ctx.transformInlineChildren(element.children);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a hast-aware ParseContext from a base (markdown) context
|
|
63
|
+
*/
|
|
64
|
+
function createHastContext(ctx) {
|
|
65
|
+
const originalTransform = ctx.transformInlineChildren;
|
|
66
|
+
const hastCtx = {
|
|
67
|
+
...ctx,
|
|
68
|
+
transformInlineChildren: (children) => {
|
|
69
|
+
const results = [];
|
|
70
|
+
for (const child of children) {
|
|
71
|
+
if (child.type === 'element') {
|
|
72
|
+
const res = transformHastInline(child, hastCtx);
|
|
73
|
+
if (res) {
|
|
74
|
+
if (Array.isArray(res))
|
|
75
|
+
results.push(...res);
|
|
76
|
+
else
|
|
77
|
+
results.push(res);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Delegate anything else (text, mdast nodes) to the original transformer
|
|
82
|
+
results.push(...originalTransform([child]));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return results;
|
|
86
|
+
},
|
|
87
|
+
getTextContent,
|
|
88
|
+
getAttr,
|
|
89
|
+
};
|
|
90
|
+
return hastCtx;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Markdown parser module for HTML nodes.
|
|
94
|
+
*/
|
|
95
|
+
export const HtmlInlinesMarkdownParser = {
|
|
96
|
+
name: 'HtmlInlinesMarkdownParser',
|
|
97
|
+
handles: ['html', 'paragraph'],
|
|
98
|
+
order: 4, // Higher priority than standard ParagraphsMarkdownParser (10)
|
|
99
|
+
handleInline(_node, _ctx) {
|
|
100
|
+
// Individual inline HTML nodes are now handled via the paragraph grouper.
|
|
101
|
+
return null;
|
|
102
|
+
},
|
|
103
|
+
handleBlock(node, ctx) {
|
|
104
|
+
// 1. Handle Paragraph Grouping
|
|
105
|
+
if (node.type === 'paragraph') {
|
|
106
|
+
const paraNode = node;
|
|
107
|
+
// Only take over if it contains HTML
|
|
108
|
+
if (paraNode.children.some(c => c.type === 'html')) {
|
|
109
|
+
let rawHtml = '';
|
|
110
|
+
for (const child of paraNode.children) {
|
|
111
|
+
if (child.type === 'text') {
|
|
112
|
+
rawHtml += child.value;
|
|
113
|
+
}
|
|
114
|
+
else if (child.type === 'html') {
|
|
115
|
+
rawHtml += child.value;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// For other nodes (if any already processed), we'd need serialization.
|
|
119
|
+
// Since we are order 4, it's mostly text/html.
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const processor = unified().use(rehypeParse, { fragment: true });
|
|
123
|
+
const tree = processor.parse(rawHtml);
|
|
124
|
+
const hastCtx = createHastContext(ctx);
|
|
125
|
+
const children = [];
|
|
126
|
+
for (const child of tree.children) {
|
|
127
|
+
const res = transformHastInline(child, hastCtx);
|
|
128
|
+
if (res) {
|
|
129
|
+
if (Array.isArray(res))
|
|
130
|
+
children.push(...res);
|
|
131
|
+
else
|
|
132
|
+
children.push(res);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const result = {
|
|
136
|
+
type: 'paragraph',
|
|
137
|
+
children,
|
|
138
|
+
};
|
|
139
|
+
const sourcePos = ctx.createSourcePos(node);
|
|
140
|
+
if (sourcePos)
|
|
141
|
+
result.sourcePos = sourcePos;
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
// 2. Handle Block-level HTML
|
|
147
|
+
if (node.type === 'html') {
|
|
148
|
+
const htmlNode = node;
|
|
149
|
+
const html = htmlNode.value;
|
|
150
|
+
const processor = unified().use(rehypeParse, { fragment: true });
|
|
151
|
+
const tree = processor.parse(html);
|
|
152
|
+
if (tree.children.length === 0)
|
|
153
|
+
return null;
|
|
154
|
+
const hastCtx = createHastContext(ctx);
|
|
155
|
+
// For blocks, we look at the first top-level element
|
|
156
|
+
const firstElement = tree.children.find((c) => c.type === 'element');
|
|
157
|
+
if (!firstElement) {
|
|
158
|
+
// Wrap in paragraph
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
160
|
+
const children = hastCtx.transformInlineChildren(tree.children);
|
|
161
|
+
return {
|
|
162
|
+
type: 'paragraph',
|
|
163
|
+
children,
|
|
164
|
+
sourcePos: ctx.createSourcePos(node),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const tagName = firstElement.tagName.toLowerCase();
|
|
168
|
+
const handler = ctx.registry.getHtmlBlockHandler(tagName);
|
|
169
|
+
if (handler?.handleBlock) {
|
|
170
|
+
const result = handler.handleBlock(firstElement, hastCtx);
|
|
171
|
+
if (Array.isArray(result))
|
|
172
|
+
return result[0] || null;
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
// Fallback: handle as inlines wrapped in paragraph
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
177
|
+
const children = hastCtx.transformInlineChildren(tree.children);
|
|
178
|
+
return {
|
|
179
|
+
type: 'paragraph',
|
|
180
|
+
children,
|
|
181
|
+
sourcePos: ctx.createSourcePos(node),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=HtmlInlinesMarkdownParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlInlinesMarkdownParser.js","sourceRoot":"","sources":["../../../src/parse/markdown/HtmlInlinesMarkdownParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Paragraph Markdown Parser
|
|
3
|
+
*
|
|
4
|
+
* Handles paragraphs containing inline HTML nodes in mdast by re-parsing
|
|
5
|
+
* with rehype to support multi-node tags like <dfn>...</dfn>.
|
|
6
|
+
*/
|
|
7
|
+
import { type MarkdownParserModule } from '#src/parse/registry';
|
|
8
|
+
/**
|
|
9
|
+
* Markdown parser module for paragraphs containing HTML nodes.
|
|
10
|
+
*
|
|
11
|
+
* When a paragraph contains inline HTML (e.g., `<dfn>term</dfn>`),
|
|
12
|
+
* this parser takes over to properly reconstruct the HTML elements.
|
|
13
|
+
*/
|
|
14
|
+
export declare const HtmlParagraphMarkdownParser: MarkdownParserModule;
|
|
15
|
+
//# sourceMappingURL=HtmlParagraphMarkdownParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlParagraphMarkdownParser.d.ts","sourceRoot":"","sources":["../../../src/parse/markdown/HtmlParagraphMarkdownParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,KAAK,oBAAoB,EAAwE,MAAM,qBAAqB,CAAC;AAItI;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,EAAE,oBAqDzC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Paragraph Markdown Parser
|
|
3
|
+
*
|
|
4
|
+
* Handles paragraphs containing inline HTML nodes in mdast by re-parsing
|
|
5
|
+
* with rehype to support multi-node tags like <dfn>...</dfn>.
|
|
6
|
+
*/
|
|
7
|
+
import { unified } from 'unified';
|
|
8
|
+
import rehypeParse from 'rehype-parse';
|
|
9
|
+
import { createHastContext, transformHastInline } from '#src/parse/utils/hast-utils';
|
|
10
|
+
/**
|
|
11
|
+
* Markdown parser module for paragraphs containing HTML nodes.
|
|
12
|
+
*
|
|
13
|
+
* When a paragraph contains inline HTML (e.g., `<dfn>term</dfn>`),
|
|
14
|
+
* this parser takes over to properly reconstruct the HTML elements.
|
|
15
|
+
*/
|
|
16
|
+
export const HtmlParagraphMarkdownParser = {
|
|
17
|
+
name: 'HtmlParagraphMarkdownParser',
|
|
18
|
+
handles: ['paragraph'],
|
|
19
|
+
order: 4, // Higher priority than standard ParagraphsMarkdownParser (10)
|
|
20
|
+
handleInline(_node, _ctx) {
|
|
21
|
+
return null;
|
|
22
|
+
},
|
|
23
|
+
handleBlock(node, ctx) {
|
|
24
|
+
if (node.type !== 'paragraph')
|
|
25
|
+
return null;
|
|
26
|
+
const paraNode = node;
|
|
27
|
+
// Only take over if paragraph contains HTML nodes
|
|
28
|
+
if (!paraNode.children.some(c => c.type === 'html')) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// Concatenate all text and html into raw HTML string
|
|
32
|
+
let rawHtml = '';
|
|
33
|
+
for (const child of paraNode.children) {
|
|
34
|
+
if (child.type === 'text') {
|
|
35
|
+
rawHtml += child.value;
|
|
36
|
+
}
|
|
37
|
+
else if (child.type === 'html') {
|
|
38
|
+
rawHtml += child.value;
|
|
39
|
+
}
|
|
40
|
+
// Other node types (if any) are skipped since we're order 4
|
|
41
|
+
}
|
|
42
|
+
// Re-parse as HTML to get proper element structure
|
|
43
|
+
const processor = unified().use(rehypeParse, { fragment: true });
|
|
44
|
+
const tree = processor.parse(rawHtml);
|
|
45
|
+
const hastCtx = createHastContext(ctx);
|
|
46
|
+
// Transform hast children to Speculator inlines
|
|
47
|
+
const children = [];
|
|
48
|
+
for (const child of tree.children) {
|
|
49
|
+
const res = transformHastInline(child, hastCtx);
|
|
50
|
+
if (res) {
|
|
51
|
+
if (Array.isArray(res))
|
|
52
|
+
children.push(...res);
|
|
53
|
+
else
|
|
54
|
+
children.push(res);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const result = {
|
|
58
|
+
type: 'paragraph',
|
|
59
|
+
children,
|
|
60
|
+
};
|
|
61
|
+
const sourcePos = ctx.createSourcePos(node);
|
|
62
|
+
if (sourcePos)
|
|
63
|
+
result.sourcePos = sourcePos;
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=HtmlParagraphMarkdownParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlParagraphMarkdownParser.js","sourceRoot":"","sources":["../../../src/parse/markdown/HtmlParagraphMarkdownParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AAKvC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAErF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAyB;IAC7D,IAAI,EAAE,6BAA6B;IACnC,OAAO,EAAE,CAAC,WAAW,CAAC;IACtB,KAAK,EAAE,CAAC,EAAE,8DAA8D;IAExE,YAAY,CAAC,KAAuB,EAAE,IAAkB;QACpD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,IAAsB,EAAE,GAAiB;QACjD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,QAAQ,GAAG,IAAiB,CAAC;QAEnC,kDAAkD;QAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,qDAAqD;QACrD,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,OAAO,IAAK,KAAc,CAAC,KAAK,CAAC;YACrC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,OAAO,IAAK,KAAc,CAAC,KAAK,CAAC;YACrC,CAAC;YACD,4DAA4D;QAChE,CAAC;QAED,mDAAmD;QACnD,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAS,CAAC;QAC9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAEvC,gDAAgD;QAChD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAoB,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;;oBACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAmB;YAC3B,IAAI,EAAE,WAAW;YACjB,QAAQ;SACX,CAAC;QACF,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS;YAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC5C,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shorthands Markdown Parser
|
|
3
|
+
*
|
|
4
|
+
* Detects ReSpec-like shorthands in text nodes and transforms them to Speculator AST nodes.
|
|
5
|
+
*/
|
|
6
|
+
import type { MarkdownParserModule, ParseContext, NodeWithPosition } from '#src/parse/registry';
|
|
7
|
+
import type { Inline } from '#src/types/ast.generated';
|
|
8
|
+
/**
|
|
9
|
+
* Definition of a shorthand and its implementation status
|
|
10
|
+
*/
|
|
11
|
+
export interface ShorthandDefinition {
|
|
12
|
+
name: string;
|
|
13
|
+
syntax: string;
|
|
14
|
+
description: string;
|
|
15
|
+
pattern: RegExp;
|
|
16
|
+
status: 'implemented' | 'planned' | 'not-planned';
|
|
17
|
+
handler: (match: RegExpExecArray, ctx: ParseContext, node: NodeWithPosition) => Inline;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Registry of supported shorthands.
|
|
21
|
+
* This satisfies the requirement to track what shorthands are implemented.
|
|
22
|
+
*/
|
|
23
|
+
export declare const SHORTHAND_REGISTRY: ShorthandDefinition[];
|
|
24
|
+
/**
|
|
25
|
+
* Markdown parser module for shorthands.
|
|
26
|
+
* Priority-based: it handles 'text' nodes and splits them into fragments.
|
|
27
|
+
*/
|
|
28
|
+
export declare const ShorthandsMarkdownParser: MarkdownParserModule;
|
|
29
|
+
//# sourceMappingURL=ShorthandsMarkdownParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShorthandsMarkdownParser.d.ts","sourceRoot":"","sources":["../../../src/parse/markdown/ShorthandsMarkdownParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAuB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACrH,OAAO,KAAK,EAAE,MAAM,EAA+C,MAAM,0BAA0B,CAAC;AAEpG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,CAAC;IAClD,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;CAC1F;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAkHnD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,oBAqEtC,CAAC"}
|