Skip to content

Commit 2487aed

Browse files
committed
feat: move Renderer to markdoc, get Content component!
1 parent 44faff9 commit 2487aed

File tree

9 files changed

+45
-32
lines changed

9 files changed

+45
-32
lines changed

examples/with-markdoc/src/content/blog/test.mdoc

+29
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,32 @@ title: Example!
33
---
44

55
# Hey there
6+
7+
Look at this table! Built-in to Markdoc, neat.
8+
9+
{% table %}
10+
* Heading 1
11+
* Heading 2
12+
---
13+
* Row 1 Cell 1
14+
* Row 1 Cell 2
15+
---
16+
* Row 2 Cell 1
17+
* Row 2 cell 2
18+
{% /table %}
19+
20+
{% if $shouldMarquee %}
21+
{% mq direction="right" %}
22+
Im a marquee!
23+
{% /mq %}
24+
{% /if %}
25+
26+
{% link href=$href %}Link{% /link %}
27+
28+
```js
29+
const testing = true;
30+
function further() {
31+
console.log('still highlighted!')
32+
}
33+
```
34+

examples/with-markdoc/src/pages/index.astro

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
---
22
import { Markdoc } from '@astrojs/markdoc';
3-
import RenderMarkdoc from '../renderer/RenderMarkdoc.astro';
4-
5-
import { getTransformed } from '../components/test.mdoc';
63
import { Code } from 'astro/components';
74
import Marquee from '../components/Marquee.astro';
85
import { getEntryBySlug } from 'astro:content';
6+
import RedP from '../components/RedP.astro';
97
10-
const mdocEntry = await getEntryBySlug('blog', 'test');
11-
console.log(mdocEntry);
8+
const testEntry = await getEntryBySlug('blog', 'test');
9+
console.log(testEntry);
10+
const { Content } = await testEntry.render();
1211
---
1312

1413
<html lang="en">
@@ -22,10 +21,10 @@ console.log(mdocEntry);
2221
<body>
2322
<h1>Astro</h1>
2423
<article>
25-
<RenderMarkdoc
26-
content={await getTransformed()}
24+
<Content
2725
components={{
2826
marquee: Marquee,
27+
p: RedP,
2928
pre: {
3029
component: Code,
3130
props({ attributes, getTreeNode }) {

packages/astro/src/content/internal.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ async function render({
184184

185185
return {
186186
Content,
187-
headings: mod.getHeadings(),
188-
remarkPluginFrontmatter: mod.frontmatter,
187+
headings: mod.getHeadings?.() ?? [],
188+
remarkPluginFrontmatter: mod.frontmatter ?? {},
189189
};
190190
}

examples/with-markdoc/src/renderer/astroNode.ts renamed to packages/integrations/markdoc/components/astroNode.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ export function createAstroNode(
3636
return '';
3737
}
3838

39-
if (Object.hasOwn(components, node.name)) {
39+
if (node.name in components) {
4040
const componentRenderer = components[node.name];
4141
const component =
4242
'component' in componentRenderer ? componentRenderer.component : componentRenderer;
4343
const props =
44-
'props' in componentRenderer
44+
'props' in componentRenderer && typeof componentRenderer.props === 'function'
4545
? componentRenderer.props({
4646
attributes: node.attributes,
4747
getTreeNode() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as Renderer } from './Renderer.astro';

packages/integrations/markdoc/src/index.ts

+4-20
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,6 @@ const contentEntryType = {
1717
rawData: parsed.matter,
1818
};
1919
},
20-
async render({ entry }: { entry: any }) {
21-
function getParsed() {
22-
return Markdoc.parse(entry.body);
23-
}
24-
async function getTransformed(inlineConfig: any) {
25-
let config = inlineConfig;
26-
// TODO: load config file
27-
// if (!config) {
28-
// try {
29-
// const importedConfig = await import('./markdoc.config.ts');
30-
// config = importedConfig.default.transform;
31-
// } catch {}
32-
// }
33-
return Markdoc.transform(getParsed(), config);
34-
}
35-
return { getParsed, getTransformed };
36-
},
3720
};
3821

3922
export default function markdoc(partialOptions: {} = {}): AstroIntegration {
@@ -51,17 +34,18 @@ export default function markdoc(partialOptions: {} = {}): AstroIntegration {
5134
name: '@astrojs/markdoc',
5235
async transform(code, id) {
5336
if (!id.endsWith('.mdoc')) return;
54-
return `import { Markdoc } from '@astrojs/markdoc';\nexport const body = ${JSON.stringify(
37+
return `import { jsx as h } from 'astro/jsx-runtime';\nimport { Markdoc } from '@astrojs/markdoc';\nimport { Renderer } from '@astrojs/markdoc/components';\nexport const body = ${JSON.stringify(
5538
code
5639
)};\nexport function getParsed() { return Markdoc.parse(body); }\nexport async function getTransformed(inlineConfig) {
57-
let config = inlineConfig;
40+
let config = inlineConfig ?? {};
5841
if (!config) {
5942
try {
6043
const importedConfig = await import(${JSON.stringify(markdocConfigUrl.pathname)});
44+
console.log({ importedConfig })
6145
config = importedConfig.default.transform;
6246
} catch {}
6347
}
64-
return Markdoc.transform(getParsed(), config) }`;
48+
return Markdoc.transform(getParsed(), config) }\nexport async function Content ({ transformConfig, components }) { return h(Renderer, { content: await getTransformed(transformConfig), components }); }\nContent[Symbol.for('astro.needsHeadRendering')] = true;`;
6549
},
6650
},
6751
],

packages/integrations/markdoc/tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"extends": "../../../tsconfig.base.json",
3-
"include": ["src"],
3+
"include": ["src", "components"],
44
"compilerOptions": {
55
"allowJs": true,
66
"module": "ES2020",

0 commit comments

Comments
 (0)