safe-mdx 1.3.1 → 1.3.3
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 +14 -14
- package/dist/assets/HtmlToJsxConverter-Ds0bTjpw.js +24 -0
- package/dist/assets/_commonjsHelpers-CqkleIqs.js +1 -0
- package/dist/assets/index-B5fPOjPt.css +1 -0
- package/dist/assets/index-B7ATSoRE.js +9 -0
- package/dist/assets/index-BwZ2FTRd.js +146 -0
- package/dist/assets/index-R1UqLMGJ.js +1 -0
- package/dist/assets/index-c0qeY2gs.js +9 -0
- package/dist/assets/jsx-runtime-BhZZLbvw.js +9 -0
- package/dist/assets/jsx-runtime-NArryeSM.js +1 -0
- package/dist/assets/react-Ca6JzGpx.js +1 -0
- package/dist/assets/react-dom-BYRHYqYl.js +1 -0
- package/dist/dynamic-esm-component.d.ts.map +1 -1
- package/dist/dynamic-esm-component.js +16 -1
- package/dist/dynamic-esm-component.js.map +1 -1
- package/dist/html/attributes.d.ts +19 -0
- package/dist/html/attributes.d.ts.map +1 -0
- package/dist/html/attributes.js +289 -0
- package/dist/html/attributes.js.map +1 -0
- package/dist/html/convert-attributes.d.ts +6 -0
- package/dist/html/convert-attributes.d.ts.map +1 -0
- package/dist/html/convert-attributes.js +43 -0
- package/dist/html/convert-attributes.js.map +1 -0
- package/dist/html/domparser-browser.d.ts +4 -0
- package/dist/html/domparser-browser.d.ts.map +1 -0
- package/dist/html/domparser-browser.js +7 -0
- package/dist/html/domparser-browser.js.map +1 -0
- package/dist/html/domparser.d.ts +2 -0
- package/dist/html/domparser.d.ts.map +1 -0
- package/dist/html/domparser.js +5 -0
- package/dist/html/domparser.js.map +1 -0
- package/dist/html/html-to-mdx-ast.d.ts +23 -0
- package/dist/html/html-to-mdx-ast.d.ts.map +1 -0
- package/dist/html/html-to-mdx-ast.js +227 -0
- package/dist/html/html-to-mdx-ast.js.map +1 -0
- package/dist/html/html-to-mdx-ast.test.d.ts +2 -0
- package/dist/html/html-to-mdx-ast.test.d.ts.map +1 -0
- package/dist/html/html-to-mdx-ast.test.js +324 -0
- package/dist/html/html-to-mdx-ast.test.js.map +1 -0
- package/dist/html/remark-mdx-jsx-normalize.d.ts +10 -0
- package/dist/html/remark-mdx-jsx-normalize.d.ts.map +1 -0
- package/dist/html/remark-mdx-jsx-normalize.js +117 -0
- package/dist/html/remark-mdx-jsx-normalize.js.map +1 -0
- package/dist/html/valid-html-elements.d.ts +10 -0
- package/dist/html/valid-html-elements.d.ts.map +1 -0
- package/dist/html/valid-html-elements.js +50 -0
- package/dist/html/valid-html-elements.js.map +1 -0
- package/dist/index.html +19 -0
- package/dist/parse.d.ts +2 -0
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +2 -0
- package/dist/parse.js.map +1 -1
- package/dist/safe-mdx.d.ts +2 -2
- package/dist/safe-mdx.d.ts.map +1 -1
- package/dist/safe-mdx.js +39 -77
- package/dist/safe-mdx.js.map +1 -1
- package/dist/safe-mdx.test.js +161 -8
- package/dist/safe-mdx.test.js.map +1 -1
- package/package.json +27 -6
- package/src/dynamic-esm-component.tsx +40 -10
- package/src/html/README +17 -0
- package/src/html/attributes.ts +297 -0
- package/src/html/convert-attributes.ts +59 -0
- package/src/html/domparser-browser.ts +6 -0
- package/src/html/domparser.ts +5 -0
- package/src/html/html-to-mdx-ast.test.ts +365 -0
- package/src/html/html-to-mdx-ast.ts +304 -0
- package/src/html/remark-mdx-jsx-normalize.ts +128 -0
- package/src/html/valid-html-elements.ts +65 -0
- package/src/parse.ts +3 -0
- package/src/safe-mdx.test.tsx +178 -12
- package/src/safe-mdx.tsx +61 -93
- package/dist/HtmlToJsxConverter.d.ts +0 -10
- package/dist/HtmlToJsxConverter.d.ts.map +0 -1
- package/dist/HtmlToJsxConverter.js +0 -22
- package/dist/HtmlToJsxConverter.js.map +0 -1
- package/dist/plugins.d.ts +0 -12
- package/dist/plugins.d.ts.map +0 -1
- package/dist/plugins.js +0 -68
- package/dist/plugins.js.map +0 -1
- package/src/HtmlToJsxConverter.tsx +0 -37
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { convertAttributeNameToJSX } from './convert-attributes.js';
|
|
2
|
+
import { parseHTML } from './domparser.js';
|
|
3
|
+
// Re-export the normalize plugin
|
|
4
|
+
export { default as remarkMdxJsxNormalize } from './remark-mdx-jsx-normalize.js';
|
|
5
|
+
// Type guard functions for DOM nodes
|
|
6
|
+
function isCommentNode(node) {
|
|
7
|
+
return node.nodeType === 8; // Node.COMMENT_NODE
|
|
8
|
+
}
|
|
9
|
+
function isTextNode(node) {
|
|
10
|
+
return node.nodeType === 3; // Node.TEXT_NODE
|
|
11
|
+
}
|
|
12
|
+
function isElementNode(node) {
|
|
13
|
+
return node.nodeType === 1; // Node.ELEMENT_NODE
|
|
14
|
+
}
|
|
15
|
+
// Default tag name converter (no transformation)
|
|
16
|
+
function defaultConvertTagName({ tagName }) {
|
|
17
|
+
return tagName.toLowerCase();
|
|
18
|
+
}
|
|
19
|
+
// Default attribute value converter (no transformation)
|
|
20
|
+
function defaultConvertAttributeValue({ value, }) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
// Convert HTML attribute to MDX JSX attribute
|
|
24
|
+
function convertAttribute(attr, tagName, options) {
|
|
25
|
+
let jsxName = convertAttributeNameToJSX(attr.name);
|
|
26
|
+
// Apply attribute value transformation
|
|
27
|
+
const convertAttrValue = options?.convertAttributeValue || defaultConvertAttributeValue;
|
|
28
|
+
let value = convertAttrValue({
|
|
29
|
+
name: attr.name,
|
|
30
|
+
value: attr.value,
|
|
31
|
+
tagName,
|
|
32
|
+
});
|
|
33
|
+
// Handle boolean attributes
|
|
34
|
+
if (value === '' || value === attr.name) {
|
|
35
|
+
return {
|
|
36
|
+
type: 'mdxJsxAttribute',
|
|
37
|
+
name: jsxName,
|
|
38
|
+
value: null, // boolean true
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Handle special number attributes
|
|
42
|
+
const numberAttrs = [
|
|
43
|
+
'tabIndex',
|
|
44
|
+
'cols',
|
|
45
|
+
'rows',
|
|
46
|
+
'size',
|
|
47
|
+
'span',
|
|
48
|
+
'colSpan',
|
|
49
|
+
'rowSpan',
|
|
50
|
+
'border',
|
|
51
|
+
];
|
|
52
|
+
if (numberAttrs.includes(jsxName) && value && !isNaN(Number(value))) {
|
|
53
|
+
return {
|
|
54
|
+
type: 'mdxJsxAttribute',
|
|
55
|
+
name: jsxName,
|
|
56
|
+
value: {
|
|
57
|
+
type: 'mdxJsxAttributeValueExpression',
|
|
58
|
+
value: value,
|
|
59
|
+
data: {
|
|
60
|
+
estree: {
|
|
61
|
+
type: 'Program',
|
|
62
|
+
sourceType: 'module',
|
|
63
|
+
body: [
|
|
64
|
+
{
|
|
65
|
+
type: 'ExpressionStatement',
|
|
66
|
+
expression: {
|
|
67
|
+
type: 'Literal',
|
|
68
|
+
value: Number(value),
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Handle style attribute - for now keep as string
|
|
78
|
+
// if (jsxName === 'style' && value.includes(':')) {
|
|
79
|
+
// // Could enhance to parse CSS to object
|
|
80
|
+
// return {
|
|
81
|
+
// type: 'mdxJsxAttribute',
|
|
82
|
+
// name: jsxName,
|
|
83
|
+
// value: {
|
|
84
|
+
// type: 'mdxJsxAttributeValueExpression',
|
|
85
|
+
// value: `{${JSON.stringify(parseStyleString(value))}}`,
|
|
86
|
+
// data: {
|
|
87
|
+
// estree: parseExpression(JSON.stringify(parseStyleString(value))),
|
|
88
|
+
// },
|
|
89
|
+
// },
|
|
90
|
+
// }
|
|
91
|
+
// }
|
|
92
|
+
// String value
|
|
93
|
+
return {
|
|
94
|
+
type: 'mdxJsxAttribute',
|
|
95
|
+
name: jsxName,
|
|
96
|
+
value: value,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Convert DOM node to MDX AST nodes
|
|
100
|
+
function htmlNodeToMdxAst(node, options) {
|
|
101
|
+
if (isCommentNode(node)) {
|
|
102
|
+
// Convert comments to MDX JSX expression with comment
|
|
103
|
+
// For now, return as HTML node
|
|
104
|
+
// return {
|
|
105
|
+
// type: 'html',
|
|
106
|
+
// value: `<!-- ${node.data} -->`
|
|
107
|
+
// } as Html
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
if (isTextNode(node)) {
|
|
111
|
+
const textValue = node.textContent || '';
|
|
112
|
+
// If we have a textToMdast converter, use it
|
|
113
|
+
if (options?.textToMdast) {
|
|
114
|
+
try {
|
|
115
|
+
const result = options.textToMdast({ text: textValue });
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
// Call onError callback if provided, otherwise log
|
|
120
|
+
if (options.onError) {
|
|
121
|
+
options.onError(error, textValue);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.error('Failed to convert text to mdast:', error);
|
|
125
|
+
console.error('Text content:', textValue);
|
|
126
|
+
}
|
|
127
|
+
// Fallback to simple text node
|
|
128
|
+
return {
|
|
129
|
+
type: 'text',
|
|
130
|
+
value: textValue,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Default: return simple text node
|
|
135
|
+
return {
|
|
136
|
+
type: 'text',
|
|
137
|
+
value: textValue,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (!isElementNode(node)) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
const convertTagNameFn = options?.convertTagName || defaultConvertTagName;
|
|
144
|
+
// Use localName which is always lowercase in both browser and linkedom
|
|
145
|
+
const componentName = convertTagNameFn({ tagName: node.localName });
|
|
146
|
+
// If convertTagName returns empty string, skip this element and only return its children
|
|
147
|
+
if (componentName === '') {
|
|
148
|
+
// Process children but skip the element wrapper
|
|
149
|
+
const children = [];
|
|
150
|
+
for (const child of Array.from(node.childNodes)) {
|
|
151
|
+
const result = htmlNodeToMdxAst(child, options);
|
|
152
|
+
if (Array.isArray(result)) {
|
|
153
|
+
children.push(...result);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
children.push(result);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return children;
|
|
160
|
+
}
|
|
161
|
+
// Convert attributes
|
|
162
|
+
const attributes = [];
|
|
163
|
+
for (const attr of Array.from(node.attributes)) {
|
|
164
|
+
attributes.push(convertAttribute(attr, node.tagName, options));
|
|
165
|
+
}
|
|
166
|
+
// Process children
|
|
167
|
+
const children = [];
|
|
168
|
+
for (const child of Array.from(node.childNodes)) {
|
|
169
|
+
const result = htmlNodeToMdxAst(child, options);
|
|
170
|
+
if (Array.isArray(result)) {
|
|
171
|
+
children.push(...result);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
children.push(result);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Always create MdxJsxTextElement initially
|
|
178
|
+
// The conversion to MdxJsxFlowElement will be handled by a separate plugin
|
|
179
|
+
const element = {
|
|
180
|
+
type: 'mdxJsxTextElement',
|
|
181
|
+
name: componentName,
|
|
182
|
+
attributes,
|
|
183
|
+
children: children,
|
|
184
|
+
};
|
|
185
|
+
return element;
|
|
186
|
+
}
|
|
187
|
+
// Main function to parse HTML and return MDX AST
|
|
188
|
+
export function htmlToMdxAst(options) {
|
|
189
|
+
// Parse HTML with linkedom
|
|
190
|
+
const { document } = parseHTML(options.html.trim());
|
|
191
|
+
// linkedom behavior:
|
|
192
|
+
// - If input is a fragment (like "<div>Hello</div>"), the content becomes direct children of document
|
|
193
|
+
// - If input has body tag, it creates proper body element
|
|
194
|
+
// - We need to handle both cases
|
|
195
|
+
// linkedom behavior:
|
|
196
|
+
// - When parsing fragments, content becomes direct children of document
|
|
197
|
+
// - Accessing document.body on fragments auto-creates HEAD and BODY as children
|
|
198
|
+
// - We must avoid accessing document.body to prevent this
|
|
199
|
+
// Just use document's direct children and filter for relevant nodes
|
|
200
|
+
const childNodes = Array.from(document.childNodes).filter((node) => node.nodeType === 1 || // Element nodes
|
|
201
|
+
node.nodeType === 3 || // Text nodes
|
|
202
|
+
node.nodeType === 8);
|
|
203
|
+
if (childNodes.length === 0) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
if (childNodes.length === 1) {
|
|
207
|
+
return htmlNodeToMdxAst(childNodes[0], options);
|
|
208
|
+
}
|
|
209
|
+
// Multiple nodes - return as array
|
|
210
|
+
const results = [];
|
|
211
|
+
for (const node of childNodes) {
|
|
212
|
+
const result = htmlNodeToMdxAst(node, options);
|
|
213
|
+
if (Array.isArray(result)) {
|
|
214
|
+
results.push(...result);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
results.push(result);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return results;
|
|
221
|
+
}
|
|
222
|
+
// Export a wrapper that always returns an array for consistency
|
|
223
|
+
export function parseHtmlToMdxAst(options) {
|
|
224
|
+
const result = htmlToMdxAst(options);
|
|
225
|
+
return Array.isArray(result) ? result : [result];
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=html-to-mdx-ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-to-mdx-ast.js","sourceRoot":"","sources":["../../src/html/html-to-mdx-ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-to-mdx-ast.test.d.ts","sourceRoot":"","sources":["../../src/html/html-to-mdx-ast.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { test, expect, describe } from 'vitest';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { renderToStaticMarkup } from 'react-dom/server';
|
|
4
|
+
import { parseHtmlToMdxAst, } from './html-to-mdx-ast.js';
|
|
5
|
+
import { unified } from 'unified';
|
|
6
|
+
import remarkMdx from 'remark-mdx';
|
|
7
|
+
import remarkStringify from 'remark-stringify';
|
|
8
|
+
import remarkParse from 'remark-parse';
|
|
9
|
+
import { mdxParse } from '../parse.js';
|
|
10
|
+
import { MdastToJsx } from '../safe-mdx.js';
|
|
11
|
+
// Default components for testing
|
|
12
|
+
const components = {
|
|
13
|
+
Heading({ level, children, ...props }) {
|
|
14
|
+
return React.createElement('h1', props, children);
|
|
15
|
+
},
|
|
16
|
+
Cards({ level, children, ...props }) {
|
|
17
|
+
return React.createElement('div', props, children);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
// Helper to convert HTML to MDX string and rendered HTML
|
|
21
|
+
async function htmlToMdxString({ html, withProcessor = false, onError, convertTagName, convertAttributeValue, }) {
|
|
22
|
+
// If withProcessor is true, create a textToMdast that parses markdown
|
|
23
|
+
const textToMdast = withProcessor
|
|
24
|
+
? ({ text }) => {
|
|
25
|
+
const markdownProcessor = unified()
|
|
26
|
+
.use(remarkParse)
|
|
27
|
+
.use(remarkMdx);
|
|
28
|
+
const mdast = markdownProcessor.parse(text);
|
|
29
|
+
markdownProcessor.runSync(mdast);
|
|
30
|
+
// Return the children of the root node
|
|
31
|
+
return mdast.children || [];
|
|
32
|
+
}
|
|
33
|
+
: undefined;
|
|
34
|
+
const mdxAst = parseHtmlToMdxAst({
|
|
35
|
+
html,
|
|
36
|
+
textToMdast,
|
|
37
|
+
onError,
|
|
38
|
+
convertTagName,
|
|
39
|
+
convertAttributeValue,
|
|
40
|
+
});
|
|
41
|
+
// Generate MDX string
|
|
42
|
+
const processor = unified().use(remarkMdx).use(remarkStringify, {
|
|
43
|
+
// bullet: '-',
|
|
44
|
+
// fence: '`',
|
|
45
|
+
// fences: true
|
|
46
|
+
});
|
|
47
|
+
// Create a root node with the content
|
|
48
|
+
const root = {
|
|
49
|
+
type: 'root',
|
|
50
|
+
children: mdxAst,
|
|
51
|
+
};
|
|
52
|
+
const mdx = processor.stringify(root);
|
|
53
|
+
// Generate HTML using MdastToJsx like in safe-mdx.test.tsx
|
|
54
|
+
// First parse the MDX to get the full AST
|
|
55
|
+
const mdast = mdxParse(mdx);
|
|
56
|
+
const visitor = new MdastToJsx({ markdown: mdx, mdast, components });
|
|
57
|
+
const jsx = visitor.run();
|
|
58
|
+
const renderedHtml = renderToStaticMarkup(jsx);
|
|
59
|
+
return { mdx, html: renderedHtml };
|
|
60
|
+
}
|
|
61
|
+
describe('parseHtmlToMdxAst', () => {
|
|
62
|
+
test('parses simple HTML element', () => {
|
|
63
|
+
const result = parseHtmlToMdxAst({ html: '<div>Hello</div>' });
|
|
64
|
+
expect(result).toMatchInlineSnapshot(`
|
|
65
|
+
[
|
|
66
|
+
{
|
|
67
|
+
"attributes": [],
|
|
68
|
+
"children": [
|
|
69
|
+
{
|
|
70
|
+
"type": "text",
|
|
71
|
+
"value": "Hello",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
"name": "div",
|
|
75
|
+
"type": "mdxJsxTextElement",
|
|
76
|
+
},
|
|
77
|
+
]
|
|
78
|
+
`);
|
|
79
|
+
});
|
|
80
|
+
test('filters out non-HTML elements when convertTagName returns empty string', () => {
|
|
81
|
+
const result = parseHtmlToMdxAst({
|
|
82
|
+
html: '<custom-element>Hello <span>world</span></custom-element>',
|
|
83
|
+
convertTagName: ({ tagName }) => {
|
|
84
|
+
// Only keep span, filter out custom-element
|
|
85
|
+
if (tagName === 'span')
|
|
86
|
+
return 'span';
|
|
87
|
+
return tagName;
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
expect(result).toMatchInlineSnapshot(`
|
|
91
|
+
[
|
|
92
|
+
{
|
|
93
|
+
"attributes": [],
|
|
94
|
+
"children": [
|
|
95
|
+
{
|
|
96
|
+
"type": "text",
|
|
97
|
+
"value": "Hello ",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"attributes": [],
|
|
101
|
+
"children": [
|
|
102
|
+
{
|
|
103
|
+
"type": "text",
|
|
104
|
+
"value": "world",
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
"name": "span",
|
|
108
|
+
"type": "mdxJsxTextElement",
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
"name": "custom-element",
|
|
112
|
+
"type": "mdxJsxTextElement",
|
|
113
|
+
},
|
|
114
|
+
]
|
|
115
|
+
`);
|
|
116
|
+
});
|
|
117
|
+
test('handles self-closing tags', () => {
|
|
118
|
+
const result = parseHtmlToMdxAst({
|
|
119
|
+
html: '<img src="https://example.com/img.jpg" />',
|
|
120
|
+
});
|
|
121
|
+
expect(result).toMatchInlineSnapshot(`
|
|
122
|
+
[
|
|
123
|
+
{
|
|
124
|
+
"attributes": [
|
|
125
|
+
{
|
|
126
|
+
"name": "src",
|
|
127
|
+
"type": "mdxJsxAttribute",
|
|
128
|
+
"value": "https://example.com/img.jpg",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
"children": [],
|
|
132
|
+
"name": "img",
|
|
133
|
+
"type": "mdxJsxTextElement",
|
|
134
|
+
},
|
|
135
|
+
]
|
|
136
|
+
`);
|
|
137
|
+
});
|
|
138
|
+
test('handles span with attributes', () => {
|
|
139
|
+
const result = parseHtmlToMdxAst({
|
|
140
|
+
html: '<span color="blue">colored text</span>',
|
|
141
|
+
});
|
|
142
|
+
expect(result).toMatchInlineSnapshot(`
|
|
143
|
+
[
|
|
144
|
+
{
|
|
145
|
+
"attributes": [
|
|
146
|
+
{
|
|
147
|
+
"name": "color",
|
|
148
|
+
"type": "mdxJsxAttribute",
|
|
149
|
+
"value": "blue",
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
"children": [
|
|
153
|
+
{
|
|
154
|
+
"type": "text",
|
|
155
|
+
"value": "colored text",
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
"name": "span",
|
|
159
|
+
"type": "mdxJsxTextElement",
|
|
160
|
+
},
|
|
161
|
+
]
|
|
162
|
+
`);
|
|
163
|
+
});
|
|
164
|
+
test('handles mixed content', () => {
|
|
165
|
+
const result = parseHtmlToMdxAst({
|
|
166
|
+
html: 'Some text <strong>bold</strong> more text',
|
|
167
|
+
});
|
|
168
|
+
expect(result).toMatchInlineSnapshot(`
|
|
169
|
+
[
|
|
170
|
+
{
|
|
171
|
+
"type": "text",
|
|
172
|
+
"value": "Some text ",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"attributes": [],
|
|
176
|
+
"children": [
|
|
177
|
+
{
|
|
178
|
+
"type": "text",
|
|
179
|
+
"value": "bold",
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
"name": "strong",
|
|
183
|
+
"type": "mdxJsxTextElement",
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"type": "text",
|
|
187
|
+
"value": " more text",
|
|
188
|
+
},
|
|
189
|
+
]
|
|
190
|
+
`);
|
|
191
|
+
});
|
|
192
|
+
test('handles comments', () => {
|
|
193
|
+
const result = parseHtmlToMdxAst({ html: '<!-- This is a comment -->' });
|
|
194
|
+
expect(result).toMatchInlineSnapshot(`[]`);
|
|
195
|
+
});
|
|
196
|
+
test('handles table with attributes', () => {
|
|
197
|
+
const result = parseHtmlToMdxAst({
|
|
198
|
+
html: '<table class="data-table"><tr><td>Cell</td></tr></table>',
|
|
199
|
+
});
|
|
200
|
+
expect(result).toMatchInlineSnapshot(`
|
|
201
|
+
[
|
|
202
|
+
{
|
|
203
|
+
"attributes": [
|
|
204
|
+
{
|
|
205
|
+
"name": "className",
|
|
206
|
+
"type": "mdxJsxAttribute",
|
|
207
|
+
"value": "data-table",
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
"children": [
|
|
211
|
+
{
|
|
212
|
+
"attributes": [],
|
|
213
|
+
"children": [
|
|
214
|
+
{
|
|
215
|
+
"attributes": [],
|
|
216
|
+
"children": [
|
|
217
|
+
{
|
|
218
|
+
"type": "text",
|
|
219
|
+
"value": "Cell",
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
"name": "td",
|
|
223
|
+
"type": "mdxJsxTextElement",
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
"name": "tr",
|
|
227
|
+
"type": "mdxJsxTextElement",
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
"name": "table",
|
|
231
|
+
"type": "mdxJsxTextElement",
|
|
232
|
+
},
|
|
233
|
+
]
|
|
234
|
+
`);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('parseHtmlToMdxAst with markdown processor', () => {
|
|
238
|
+
test('parses markdown inside HTML tags', async () => {
|
|
239
|
+
const htmlToConvert = '<div>This is **bold** text</div>';
|
|
240
|
+
const result = await htmlToMdxString({
|
|
241
|
+
html: htmlToConvert,
|
|
242
|
+
withProcessor: true,
|
|
243
|
+
onError: (e) => {
|
|
244
|
+
throw e;
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
expect(result).toMatchInlineSnapshot(`
|
|
248
|
+
{
|
|
249
|
+
"html": "<div>This is <strong>bold</strong> text</div>",
|
|
250
|
+
"mdx": "<div>This is **bold** text</div>
|
|
251
|
+
",
|
|
252
|
+
}
|
|
253
|
+
`);
|
|
254
|
+
});
|
|
255
|
+
test('handles mixed markdown and HTML inside tags', async () => {
|
|
256
|
+
const htmlToConvert = '<div>**Bold text:** <a href="#">link</a></div>';
|
|
257
|
+
const result = await htmlToMdxString({
|
|
258
|
+
html: htmlToConvert,
|
|
259
|
+
withProcessor: true,
|
|
260
|
+
onError: (e) => {
|
|
261
|
+
throw e;
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
expect(result).toMatchInlineSnapshot(`
|
|
265
|
+
{
|
|
266
|
+
"html": "<div><strong>Bold text:</strong><a href="#">link</a></div>",
|
|
267
|
+
"mdx": "<div>**Bold text:**<a href="#">link</a></div>
|
|
268
|
+
",
|
|
269
|
+
}
|
|
270
|
+
`);
|
|
271
|
+
});
|
|
272
|
+
test('handles markdown inside table cells', async () => {
|
|
273
|
+
const htmlToConvert = '<table><tr><td>**Bold** text and [link](http://example.com)</td></tr></table>';
|
|
274
|
+
const result = await htmlToMdxString({
|
|
275
|
+
html: htmlToConvert,
|
|
276
|
+
withProcessor: true,
|
|
277
|
+
onError: (e) => {
|
|
278
|
+
throw e;
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
expect(result).toMatchInlineSnapshot(`
|
|
282
|
+
{
|
|
283
|
+
"html": "<table><tr><td><strong>Bold</strong> text and <a href="http://example.com" title="">link</a></td></tr></table>",
|
|
284
|
+
"mdx": "<table><tr><td>**Bold** text and [link](http://example.com)</td></tr></table>
|
|
285
|
+
",
|
|
286
|
+
}
|
|
287
|
+
`);
|
|
288
|
+
});
|
|
289
|
+
test('preserves plain text when no markdown', async () => {
|
|
290
|
+
const htmlToConvert = '<div>Plain text without markdown</div>';
|
|
291
|
+
const result = await htmlToMdxString({
|
|
292
|
+
html: htmlToConvert,
|
|
293
|
+
withProcessor: true,
|
|
294
|
+
onError: (e) => {
|
|
295
|
+
throw e;
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
expect(result).toMatchInlineSnapshot(`
|
|
299
|
+
{
|
|
300
|
+
"html": "<div>Plain text without markdown</div>",
|
|
301
|
+
"mdx": "<div>Plain text without markdown</div>
|
|
302
|
+
",
|
|
303
|
+
}
|
|
304
|
+
`);
|
|
305
|
+
});
|
|
306
|
+
test('handles nested HTML tags with markdown', async () => {
|
|
307
|
+
const htmlToConvert = '<div><span>**Bold** and <a href="#">link</a></span></div>';
|
|
308
|
+
const result = await htmlToMdxString({
|
|
309
|
+
html: htmlToConvert,
|
|
310
|
+
withProcessor: true,
|
|
311
|
+
onError: (e) => {
|
|
312
|
+
throw e;
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
expect(result).toMatchInlineSnapshot(`
|
|
316
|
+
{
|
|
317
|
+
"html": "<div><span><strong>Bold</strong> and<a href="#">link</a></span></div>",
|
|
318
|
+
"mdx": "<div><span>**Bold** and<a href="#">link</a></span></div>
|
|
319
|
+
",
|
|
320
|
+
}
|
|
321
|
+
`);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
//# sourceMappingURL=html-to-mdx-ast.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-to-mdx-ast.test.js","sourceRoot":"","sources":["../../src/html/html-to-mdx-ast.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EACH,iBAAiB,GAGpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,eAAe,MAAM,kBAAkB,CAAA;AAC9C,OAAO,WAAW,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,iCAAiC;AACjC,MAAM,UAAU,GAAG;IACf,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE;QACjC,OAAO,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACrD,CAAC;IACD,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE;QAC/B,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACtD,CAAC;CACJ,CAAA;AAED,yDAAyD;AACzD,KAAK,UAAU,eAAe,CAAC,EAC3B,IAAI,EACJ,aAAa,GAAG,KAAK,EACrB,OAAO,EACP,cAAc,EACd,qBAAqB,GAWxB;IACG,sEAAsE;IACtE,MAAM,WAAW,GAAG,aAAa;QAC7B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE;YAC3B,MAAM,iBAAiB,GAAG,OAAO,EAAE;iBAC9B,GAAG,CAAC,WAAW,CAAC;iBAChB,GAAG,CAAC,SAAS,CAAC,CAAA;YACnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAQ,CAAA;YAClD,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAChC,uCAAuC;YACvC,OAAO,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAA;QAC/B,CAAC;QACH,CAAC,CAAC,SAAS,CAAA;IAEf,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC7B,IAAI;QACJ,WAAW;QACX,OAAO;QACP,cAAc;QACd,qBAAqB;KACxB,CAAC,CAAA;IAEF,sBAAsB;IACtB,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE;IAC5D,eAAe;IACf,cAAc;IACd,eAAe;KAClB,CAAC,CAAA;IAEF,sCAAsC;IACtC,MAAM,IAAI,GAAG;QACT,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,MAAM;KACnB,CAAA;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,IAAW,CAAC,CAAA;IAE5C,2DAA2D;IAC3D,0CAA0C;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAE9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;AACtC,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAA;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;SAcpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,2DAA2D;YACjE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC5B,4CAA4C;gBAC5C,IAAI,OAAO,KAAK,MAAM;oBAAE,OAAO,MAAM,CAAA;gBACrC,OAAO,OAAO,CAAA;YAClB,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;SAyBpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,2CAA2C;SACpD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;SAepC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,wCAAwC;SACjD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;SAoBpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,2CAA2C;SACpD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;SAsBpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,0DAA0D;SACnE,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAkCpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACvD,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,aAAa,GAAG,kCAAkC,CAAA;QACxD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,aAAa,GAAG,gDAAgD,CAAA;QACtE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,aAAa,GACf,+EAA+E,CAAA;QACnF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,aAAa,GAAG,wCAAwC,CAAA;QAC9D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,aAAa,GACf,2DAA2D,CAAA;QAC/D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Root } from 'mdast';
|
|
2
|
+
/**
|
|
3
|
+
* remark plugin: make mdxJsx* element kinds match their context.
|
|
4
|
+
* - Inside phrasing parents → mdxJsxTextElement
|
|
5
|
+
* - Inside flow parents → mdxJsxFlowElement
|
|
6
|
+
* - Elements with block-level tag names → mdxJsxFlowElement
|
|
7
|
+
* - Elements containing non-phrasing children → mdxJsxFlowElement
|
|
8
|
+
*/
|
|
9
|
+
export default function remarkMdxJsxNormalize(): (tree: Root) => void;
|
|
10
|
+
//# sourceMappingURL=remark-mdx-jsx-normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remark-mdx-jsx-normalize.d.ts","sourceRoot":"","sources":["../../src/html/remark-mdx-jsx-normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAgC,MAAM,OAAO,CAAA;AA8E/D;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,WACT,IAAI,UAoCvC"}
|