0
Fork 0
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:
Ben Holmes 2022-08-09 18:18:34 -05:00 committed by GitHub
parent a4f24266c0
commit b5ef1c2113
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 1 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Add rawContent and compiledContent to MD layout props

View file

@ -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`
};
}

View file

@ -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'));

View file

@ -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>)}