mirror of
https://github.com/pengzhanbo/vuepress-theme-plume.git
synced 2026-05-01 12:38:12 +08:00
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
// markdown-it plugin for generating line numbers.
|
|
// v-pre block logic is in `../highlight.ts`
|
|
import type { Markdown } from 'vuepress/markdown'
|
|
import { resolveAttr, resolveLanguage } from '../utils/index.js'
|
|
import type { PreWrapperOptions } from '../types.js'
|
|
|
|
export function preWrapperPlugin(
|
|
md: Markdown,
|
|
{ preWrapper = true }: PreWrapperOptions = {},
|
|
): void {
|
|
const rawFence = md.renderer.rules.fence!
|
|
|
|
md.renderer.rules.fence = (...args) => {
|
|
const [tokens, idx, options] = args
|
|
const token = tokens[idx]
|
|
|
|
// get token info
|
|
const info = token.info ? md.utils.unescapeAll(token.info).trim() : ''
|
|
|
|
const lang = resolveLanguage(info)
|
|
const title = resolveAttr(info, 'title') || lang
|
|
const classes: string[] = [`${options.langPrefix}${lang}`]
|
|
|
|
let result = rawFence(...args)
|
|
|
|
if (!preWrapper) {
|
|
// remove `<code>` attributes
|
|
result = result.replace(/<code[\s\S]*?>/, '<code>')
|
|
result = `<pre class="${classes.join(' ')}"${result.slice('<pre'.length)}`
|
|
return result
|
|
}
|
|
const attrs: string[] = [
|
|
`data-ext="${lang}"`,
|
|
`data-title="${title}"`,
|
|
]
|
|
|
|
return `<div class="${classes.join(' ')}" ${attrs.join(' ')}>${result}</div>`
|
|
}
|
|
}
|