summaryrefslogtreecommitdiff
path: root/packages/integrations/markdoc/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/markdoc/src')
-rw-r--r--packages/integrations/markdoc/src/content-entry-type.ts10
-rw-r--r--packages/integrations/markdoc/src/heading-ids.ts17
-rw-r--r--packages/integrations/markdoc/src/runtime.ts12
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,
);