@mui/internal-docs-infra 0.3.1-canary.2 → 0.3.1-canary.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/esm/CodeControllerContext/CodeControllerContext.js +2 -2
- package/esm/CodeExternalsContext/CodeExternalsContext.js +1 -1
- package/esm/CodeHighlighter/CodeHighlighter.js +252 -327
- package/esm/CodeHighlighter/CodeHighlighterClient.js +447 -653
- package/esm/CodeHighlighter/CodeHighlighterContext.js +2 -2
- package/esm/CodeHighlighter/CodeHighlighterFallbackContext.js +2 -2
- package/esm/CodeHighlighter/codeToFallbackProps.js +21 -37
- package/esm/CodeHighlighter/errors.js +248 -400
- package/esm/CodeHighlighter/parseControlledCode.js +12 -20
- package/esm/CodeHighlighter/types.d.ts +7 -1
- package/esm/CodeProvider/CodeContext.js +3 -3
- package/esm/CodeProvider/CodeProvider.js +31 -40
- package/esm/abstractCreateDemo/abstractCreateDemo.js +13 -17
- package/esm/abstractCreateDemoClient/abstractCreateDemoClient.js +12 -12
- package/esm/cli/index.js +1 -1
- package/esm/cli/runValidate.js +160 -264
- package/esm/createDemoData/createDemoData.js +11 -12
- package/esm/createSitemap/createSitemap.js +2 -2
- package/esm/pipeline/getFileConventions/fileConventions.js +1 -1
- package/esm/pipeline/getFileConventions/getFileConventions.js +2 -15
- package/esm/pipeline/hastUtils/hastUtils.js +16 -17
- package/esm/pipeline/loadCodeVariant/addCodeVariantPaths.js +24 -24
- package/esm/pipeline/loadCodeVariant/applyCodeTransform.js +12 -22
- package/esm/pipeline/loadCodeVariant/calculateMainFilePath.js +30 -37
- package/esm/pipeline/loadCodeVariant/computeHastDeltas.js +107 -185
- package/esm/pipeline/loadCodeVariant/diffHast.js +18 -53
- package/esm/pipeline/loadCodeVariant/examineCodeVariant.js +24 -27
- package/esm/pipeline/loadCodeVariant/flattenCodeVariant.js +9 -10
- package/esm/pipeline/loadCodeVariant/hasAllCodeVariants.js +5 -5
- package/esm/pipeline/loadCodeVariant/loadCodeFallback.js +517 -727
- package/esm/pipeline/loadCodeVariant/loadCodeVariant.js +683 -1032
- package/esm/pipeline/loadCodeVariant/maybeCodeInitialData.js +14 -20
- package/esm/pipeline/loadCodeVariant/mergeCodeMetadata.js +53 -63
- package/esm/pipeline/loadCodeVariant/parseCode.js +40 -48
- package/esm/pipeline/loadCodeVariant/pathUtils.js +43 -64
- package/esm/pipeline/loadCodeVariant/transformSource.js +55 -125
- package/esm/pipeline/loadPrecomputedCodeHighlighter/loadPrecomputedCodeHighlighter.js +160 -221
- package/esm/pipeline/loadPrecomputedCodeHighlighter/parseCreateFactoryCall.js +377 -479
- package/esm/pipeline/loadPrecomputedCodeHighlighter/parseFunctionArguments.js +171 -173
- package/esm/pipeline/loadPrecomputedCodeHighlighter/performanceLogger.js +14 -30
- package/esm/pipeline/loadPrecomputedCodeHighlighter/replacePrecomputeValue.js +19 -21
- package/esm/pipeline/loadPrecomputedCodeHighlighter/serializeFunctionArguments.js +37 -71
- package/esm/pipeline/loadPrecomputedCodeHighlighterClient/filterRuntimeExternals.js +3 -9
- package/esm/pipeline/loadPrecomputedCodeHighlighterClient/generateImportStatements.js +54 -80
- package/esm/pipeline/loadPrecomputedCodeHighlighterClient/generateResolvedExternals.js +71 -98
- package/esm/pipeline/loadPrecomputedCodeHighlighterClient/injectImportsIntoSource.js +5 -5
- package/esm/pipeline/loadPrecomputedCodeHighlighterClient/loadPrecomputedCodeHighlighterClient.js +161 -211
- package/esm/pipeline/loadPrecomputedSitemap/loadPrecomputedSitemap.js +159 -207
- package/esm/pipeline/loadServerCodeMeta/loadServerCodeMeta.js +42 -64
- package/esm/pipeline/loadServerCodeMeta/resolveModulePathWithFs.js +20 -96
- package/esm/pipeline/loadServerPageIndex/loadServerPageIndex.js +66 -85
- package/esm/pipeline/loadServerSitemap/loadServerSitemap.js +71 -118
- package/esm/pipeline/loadServerSource/loadServerSource.js +121 -148
- package/esm/pipeline/loaderUtils/externalsToPackages.js +7 -7
- package/esm/pipeline/loaderUtils/extractNameAndSlugFromUrl.js +8 -12
- package/esm/pipeline/loaderUtils/fileUrlToPortablePath.js +5 -5
- package/esm/pipeline/loaderUtils/getFileNameFromUrl.js +19 -29
- package/esm/pipeline/loaderUtils/getLanguageFromExtension.d.ts +24 -0
- package/esm/pipeline/loaderUtils/getLanguageFromExtension.js +62 -0
- package/esm/pipeline/loaderUtils/index.d.ts +2 -1
- package/esm/pipeline/loaderUtils/index.js +2 -1
- package/esm/pipeline/loaderUtils/mergeExternals.js +15 -35
- package/esm/pipeline/loaderUtils/parseImportsAndComments.js +413 -433
- package/esm/pipeline/loaderUtils/processRelativeImports.js +153 -239
- package/esm/pipeline/loaderUtils/resolveModulePath.js +544 -1303
- package/esm/pipeline/loaderUtils/rewriteImports.js +73 -111
- package/esm/pipeline/parseSource/addLineGutters.js +33 -45
- package/esm/pipeline/parseSource/grammars.d.ts +12 -1
- package/esm/pipeline/parseSource/grammars.js +36 -4
- package/esm/pipeline/parseSource/index.d.ts +2 -1
- package/esm/pipeline/parseSource/index.js +2 -1
- package/esm/pipeline/parseSource/parseSource.js +23 -32
- package/esm/pipeline/syncPageIndex/createMarkdownNodes.js +32 -55
- package/esm/pipeline/syncPageIndex/mergeMetadataMarkdown.js +107 -160
- package/esm/pipeline/syncPageIndex/metadataToMarkdown.js +846 -1033
- package/esm/pipeline/syncPageIndex/syncPageIndex.js +291 -438
- package/esm/pipeline/transformHtmlCodePrecomputed/transformHtmlCodePrecomputed.js +266 -320
- package/esm/pipeline/transformMarkdownBlockquoteCallouts/transformMarkdownBlockquoteCallouts.js +10 -10
- package/esm/pipeline/transformMarkdownCode/transformMarkdownCode.js +183 -267
- package/esm/pipeline/transformMarkdownDemoLinks/transformMarkdownDemoLinks.js +25 -27
- package/esm/pipeline/transformMarkdownMetadata/transformMarkdownMetadata.js +572 -717
- package/esm/pipeline/transformMarkdownRelativePaths/transformMarkdownRelativePaths.js +8 -8
- package/esm/pipeline/transformTypescriptToJavascript/removeTypes.js +84 -113
- package/esm/pipeline/transformTypescriptToJavascript/transformTypescriptToJavascript.js +10 -26
- package/esm/useCode/Pre.d.ts +2 -0
- package/esm/useCode/Pre.js +58 -60
- package/esm/useCode/useCode.js +59 -61
- package/esm/useCode/useCodeUtils.js +54 -63
- package/esm/useCode/useCopyFunctionality.js +10 -9
- package/esm/useCode/useFileNavigation.js +171 -209
- package/esm/useCode/useSourceEditing.js +17 -14
- package/esm/useCode/useTransformManagement.js +23 -26
- package/esm/useCode/useUIState.js +12 -20
- package/esm/useCode/useVariantSelection.js +62 -79
- package/esm/useCopier/index.js +29 -56
- package/esm/useDemo/createCodeSandbox.js +12 -15
- package/esm/useDemo/createStackBlitz.js +14 -20
- package/esm/useDemo/exportVariant.js +200 -180
- package/esm/useDemo/exportVariantAsCra.js +22 -25
- package/esm/useDemo/useDemo.js +80 -84
- package/esm/useErrors/ErrorsContext.js +1 -1
- package/esm/useErrors/useErrors.js +3 -3
- package/esm/useLocalStorageState/useLocalStorageState.js +23 -39
- package/esm/usePreference/PreferencesProvider.js +1 -1
- package/esm/usePreference/usePreference.js +9 -11
- package/esm/useSearch/useSearch.js +290 -387
- package/esm/useUrlHashState/useUrlHashState.js +11 -14
- package/esm/withDocsInfra/withDeploymentConfig.js +26 -21
- package/esm/withDocsInfra/withDocsInfra.js +99 -101
- package/package.json +7 -4
|
@@ -1,85 +1,87 @@
|
|
|
1
|
-
import _regenerator from "@babel/runtime/helpers/esm/regenerator";
|
|
2
|
-
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
|
3
|
-
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
4
|
-
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
5
|
-
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
6
1
|
import { visit } from 'unist-util-visit';
|
|
7
2
|
import { loadCodeVariant } from "../loadCodeVariant/loadCodeVariant.js";
|
|
8
3
|
import { createParseSource } from "../parseSource/index.js";
|
|
9
4
|
import { TypescriptToJavascriptTransformer } from "../transformTypescriptToJavascript/index.js";
|
|
10
5
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
6
|
+
* Reserved data properties that are handled internally and should not be passed to userProps.
|
|
7
|
+
* These are either processed by the transform pipeline or have special meaning.
|
|
13
8
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Markdown
|
|
29
|
-
markdown: 'md',
|
|
30
|
-
md: 'md',
|
|
31
|
-
// MDX
|
|
32
|
-
mdx: 'mdx',
|
|
33
|
-
// HTML
|
|
34
|
-
html: 'html',
|
|
35
|
-
// CSS
|
|
36
|
-
css: 'css',
|
|
37
|
-
// Shell
|
|
38
|
-
shell: 'sh',
|
|
39
|
-
bash: 'sh',
|
|
40
|
-
sh: 'sh',
|
|
41
|
-
// YAML
|
|
42
|
-
yaml: 'yaml',
|
|
43
|
-
yml: 'yaml'
|
|
44
|
-
};
|
|
9
|
+
const RESERVED_DATA_PROPS = new Set(['dataFilename',
|
|
10
|
+
// Used for fileName
|
|
11
|
+
'dataVariant',
|
|
12
|
+
// Used for variant name
|
|
13
|
+
'dataTransform',
|
|
14
|
+
// Used for skipTransforms
|
|
15
|
+
'dataPrecompute',
|
|
16
|
+
// The precomputed output itself
|
|
17
|
+
'dataContentProps',
|
|
18
|
+
// The serialized user props output
|
|
19
|
+
'dataName',
|
|
20
|
+
// Used for demo name
|
|
21
|
+
'dataSlug' // Used for demo slug/URL
|
|
22
|
+
]);
|
|
45
23
|
|
|
46
24
|
/**
|
|
47
|
-
* Extracts
|
|
25
|
+
* Extracts user-defined data properties from a code element.
|
|
26
|
+
* Filters out reserved properties and returns remaining data-* attributes.
|
|
27
|
+
* Converts from camelCase (dataTitle) to kebab-case keys (title).
|
|
48
28
|
*/
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
-
|
|
29
|
+
function extractUserProps(codeElement) {
|
|
30
|
+
const props = codeElement.properties;
|
|
31
|
+
if (!props) {
|
|
32
|
+
return undefined;
|
|
52
33
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
34
|
+
const userProps = {};
|
|
35
|
+
for (const [key, value] of Object.entries(props)) {
|
|
36
|
+
// Only process data-* attributes (in camelCase form: dataXxx)
|
|
37
|
+
if (key.startsWith('data') && key.length > 4 && !RESERVED_DATA_PROPS.has(key)) {
|
|
38
|
+
// Convert dataTitle -> title, dataHighlight -> highlight
|
|
39
|
+
const propName = key.charAt(4).toLowerCase() + key.slice(5);
|
|
40
|
+
// Convert value to string
|
|
41
|
+
userProps[propName] = String(value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return Object.keys(userProps).length > 0 ? userProps : undefined;
|
|
58
45
|
}
|
|
59
46
|
|
|
60
47
|
/**
|
|
61
|
-
* Gets the filename from data-filename attribute
|
|
62
|
-
* Returns undefined if no explicit filename
|
|
48
|
+
* Gets the filename from data-filename attribute only
|
|
49
|
+
* Returns undefined if no explicit filename is provided
|
|
63
50
|
*/
|
|
64
51
|
function getFileName(codeElement) {
|
|
65
|
-
var _codeElement$properti, _codeElement$properti2;
|
|
66
52
|
// Check for explicit data-filename attribute
|
|
67
|
-
|
|
53
|
+
const dataFilename = codeElement.properties?.dataFilename;
|
|
68
54
|
if (dataFilename && typeof dataFilename === 'string') {
|
|
69
55
|
return dataFilename;
|
|
70
56
|
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
71
59
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Extracts language from a className like "language-typescript" or "language-js"
|
|
62
|
+
* Returns the language portion after "language-" prefix
|
|
63
|
+
*/
|
|
64
|
+
function extractLanguageFromClassName(className) {
|
|
65
|
+
if (!className) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const classes = Array.isArray(className) ? className : [className];
|
|
69
|
+
for (const cls of classes) {
|
|
70
|
+
if (typeof cls === 'string' && cls.startsWith('language-')) {
|
|
71
|
+
return cls.slice('language-'.length);
|
|
72
|
+
}
|
|
77
73
|
}
|
|
78
|
-
|
|
79
|
-
// Return undefined instead of a fallback - let the system handle gracefully
|
|
80
74
|
return undefined;
|
|
81
75
|
}
|
|
82
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Gets the language from class="language-*" attribute
|
|
79
|
+
*/
|
|
80
|
+
function getLanguage(codeElement) {
|
|
81
|
+
const className = codeElement.properties?.className;
|
|
82
|
+
return extractLanguageFromClassName(className);
|
|
83
|
+
}
|
|
84
|
+
|
|
83
85
|
/**
|
|
84
86
|
* Extracts text content from HAST nodes
|
|
85
87
|
*/
|
|
@@ -88,9 +90,7 @@ function extractTextContent(node) {
|
|
|
88
90
|
return node.value;
|
|
89
91
|
}
|
|
90
92
|
if (node.type === 'element' && node.children) {
|
|
91
|
-
return node.children.map(
|
|
92
|
-
return extractTextContent(child);
|
|
93
|
-
}).join('');
|
|
93
|
+
return node.children.map(child => extractTextContent(child)).join('');
|
|
94
94
|
}
|
|
95
95
|
return '';
|
|
96
96
|
}
|
|
@@ -100,51 +100,37 @@ function extractTextContent(node) {
|
|
|
100
100
|
* Handles both section/figure/dl and standalone dl structures
|
|
101
101
|
*/
|
|
102
102
|
function extractCodeFromSemanticStructure(element) {
|
|
103
|
-
|
|
103
|
+
const results = [];
|
|
104
104
|
if (element.tagName === 'section') {
|
|
105
105
|
// Handle section with multiple figures
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// Extract variant name from figcaption
|
|
115
|
-
var variantName = void 0;
|
|
116
|
-
var figcaption = figure.children.find(function (child) {
|
|
117
|
-
return child.type === 'element' && child.tagName === 'figcaption';
|
|
118
|
-
});
|
|
119
|
-
if (figcaption && figcaption.children[0] && figcaption.children[0].type === 'text') {
|
|
120
|
-
variantName = figcaption.children[0].value.replace(' variant', '');
|
|
121
|
-
}
|
|
106
|
+
const figures = element.children.filter(child => child.type === 'element' && child.tagName === 'figure');
|
|
107
|
+
for (const figure of figures) {
|
|
108
|
+
// Extract variant name from figcaption
|
|
109
|
+
let variantName;
|
|
110
|
+
const figcaption = figure.children.find(child => child.type === 'element' && child.tagName === 'figcaption');
|
|
111
|
+
if (figcaption && figcaption.children[0] && figcaption.children[0].type === 'text') {
|
|
112
|
+
variantName = figcaption.children[0].value.replace(' variant', '');
|
|
113
|
+
}
|
|
122
114
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
});
|
|
135
|
-
}
|
|
115
|
+
// Find dl element in figure
|
|
116
|
+
const dl = figure.children.find(child => child.type === 'element' && child.tagName === 'dl');
|
|
117
|
+
if (dl) {
|
|
118
|
+
const extracted = extractFromDl(dl);
|
|
119
|
+
if (extracted) {
|
|
120
|
+
results.push({
|
|
121
|
+
codeElement: extracted.codeElement,
|
|
122
|
+
filename: extracted.filename,
|
|
123
|
+
language: extracted.language,
|
|
124
|
+
variantName: variantName || extracted.variantName
|
|
125
|
+
});
|
|
136
126
|
}
|
|
137
127
|
}
|
|
138
|
-
} catch (err) {
|
|
139
|
-
_iterator.e(err);
|
|
140
|
-
} finally {
|
|
141
|
-
_iterator.f();
|
|
142
128
|
}
|
|
143
129
|
} else if (element.tagName === 'dl') {
|
|
144
130
|
// Handle standalone dl
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
results.push(
|
|
131
|
+
const extracted = extractFromDl(element);
|
|
132
|
+
if (extracted) {
|
|
133
|
+
results.push(extracted);
|
|
148
134
|
}
|
|
149
135
|
}
|
|
150
136
|
return results;
|
|
@@ -155,51 +141,38 @@ function extractCodeFromSemanticStructure(element) {
|
|
|
155
141
|
*/
|
|
156
142
|
function extractFromDl(dl) {
|
|
157
143
|
// Find dt for filename and dd for code
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
// Extract code from dd > pre > code
|
|
176
|
-
var pre = child.children.find(function (ddChild) {
|
|
177
|
-
return ddChild.type === 'element' && ddChild.tagName === 'pre';
|
|
178
|
-
});
|
|
179
|
-
if (pre) {
|
|
180
|
-
var code = pre.children.find(function (preChild) {
|
|
181
|
-
return preChild.type === 'element' && preChild.tagName === 'code';
|
|
182
|
-
});
|
|
183
|
-
if (code) {
|
|
184
|
-
codeElement = code;
|
|
185
|
-
}
|
|
144
|
+
let filename;
|
|
145
|
+
let codeElement;
|
|
146
|
+
for (const child of dl.children) {
|
|
147
|
+
if (child.type === 'element') {
|
|
148
|
+
if (child.tagName === 'dt') {
|
|
149
|
+
// Extract filename from dt > code
|
|
150
|
+
const codeInDt = child.children.find(dtChild => dtChild.type === 'element' && dtChild.tagName === 'code');
|
|
151
|
+
if (codeInDt && codeInDt.children[0] && codeInDt.children[0].type === 'text') {
|
|
152
|
+
filename = codeInDt.children[0].value;
|
|
153
|
+
}
|
|
154
|
+
} else if (child.tagName === 'dd') {
|
|
155
|
+
// Extract code from dd > pre > code
|
|
156
|
+
const pre = child.children.find(ddChild => ddChild.type === 'element' && ddChild.tagName === 'pre');
|
|
157
|
+
if (pre) {
|
|
158
|
+
const code = pre.children.find(preChild => preChild.type === 'element' && preChild.tagName === 'code');
|
|
159
|
+
if (code) {
|
|
160
|
+
codeElement = code;
|
|
186
161
|
}
|
|
187
162
|
}
|
|
188
163
|
}
|
|
189
164
|
}
|
|
190
|
-
} catch (err) {
|
|
191
|
-
_iterator2.e(err);
|
|
192
|
-
} finally {
|
|
193
|
-
_iterator2.f();
|
|
194
165
|
}
|
|
195
166
|
if (codeElement) {
|
|
196
|
-
var _codeElement$properti3;
|
|
197
167
|
// Extract variant name from data-variant if available
|
|
198
|
-
|
|
168
|
+
const variantName = codeElement.properties?.dataVariant;
|
|
169
|
+
// Extract language from className
|
|
170
|
+
const language = getLanguage(codeElement);
|
|
199
171
|
return {
|
|
200
|
-
codeElement
|
|
201
|
-
filename
|
|
202
|
-
|
|
172
|
+
codeElement,
|
|
173
|
+
filename,
|
|
174
|
+
language,
|
|
175
|
+
variantName
|
|
203
176
|
};
|
|
204
177
|
}
|
|
205
178
|
return null;
|
|
@@ -216,200 +189,173 @@ function extractFromDl(dl) {
|
|
|
216
189
|
* 5. Stores the combined precompute data on the root element
|
|
217
190
|
* 6. Clears all code element contents and replaces with error message
|
|
218
191
|
*/
|
|
219
|
-
export
|
|
220
|
-
return
|
|
221
|
-
|
|
222
|
-
var transformPromises, sourceParser, sourceTransformers;
|
|
223
|
-
return _regenerator().w(function (_context3) {
|
|
224
|
-
while (1) switch (_context3.n) {
|
|
225
|
-
case 0:
|
|
226
|
-
transformPromises = []; // Get the source parser and transformers
|
|
227
|
-
sourceParser = createParseSource();
|
|
228
|
-
sourceTransformers = [TypescriptToJavascriptTransformer];
|
|
229
|
-
visit(tree, 'element', function (node) {
|
|
230
|
-
var _node$properties;
|
|
231
|
-
var extractedElements = [];
|
|
192
|
+
export const transformHtmlCodePrecomputed = () => {
|
|
193
|
+
return async tree => {
|
|
194
|
+
const transformPromises = [];
|
|
232
195
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
196
|
+
// Get the source parser and transformers
|
|
197
|
+
const sourceParser = createParseSource();
|
|
198
|
+
const sourceTransformers = [TypescriptToJavascriptTransformer];
|
|
199
|
+
visit(tree, 'element', node => {
|
|
200
|
+
let extractedElements = [];
|
|
201
|
+
|
|
202
|
+
// Handle basic pre > code structure from standard markdown
|
|
203
|
+
if (node.tagName === 'pre' && node.children && node.children.length > 0 && !node.properties?.dataPrecompute // Don't process if already processed
|
|
204
|
+
) {
|
|
205
|
+
// Look for direct code element in pre
|
|
206
|
+
const codeElement = node.children.find(child => child.type === 'element' && child.tagName === 'code');
|
|
207
|
+
if (codeElement) {
|
|
208
|
+
// Extract filename from data-filename attribute (explicit only)
|
|
209
|
+
const filename = getFileName(codeElement);
|
|
210
|
+
// Extract language from className
|
|
211
|
+
const language = getLanguage(codeElement);
|
|
212
|
+
extractedElements = [{
|
|
213
|
+
codeElement,
|
|
214
|
+
filename,
|
|
215
|
+
language,
|
|
216
|
+
variantName: undefined // Basic pre > code doesn't have variants
|
|
217
|
+
}];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Look for section elements (multi-variant) or dl elements (single variant)
|
|
221
|
+
else if ((node.tagName === 'section' || node.tagName === 'dl') && node.children && node.children.length > 0) {
|
|
222
|
+
// Extract code elements from semantic structure
|
|
223
|
+
extractedElements = extractCodeFromSemanticStructure(node);
|
|
224
|
+
}
|
|
225
|
+
if (extractedElements.length > 0) {
|
|
226
|
+
const transformPromise = (async () => {
|
|
227
|
+
try {
|
|
228
|
+
// Create variants from extracted elements
|
|
229
|
+
const variants = {};
|
|
230
|
+
if (extractedElements.length === 1) {
|
|
231
|
+
// Single element - use "Default" as variant name
|
|
232
|
+
const {
|
|
233
|
+
codeElement,
|
|
234
|
+
filename,
|
|
235
|
+
language
|
|
236
|
+
} = extractedElements[0];
|
|
237
|
+
const sourceCode = extractTextContent(codeElement);
|
|
238
|
+
const variant = {
|
|
239
|
+
source: sourceCode,
|
|
240
|
+
skipTransforms: !codeElement.properties?.dataTransform
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// Add filename if explicitly provided
|
|
244
|
+
if (filename) {
|
|
245
|
+
variant.fileName = filename;
|
|
249
246
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
247
|
+
|
|
248
|
+
// Add language if available (from className)
|
|
249
|
+
if (language) {
|
|
250
|
+
variant.language = language;
|
|
254
251
|
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
// Single element - use "Default" as variant name
|
|
266
|
-
_extractedElements$ = extractedElements[0], _codeElement = _extractedElements$.codeElement, _filename = _extractedElements$.filename;
|
|
267
|
-
sourceCode = extractTextContent(_codeElement);
|
|
268
|
-
variant = {
|
|
269
|
-
source: sourceCode,
|
|
270
|
-
skipTransforms: !((_codeElement$properti4 = _codeElement.properties) != null && _codeElement$properti4.dataTransform)
|
|
271
|
-
}; // Add filename if available (prefer explicit filename over derived)
|
|
272
|
-
if (_filename) {
|
|
273
|
-
variant.fileName = _filename;
|
|
274
|
-
} else {
|
|
275
|
-
derivedFilename = getFileName(_codeElement);
|
|
276
|
-
if (derivedFilename) {
|
|
277
|
-
variant.fileName = derivedFilename;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
variants.Default = variant;
|
|
281
|
-
} else {
|
|
282
|
-
// Multiple elements - use variant names
|
|
283
|
-
extractedElements.forEach(function (_ref3, index) {
|
|
284
|
-
var _codeElement$properti5;
|
|
285
|
-
var codeElement = _ref3.codeElement,
|
|
286
|
-
filename = _ref3.filename,
|
|
287
|
-
variantName = _ref3.variantName;
|
|
288
|
-
var sourceCode = extractTextContent(codeElement);
|
|
252
|
+
variants.Default = variant;
|
|
253
|
+
} else {
|
|
254
|
+
// Multiple elements - use variant names
|
|
255
|
+
extractedElements.forEach(({
|
|
256
|
+
codeElement,
|
|
257
|
+
filename,
|
|
258
|
+
language,
|
|
259
|
+
variantName
|
|
260
|
+
}, index) => {
|
|
261
|
+
const sourceCode = extractTextContent(codeElement);
|
|
289
262
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
263
|
+
// Determine variant name
|
|
264
|
+
const finalVariantName = variantName || `Variant ${index + 1}`;
|
|
265
|
+
const variant = {
|
|
266
|
+
source: sourceCode,
|
|
267
|
+
skipTransforms: !codeElement.properties?.dataTransform
|
|
268
|
+
};
|
|
296
269
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
var _derivedFilename = getFileName(codeElement);
|
|
302
|
-
if (_derivedFilename) {
|
|
303
|
-
variant.fileName = _derivedFilename;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
variants[finalVariantName] = variant;
|
|
307
|
-
});
|
|
308
|
-
}
|
|
270
|
+
// Add filename if explicitly provided
|
|
271
|
+
if (filename) {
|
|
272
|
+
variant.fileName = filename;
|
|
273
|
+
}
|
|
309
274
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
case 0:
|
|
318
|
-
_ref6 = _slicedToArray(_ref4, 2), variantName = _ref6[0], variantData = _ref6[1];
|
|
319
|
-
if (!(variantData && _typeof(variantData) === 'object')) {
|
|
320
|
-
_context.n = 2;
|
|
321
|
-
break;
|
|
322
|
-
}
|
|
323
|
-
_context.n = 1;
|
|
324
|
-
return loadCodeVariant(undefined,
|
|
325
|
-
// url - not needed for inline code
|
|
326
|
-
variantName, variantData, {
|
|
327
|
-
sourceParser: sourceParser,
|
|
328
|
-
loadSource: undefined,
|
|
329
|
-
// loadSource - not needed since we have the data
|
|
330
|
-
loadVariantMeta: undefined,
|
|
331
|
-
// loadVariantMeta - not needed since we have the data
|
|
332
|
-
sourceTransformers: sourceTransformers,
|
|
333
|
-
disableTransforms: variantData.skipTransforms || false,
|
|
334
|
-
// TODO: output option
|
|
335
|
-
output: 'hastGzip'
|
|
336
|
-
});
|
|
337
|
-
case 1:
|
|
338
|
-
result = _context.v;
|
|
339
|
-
return _context.a(2, {
|
|
340
|
-
variantName: variantName,
|
|
341
|
-
processedVariant: result.code
|
|
342
|
-
});
|
|
343
|
-
case 2:
|
|
344
|
-
return _context.a(2, null);
|
|
345
|
-
}
|
|
346
|
-
}, _callee);
|
|
347
|
-
}));
|
|
348
|
-
return function (_x2) {
|
|
349
|
-
return _ref5.apply(this, arguments);
|
|
350
|
-
};
|
|
351
|
-
}());
|
|
352
|
-
_context2.n = 1;
|
|
353
|
-
return Promise.all(variantPromises);
|
|
354
|
-
case 1:
|
|
355
|
-
variantResults = _context2.v;
|
|
356
|
-
_iterator3 = _createForOfIteratorHelper(variantResults);
|
|
357
|
-
try {
|
|
358
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
359
|
-
result = _step3.value;
|
|
360
|
-
if (result) {
|
|
361
|
-
processedCode[result.variantName] = result.processedVariant;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
275
|
+
// Add language if available (from className)
|
|
276
|
+
if (language) {
|
|
277
|
+
variant.language = language;
|
|
278
|
+
}
|
|
279
|
+
variants[finalVariantName] = variant;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
364
282
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
283
|
+
// Process each variant with loadCodeVariant
|
|
284
|
+
const processedCode = {};
|
|
285
|
+
const variantPromises = Object.entries(variants).map(async ([variantName, variantData]) => {
|
|
286
|
+
if (variantData && typeof variantData === 'object') {
|
|
287
|
+
const result = await loadCodeVariant(undefined,
|
|
288
|
+
// url - not needed for inline code
|
|
289
|
+
variantName, variantData, {
|
|
290
|
+
sourceParser,
|
|
291
|
+
loadSource: undefined,
|
|
292
|
+
// loadSource - not needed since we have the data
|
|
293
|
+
loadVariantMeta: undefined,
|
|
294
|
+
// loadVariantMeta - not needed since we have the data
|
|
295
|
+
sourceTransformers,
|
|
296
|
+
disableTransforms: variantData.skipTransforms || false,
|
|
297
|
+
// TODO: output option
|
|
298
|
+
output: 'hastGzip'
|
|
299
|
+
});
|
|
300
|
+
return {
|
|
301
|
+
variantName,
|
|
302
|
+
processedVariant: result.code
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return null;
|
|
306
|
+
});
|
|
307
|
+
const variantResults = await Promise.all(variantPromises);
|
|
308
|
+
for (const result of variantResults) {
|
|
309
|
+
if (result) {
|
|
310
|
+
processedCode[result.variantName] = result.processedVariant;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
375
313
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
node.children = [{
|
|
379
|
-
type: 'text',
|
|
380
|
-
value: 'Error: expected pre tag with precomputed data to be handled by the CodeHighlighter component'
|
|
381
|
-
}];
|
|
314
|
+
// Extract user props from the first code element (they should be the same for all variants)
|
|
315
|
+
const userProps = extractUserProps(extractedElements[0].codeElement);
|
|
382
316
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
_context2.n = 3;
|
|
389
|
-
break;
|
|
390
|
-
case 2:
|
|
391
|
-
_context2.p = 2;
|
|
392
|
-
_t = _context2.v;
|
|
393
|
-
console.warn('Failed to transform code block:', _t);
|
|
394
|
-
case 3:
|
|
395
|
-
return _context2.a(2);
|
|
396
|
-
}
|
|
397
|
-
}, _callee2, null, [[0, 2]]);
|
|
398
|
-
}))();
|
|
399
|
-
transformPromises.push(transformPromise);
|
|
400
|
-
}
|
|
317
|
+
// Clear all code element contents
|
|
318
|
+
extractedElements.forEach(({
|
|
319
|
+
codeElement
|
|
320
|
+
}) => {
|
|
321
|
+
codeElement.children = [];
|
|
401
322
|
});
|
|
402
323
|
|
|
403
|
-
//
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
324
|
+
// Replace the semantic structure with a <pre> element
|
|
325
|
+
node.tagName = 'pre';
|
|
326
|
+
node.children = [{
|
|
327
|
+
type: 'text',
|
|
328
|
+
value: 'Error: expected pre tag with precomputed data to be handled by the CodeHighlighter component'
|
|
329
|
+
}];
|
|
330
|
+
|
|
331
|
+
// Set the precompute data on the pre element directly on properties for immediate HTML serialization
|
|
332
|
+
if (!node.properties) {
|
|
333
|
+
node.properties = {};
|
|
334
|
+
}
|
|
335
|
+
node.properties.dataPrecompute = JSON.stringify(processedCode);
|
|
336
|
+
|
|
337
|
+
// Pass through name and slug if provided on the code element
|
|
338
|
+
const firstCodeElement = extractedElements[0].codeElement;
|
|
339
|
+
if (firstCodeElement.properties?.dataName) {
|
|
340
|
+
node.properties.dataName = firstCodeElement.properties.dataName;
|
|
341
|
+
}
|
|
342
|
+
if (firstCodeElement.properties?.dataSlug) {
|
|
343
|
+
node.properties.dataSlug = firstCodeElement.properties.dataSlug;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Set user props if any exist
|
|
347
|
+
if (userProps) {
|
|
348
|
+
node.properties.dataContentProps = JSON.stringify(userProps);
|
|
349
|
+
}
|
|
350
|
+
} catch (error) {
|
|
351
|
+
console.warn('Failed to transform code block:', error);
|
|
352
|
+
}
|
|
353
|
+
})();
|
|
354
|
+
transformPromises.push(transformPromise);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
// Wait for all transformations to complete
|
|
359
|
+
await Promise.all(transformPromises);
|
|
360
|
+
};
|
|
415
361
|
};
|