diff options
author | 2022-08-05 18:55:38 -0500 | |
---|---|---|
committer | 2022-08-05 18:55:38 -0500 | |
commit | 2675b8633c5d5c45b237ec87940d5eaf1bfb1b4b (patch) | |
tree | 171d8ff13cb81ed038ac52dc34ed2a313ae78903 /packages/markdown/remark/src | |
parent | 4678a3f358840db853db55b753b329ae592a589c (diff) | |
download | astro-2675b8633c5d5c45b237ec87940d5eaf1bfb1b4b.tar.gz astro-2675b8633c5d5c45b237ec87940d5eaf1bfb1b4b.tar.zst astro-2675b8633c5d5c45b237ec87940d5eaf1bfb1b4b.zip |
Frontmatter injection for MD and MDX (#4176)
* feat: inject vfile data as exports
* feat: add vfile to renderMarkdown output
* feat: add safe astroExports parser to utils
* refactor: expose vite-plugin-utils on astro package
* feat: handle astroExports in mdx
* deps: vfile
* chore: lockfile
* test: astroExports in mdx
* refactor: merge plugin exports into forntmatter
* refactor: astroExports -> astro.frontmatter
* refactor: md astroExports -> astro.frontmatter
* feat: astro.frontmatter vite-plugin-markdown
* chore: remove unused import
* fix: inline safelyGetAstroData in MDX integration
* chore: check that frontmatter export is valid export name
* chore: error log naming
* test: mdx remark frontmatter injection
* fix: inconsistent shiki mod resolution
* fix: add new frontmatter and heading props
* test: remark vdata
* fix: spread astro.data.frontmatter
* test deps: mdast-util-to-string, reading-time
* fix: astro-md test package name
* test: md frontmatter injection
* fix: layouts
* deps: remove vite-plugin-utils export
* fix: package lock
* chore: remove dup import
* chore: changeset
* chore: add comment on safelyGetAstroData source
* deps: move mdast-util-to-string + reading-time to test fixture
* chore: move remark plugins to test fixture
* fix: override plugin frontmatter with user frontmatter
* test: md injected frontmatter overrides
* test: frontmatter injection overrides mdx
Diffstat (limited to 'packages/markdown/remark/src')
-rw-r--r-- | packages/markdown/remark/src/index.ts | 12 | ||||
-rw-r--r-- | packages/markdown/remark/src/remark-initialize-astro-data.ts | 9 | ||||
-rw-r--r-- | packages/markdown/remark/src/types.ts | 2 |
3 files changed, 18 insertions, 5 deletions
diff --git a/packages/markdown/remark/src/index.ts b/packages/markdown/remark/src/index.ts index 4dfd7240f..0bb827c30 100644 --- a/packages/markdown/remark/src/index.ts +++ b/packages/markdown/remark/src/index.ts @@ -13,6 +13,7 @@ import remarkPrism from './remark-prism.js'; import scopedStyles from './remark-scoped-styles.js'; import remarkShiki from './remark-shiki.js'; import remarkUnwrap from './remark-unwrap.js'; +import { remarkInitializeAstroData } from './remark-initialize-astro-data.js'; import rehypeRaw from 'rehype-raw'; import rehypeStringify from 'rehype-stringify'; @@ -45,6 +46,7 @@ export async function renderMarkdown( let parser = unified() .use(markdown) + .use(remarkInitializeAstroData) .use(isAstroFlavoredMd ? [remarkMdxish, remarkMarkAndUnravel, remarkUnwrap, remarkEscape] : []); if (remarkPlugins.length === 0 && rehypePlugins.length === 0) { @@ -99,10 +101,9 @@ export async function renderMarkdown( ) .use(rehypeStringify, { allowDangerousHtml: true }); - let result: string; + let vfile: VFile; try { - const vfile = await parser.process(input); - result = vfile.toString(); + vfile = await parser.process(input); } catch (err) { // Ensure that the error message contains the input filename // to make it easier for the user to fix the issue @@ -113,8 +114,9 @@ export async function renderMarkdown( } return { - metadata: { headings, source: content, html: result.toString() }, - code: result.toString(), + metadata: { headings, source: content, html: String(vfile.value) }, + code: String(vfile.value), + vfile, }; } diff --git a/packages/markdown/remark/src/remark-initialize-astro-data.ts b/packages/markdown/remark/src/remark-initialize-astro-data.ts new file mode 100644 index 000000000..37af8aeaf --- /dev/null +++ b/packages/markdown/remark/src/remark-initialize-astro-data.ts @@ -0,0 +1,9 @@ +import type { VFile } from 'vfile'; + +export function remarkInitializeAstroData() { + return function (tree: any, vfile: VFile) { + if (!vfile.data.astro) { + vfile.data.astro = { frontmatter: {} }; + } + }; +} diff --git a/packages/markdown/remark/src/types.ts b/packages/markdown/remark/src/types.ts index 9d09ef294..3569e8d04 100644 --- a/packages/markdown/remark/src/types.ts +++ b/packages/markdown/remark/src/types.ts @@ -2,6 +2,7 @@ import type * as hast from 'hast'; import type * as mdast from 'mdast'; import type { ILanguageRegistration, IThemeRegistration, Theme } from 'shiki'; import type * as unified from 'unified'; +import type { VFile } from 'vfile'; export type { Node } from 'unist'; @@ -58,5 +59,6 @@ export interface MarkdownMetadata { export interface MarkdownRenderingResult { metadata: MarkdownMetadata; + vfile: VFile; code: string; } |