diff options
Diffstat (limited to 'packages/integrations/markdoc/src')
-rw-r--r-- | packages/integrations/markdoc/src/content-entry-type.ts | 10 | ||||
-rw-r--r-- | packages/integrations/markdoc/src/heading-ids.ts | 17 | ||||
-rw-r--r-- | packages/integrations/markdoc/src/runtime.ts | 12 |
3 files changed, 29 insertions, 10 deletions
diff --git a/packages/integrations/markdoc/src/content-entry-type.ts b/packages/integrations/markdoc/src/content-entry-type.ts index 998d8fbb5..a41670a7b 100644 --- a/packages/integrations/markdoc/src/content-entry-type.ts +++ b/packages/integrations/markdoc/src/content-entry-type.ts @@ -49,7 +49,11 @@ export async function getContentEntryType({ const userMarkdocConfig = markdocConfigResult?.config ?? {}; const markdocConfigUrl = markdocConfigResult?.fileUrl; const pluginContext = this; - const markdocConfig = await setupConfig(userMarkdocConfig, options); + const markdocConfig = await setupConfig( + userMarkdocConfig, + options, + astroConfig.experimental.headingIdCompat, + ); const filePath = fileURLToPath(fileUrl); raiseValidationErrors({ ast, @@ -116,6 +120,7 @@ markdocConfig.nodes = { ...assetsConfig.nodes, ...markdocConfig.nodes }; ${getStringifiedImports(componentConfigByTagMap, 'Tag', astroConfig.root)} ${getStringifiedImports(componentConfigByNodeMap, 'Node', astroConfig.root)} +const experimentalHeadingIdCompat = ${JSON.stringify(astroConfig.experimental.headingIdCompat || false)} const tagComponentMap = ${getStringifiedMap(componentConfigByTagMap, 'Tag')}; const nodeComponentMap = ${getStringifiedMap(componentConfigByNodeMap, 'Node')}; @@ -126,7 +131,7 @@ const stringifiedAst = ${JSON.stringify( /* Double stringify to encode *as* stringified JSON */ JSON.stringify(ast), )}; -export const getHeadings = createGetHeadings(stringifiedAst, markdocConfig, options); +export const getHeadings = createGetHeadings(stringifiedAst, markdocConfig, options, experimentalHeadingIdCompat); export const Content = createContentComponent( Renderer, stringifiedAst, @@ -134,6 +139,7 @@ export const Content = createContentComponent( options, tagComponentMap, nodeComponentMap, + experimentalHeadingIdCompat, )`; return { code: res }; }, diff --git a/packages/integrations/markdoc/src/heading-ids.ts b/packages/integrations/markdoc/src/heading-ids.ts index 9290a3db6..7242e0e16 100644 --- a/packages/integrations/markdoc/src/heading-ids.ts +++ b/packages/integrations/markdoc/src/heading-ids.ts @@ -11,6 +11,7 @@ function getSlug( attributes: Record<string, any>, children: RenderableTreeNode[], headingSlugger: Slugger, + experimentalHeadingIdCompat: boolean, ): string { if (attributes.id && typeof attributes.id === 'string') { return attributes.id; @@ -18,12 +19,14 @@ function getSlug( const textContent = attributes.content ?? getTextContent(children); let slug = headingSlugger.slug(textContent); - if (slug.endsWith('-')) slug = slug.slice(0, -1); + if (!experimentalHeadingIdCompat) { + if (slug.endsWith('-')) slug = slug.slice(0, -1); + } return slug; } type HeadingIdConfig = MarkdocConfig & { - ctx: { headingSlugger: Slugger }; + ctx: { headingSlugger: Slugger; experimentalHeadingIdCompat: boolean }; }; /* @@ -47,7 +50,12 @@ export const heading: Schema = { 'Unexpected problem adding heading IDs to Markdoc file. Did you modify the `ctx.headingSlugger` property in your Markdoc config?', }); } - const slug = getSlug(attributes, children, config.ctx.headingSlugger); + const slug = getSlug( + attributes, + children, + config.ctx.headingSlugger, + config.ctx.experimentalHeadingIdCompat, + ); const render = config.nodes?.heading?.render ?? `h${level}`; @@ -64,11 +72,12 @@ export const heading: Schema = { }; // Called internally to ensure `ctx` is generated per-file, instead of per-build. -export function setupHeadingConfig(): HeadingIdConfig { +export function setupHeadingConfig(experimentalHeadingIdCompat: boolean): HeadingIdConfig { const headingSlugger = new Slugger(); return { ctx: { headingSlugger, + experimentalHeadingIdCompat, }, nodes: { heading, diff --git a/packages/integrations/markdoc/src/runtime.ts b/packages/integrations/markdoc/src/runtime.ts index f62bcec1a..44c232b79 100644 --- a/packages/integrations/markdoc/src/runtime.ts +++ b/packages/integrations/markdoc/src/runtime.ts @@ -19,8 +19,9 @@ import type { MarkdocIntegrationOptions } from './options.js'; export async function setupConfig( userConfig: AstroMarkdocConfig = {}, options: MarkdocIntegrationOptions | undefined, + experimentalHeadingIdCompat: boolean, ): Promise<MergedConfig> { - let defaultConfig: AstroMarkdocConfig = setupHeadingConfig(); + let defaultConfig: AstroMarkdocConfig = setupHeadingConfig(experimentalHeadingIdCompat); if (userConfig.extends) { for (let extension of userConfig.extends) { @@ -45,8 +46,9 @@ export async function setupConfig( export function setupConfigSync( userConfig: AstroMarkdocConfig = {}, options: MarkdocIntegrationOptions | undefined, + experimentalHeadingIdCompat: boolean, ): MergedConfig { - const defaultConfig: AstroMarkdocConfig = setupHeadingConfig(); + const defaultConfig: AstroMarkdocConfig = setupHeadingConfig(experimentalHeadingIdCompat); let merged = mergeConfig(defaultConfig, userConfig); @@ -168,12 +170,13 @@ export function createGetHeadings( stringifiedAst: string, userConfig: AstroMarkdocConfig, options: MarkdocIntegrationOptions | undefined, + experimentalHeadingIdCompat: boolean, ) { return function getHeadings() { /* Yes, we are transforming twice (once from `getHeadings()` and again from <Content /> in case of variables). TODO: propose new `render()` API to allow Markdoc variable passing to `render()` itself, instead of the Content component. Would remove double-transform and unlock variable resolution in heading slugs. */ - const config = setupConfigSync(userConfig, options); + const config = setupConfigSync(userConfig, options, experimentalHeadingIdCompat); const ast = Markdoc.Ast.fromJSON(stringifiedAst); const content = Markdoc.transform(ast as Node, config as ConfigType); let collectedHeadings: MarkdownHeading[] = []; @@ -189,12 +192,13 @@ export function createContentComponent( options: MarkdocIntegrationOptions | undefined, tagComponentMap: Record<string, AstroInstance['default']>, nodeComponentMap: Record<NodeType, AstroInstance['default']>, + experimentalHeadingIdCompat: boolean, ) { return createComponent({ async factory(result: any, props: Record<string, any>) { const withVariables = mergeConfig(userConfig, { variables: props }); const config = resolveComponentImports( - await setupConfig(withVariables, options), + await setupConfig(withVariables, options, experimentalHeadingIdCompat), tagComponentMap, nodeComponentMap, ); |