mirror of
https://github.com/withastro/astro.git
synced 2024-12-16 21:46:22 -05:00
[MD] Add rawContent
and compiledContent
to MD layout props (#4222)
* fix: add subs for astro.source and astro.html * fix: define "source" property * test: raw and compiled content from layout * chore: changeset Co-authored-by: bholmesdev <bholmesdev@gmail.com>
This commit is contained in:
parent
a4f24266c0
commit
b5ef1c2113
4 changed files with 50 additions and 1 deletions
5
.changeset/warm-socks-exercise.md
Normal file
5
.changeset/warm-socks-exercise.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'astro': patch
|
||||
---
|
||||
|
||||
Add rawContent and compiledContent to MD layout props
|
|
@ -92,10 +92,28 @@ export default function markdown({ config, logging }: AstroPluginOptions): Plugi
|
|||
throw new Error('The "astro" property is no longer supported! To access "headings" from your layout, try using "Astro.props.headings."')
|
||||
}
|
||||
});
|
||||
Object.defineProperty(content.astro, 'html', {
|
||||
get() {
|
||||
throw new Error('The "astro" property is no longer supported! To access "html" from your layout, try using "Astro.props.compiledContent()."')
|
||||
}
|
||||
});
|
||||
Object.defineProperty(content.astro, 'source', {
|
||||
get() {
|
||||
throw new Error('The "astro" property is no longer supported! To access "source" from your layout, try using "Astro.props.rawContent()."')
|
||||
}
|
||||
});
|
||||
const contentFragment = h(Fragment, { 'set:html': html });
|
||||
return ${
|
||||
layout
|
||||
? `h(Layout, { content, frontmatter: content, headings: getHeadings(), 'server:root': true, children: contentFragment })`
|
||||
? `h(Layout, {
|
||||
content,
|
||||
frontmatter: content,
|
||||
headings: getHeadings(),
|
||||
rawContent,
|
||||
compiledContent,
|
||||
'server:root': true,
|
||||
children: contentFragment
|
||||
})`
|
||||
: `contentFragment`
|
||||
};
|
||||
}
|
||||
|
|
|
@ -89,6 +89,28 @@ describe('Astro Markdown', () => {
|
|||
expect(headingSlugs).to.contain('section-2');
|
||||
});
|
||||
|
||||
it('Passes compiled content to layout via "compiledContent" prop', async () => {
|
||||
const html = await fixture.readFile('/with-layout/index.html');
|
||||
const $ = cheerio.load(html);
|
||||
|
||||
const compiledContent = $('[data-compiled-content]');
|
||||
|
||||
expect(fixLineEndings(compiledContent.text()).trim()).to.equal(
|
||||
`<h2 id="section-1">Section 1</h2>\n<h2 id="section-2">Section 2</h2>`
|
||||
);
|
||||
});
|
||||
|
||||
it('Passes raw content to layout via "rawContent" prop', async () => {
|
||||
const html = await fixture.readFile('/with-layout/index.html');
|
||||
const $ = cheerio.load(html);
|
||||
|
||||
const rawContent = $('[data-raw-content]');
|
||||
|
||||
expect(fixLineEndings(rawContent.text()).trim()).to.equal(
|
||||
`## Section 1\n\n## Section 2`
|
||||
);
|
||||
});
|
||||
|
||||
it('Exposes getHeadings() on glob imports', async () => {
|
||||
const { headings } = JSON.parse(await fixture.readFile('/headings-glob.json'));
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ const {
|
|||
content = { title: "content didn't work" },
|
||||
frontmatter = { title: "frontmatter didn't work" },
|
||||
headings = [],
|
||||
compiledContent = () => '',
|
||||
rawContent = () => '',
|
||||
} = Astro.props;
|
||||
---
|
||||
|
||||
|
@ -18,6 +20,8 @@ const {
|
|||
<body>
|
||||
<p data-content-title>{content.title}</p>
|
||||
<p data-frontmatter-title>{frontmatter.title}</p>
|
||||
<p data-compiled-content>{compiledContent()}</p>
|
||||
<p data-raw-content>{rawContent()}</p>
|
||||
<p data-layout-rendered>Layout rendered!</p>
|
||||
<ul data-headings>
|
||||
{headings.map(heading => <li>{heading.slug}</li>)}
|
||||
|
|
Loading…
Reference in a new issue