Skip to content

Commit cdb2d2c

Browse files
committed
feat: support wrapperClasses and wrapperComponent as function
1 parent 5a4de80 commit cdb2d2c

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

src/markdown.ts

+31-5
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,13 @@ export function createMarkdown(options: ResolvedOptions) {
7272
options.markdownItSetup(markdown)
7373

7474
return (id: string, raw: string): TransformResult => {
75-
const { wrapperClasses, wrapperComponent, transforms, headEnabled, frontmatterPreprocess } = options
75+
const {
76+
wrapperClasses,
77+
wrapperComponent,
78+
transforms,
79+
headEnabled,
80+
frontmatterPreprocess,
81+
} = options
7682

7783
raw = raw.trimStart()
7884

@@ -83,12 +89,32 @@ export function createMarkdown(options: ResolvedOptions) {
8389
let html = markdown.render(raw, env)
8490
const { excerpt = '', frontmatter: data = null } = env
8591

86-
if (wrapperClasses)
87-
html = `<div class="${wrapperClasses}">${html}</div>`
92+
const wrapperClassesResolved = toArray(
93+
typeof wrapperClasses === 'function'
94+
? wrapperClasses(id, raw)
95+
: wrapperClasses,
96+
)
97+
.filter(Boolean)
98+
.join(' ')
99+
100+
if (wrapperClassesResolved)
101+
html = `<div class="${wrapperClassesResolved}">${html}</div>`
88102
else
89103
html = `<div>${html}</div>`
90-
if (wrapperComponent)
91-
html = `<${wrapperComponent}${options.frontmatter ? ' :frontmatter="frontmatter"' : ''}${options.excerpt ? ' :excerpt="excerpt"' : ''}>${html}</${wrapperComponent}>`
104+
105+
const wrapperComponentName = typeof wrapperComponent === 'function'
106+
? wrapperComponent(id, raw)
107+
: wrapperComponent
108+
109+
if (wrapperComponentName) {
110+
const attrs = [
111+
options.frontmatter && ':frontmatter="frontmatter"',
112+
options.excerpt && ':excerpt="excerpt"',
113+
wrapperClassesResolved && `class="${wrapperClassesResolved}"`,
114+
].filter(Boolean).join(' ')
115+
html = `<${wrapperComponentName} ${attrs}>${html}</${wrapperComponent}>`
116+
}
117+
92118
if (transforms.after)
93119
html = transforms.after(html, id)
94120

src/options.ts

-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { toArray } from '@antfu/utils'
21
import type { Options, ResolvedOptions } from './types'
32
import { getVueVersion, isUnheadVueInstalled } from './utils'
43

@@ -39,9 +38,5 @@ export function resolveOptions(userOptions: Options): ResolvedOptions {
3938
if (options.headEnabled === true)
4039
options.headEnabled = isUnheadVueInstalled() ? 'unhead' : 'vueuse'
4140

42-
options.wrapperClasses = toArray(options.wrapperClasses)
43-
.filter((i?: string) => i)
44-
.join(' ')
45-
4641
return options as ResolvedOptions
4742
}

src/types.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,14 @@ export interface Options {
165165
*
166166
* @default 'markdown-body'
167167
*/
168-
wrapperClasses?: string | string[]
168+
wrapperClasses?: string | string[] | undefined | null | ((id: string, code: string) => string | string[] | undefined | null)
169169

170170
/**
171171
* Component name to wrapper with
172172
*
173173
* @default undefined
174174
*/
175-
wrapperComponent?: string | undefined | null
175+
wrapperComponent?: string | undefined | null | ((id: string, code: string) => string | undefined | null)
176176

177177
/**
178178
* Custom tranformations apply before and after the markdown transformation
@@ -188,7 +188,6 @@ export interface Options {
188188

189189
export interface ResolvedOptions extends Required<Options> {
190190
headEnabled: 'unhead' | 'vueuse' | false
191-
wrapperClasses: string
192191
}
193192

194193
export interface MarkdownEnv extends MarkdownItEnv {

0 commit comments

Comments
 (0)