mirror of
https://github.com/pengzhanbo/vuepress-theme-plume.git
synced 2026-04-23 10:58:13 +08:00
30 lines
978 B
TypeScript
30 lines
978 B
TypeScript
import type { RenderRule } from 'markdown-it/lib/renderer.mjs'
|
|
import type { Markdown } from 'vuepress/markdown'
|
|
import container from 'markdown-it-container'
|
|
|
|
type RenderRuleParams = Parameters<RenderRule> extends [...infer Args, infer _] ? Args : never
|
|
|
|
export interface ContainerOptions {
|
|
before?: (info: string, ...args: RenderRuleParams) => string
|
|
after?: (info: string, ...args: RenderRuleParams) => string
|
|
}
|
|
|
|
export function createContainerPlugin(
|
|
md: Markdown,
|
|
type: string,
|
|
{ before, after }: ContainerOptions = {},
|
|
) {
|
|
const render: RenderRule = (tokens, index, options, env): string => {
|
|
const token = tokens[index]
|
|
const info = token.info.trim().slice(type.length).trim() || ''
|
|
if (token.nesting === 1) {
|
|
return before?.(info, tokens, index, options, env) || `<div class="custom-container ${type}">`
|
|
}
|
|
else {
|
|
return after?.(info, tokens, index, options, env) || '</div>'
|
|
}
|
|
}
|
|
|
|
md.use(container, type, { render })
|
|
}
|