Skip to content

Commit d700a66

Browse files
authored
feat: support markdown sfc options (#1238)
1 parent 19c0f43 commit d700a66

File tree

6 files changed

+90
-75
lines changed

6 files changed

+90
-75
lines changed

docs/config/app-configs.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,18 @@ interface MarkdownOptions extends MarkdownIt.Options {
160160
disable?: boolean
161161
}
162162

163+
// @mdit-vue/plugin-frontmatter plugin options.
164+
// See: https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-frontmatter#options
165+
frontmatter?: FrontmatterPluginOptions
166+
167+
// @mdit-vue/plugin-headers plugin options.
168+
// See: https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-headers#options
169+
headers?: HeadersPluginOptions
170+
171+
// @mdit-vue/plugin-sfc plugin options.
172+
// See: https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-sfc#options
173+
sfc?: SfcPluginOptions
174+
163175
// @mdit-vue/plugin-toc plugin options.
164176
// See: https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-toc#options
165177
toc?: TocPluginOptions

package.json

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,14 @@
9292
"vue": "^3.2.37"
9393
},
9494
"devDependencies": {
95-
"@mdit-vue/plugin-component": "^0.10.0",
96-
"@mdit-vue/plugin-frontmatter": "^0.10.0",
97-
"@mdit-vue/plugin-headers": "^0.10.0",
98-
"@mdit-vue/plugin-title": "^0.10.0",
99-
"@mdit-vue/plugin-toc": "^0.10.0",
100-
"@mdit-vue/shared": "^0.10.0",
101-
"@mdit-vue/types": "^0.10.0",
95+
"@mdit-vue/plugin-component": "^0.11.0",
96+
"@mdit-vue/plugin-frontmatter": "^0.11.0",
97+
"@mdit-vue/plugin-headers": "^0.11.0",
98+
"@mdit-vue/plugin-sfc": "^0.11.0",
99+
"@mdit-vue/plugin-title": "^0.11.0",
100+
"@mdit-vue/plugin-toc": "^0.11.0",
101+
"@mdit-vue/shared": "^0.11.0",
102+
"@mdit-vue/types": "^0.11.0",
102103
"@rollup/plugin-alias": "^3.1.9",
103104
"@rollup/plugin-commonjs": "^22.0.2",
104105
"@rollup/plugin-json": "^4.1.0",

pnpm-lock.yaml

Lines changed: 46 additions & 36 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/node/markdown/markdown.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
headersPlugin,
1212
type HeadersPluginOptions
1313
} from '@mdit-vue/plugin-headers'
14+
import { sfcPlugin, type SfcPluginOptions } from '@mdit-vue/plugin-sfc'
1415
import { titlePlugin } from '@mdit-vue/plugin-title'
1516
import { tocPlugin, type TocPluginOptions } from '@mdit-vue/plugin-toc'
1617
import { IThemeRegistration } from 'shiki'
@@ -20,7 +21,6 @@ import { highlightLinePlugin } from './plugins/highlightLines'
2021
import { lineNumberPlugin } from './plugins/lineNumbers'
2122
import { containerPlugin } from './plugins/containers'
2223
import { snippetPlugin } from './plugins/snippet'
23-
import { hoistPlugin } from './plugins/hoist'
2424
import { preWrapperPlugin } from './plugins/preWrapper'
2525
import { linkPlugin } from './plugins/link'
2626
import { imagePlugin } from './plugins/image'
@@ -42,13 +42,13 @@ export interface MarkdownOptions extends MarkdownIt.Options {
4242
}
4343
frontmatter?: FrontmatterPluginOptions
4444
headers?: HeadersPluginOptions
45+
sfc?: SfcPluginOptions
4546
theme?: ThemeOptions
4647
toc?: TocPluginOptions
4748
externalLinks?: Record<string, string>
4849
}
4950

5051
export interface MarkdownParsedData {
51-
hoistedTags?: string[]
5252
links?: string[]
5353
}
5454

@@ -77,7 +77,6 @@ export const createMarkdownRenderer = async (
7777
.use(highlightLinePlugin)
7878
.use(preWrapperPlugin)
7979
.use(snippetPlugin, srcDir)
80-
.use(hoistPlugin)
8180
.use(containerPlugin)
8281
.use(imagePlugin)
8382
.use(
@@ -94,7 +93,9 @@ export const createMarkdownRenderer = async (
9493
if (!options.attrs?.disable) {
9594
md.use(attrsPlugin, options.attrs)
9695
}
96+
md.use(emojiPlugin)
9797

98+
// mdit-vue plugins
9899
md.use(anchorPlugin, {
99100
slugify,
100101
permalink: anchorPlugin.permalink.ariaHidden({}),
@@ -107,12 +108,14 @@ export const createMarkdownRenderer = async (
107108
slugify,
108109
...options.headers
109110
} as HeadersPluginOptions)
111+
.use(sfcPlugin, {
112+
...options.sfc
113+
} as SfcPluginOptions)
110114
.use(titlePlugin)
111115
.use(tocPlugin, {
112116
slugify,
113117
...options.toc
114118
} as TocPluginOptions)
115-
.use(emojiPlugin)
116119

117120
// apply user config
118121
if (options.config) {

src/node/markdown/plugins/hoist.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/node/markdownToVue.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export async function createMarkdownToVueRenderFn(
8484
}
8585
const html = md.render(src, env)
8686
const data = md.__data
87-
const { frontmatter = {}, headers = [], title = '' } = env
87+
const { frontmatter = {}, headers = [], sfcBlocks, title = '' } = env
8888

8989
// validate data.links
9090
const deadLinks: string[] = []
@@ -142,15 +142,20 @@ export async function createMarkdownToVueRenderFn(
142142
pageData.lastUpdated = await getGitTimestamp(file)
143143
}
144144

145-
const vueSrc =
146-
genPageDataCode(data.hoistedTags || [], pageData, replaceRegex).join(
147-
'\n'
148-
) +
149-
`\n<template><div>${replaceConstants(
145+
const vueSrc = [
146+
...injectPageDataCode(
147+
sfcBlocks?.scripts.map((item) => item.content) ?? [],
148+
pageData,
149+
replaceRegex
150+
),
151+
`<template><div>${replaceConstants(
150152
html,
151153
replaceRegex,
152154
vueTemplateBreaker
153-
)}</div></template>`
155+
)}</div></template>`,
156+
...(sfcBlocks?.styles.map((item) => item.content) ?? []),
157+
...(sfcBlocks?.customBlocks.map((item) => item.content) ?? [])
158+
].join('\n')
154159

155160
debug(`[render] ${file} in ${Date.now() - start}ms.`)
156161

@@ -203,7 +208,11 @@ function replaceConstants(str: string, replaceRegex: RegExp, breaker: string) {
203208
return str.replace(replaceRegex, (_) => `${_[0]}${breaker}${_.slice(1)}`)
204209
}
205210

206-
function genPageDataCode(tags: string[], data: PageData, replaceRegex: RegExp) {
211+
function injectPageDataCode(
212+
tags: string[],
213+
data: PageData,
214+
replaceRegex: RegExp
215+
) {
207216
const dataJson = JSON.stringify(data)
208217
const code = `\nexport const __pageData = JSON.parse(${JSON.stringify(
209218
replaceConstants(dataJson, replaceRegex, jsStringBreaker)

0 commit comments

Comments
 (0)