import path from 'path' import fs from 'fs' import MarkdownIt from 'markdown-it' import mdContainer from 'markdown-it-container' import { docRoot } from '@element-plus/build-utils' import externalLinkIcon from '../plugins/external-link-icon' import tableWrapper from '../plugins/table-wrapper' import tooltip from '../plugins/tooltip' import { ApiTableContainer } from '../plugins/api-table' import { highlight } from '../utils/highlight' import type Token from 'markdown-it/lib/token' import type Renderer from 'markdown-it/lib/renderer' const localMd = MarkdownIt() interface ContainerOpts { marker?: string | undefined validate?(params: string): boolean render?( tokens: Token[], index: number, options: any, env: any, self: Renderer ): string } export const mdPlugin = (md: MarkdownIt) => { md.use(externalLinkIcon) md.use(tableWrapper) md.use(tooltip) md.use(mdContainer, 'demo', { validate(params) { return !!params.trim().match(/^demo\s*(.*)$/) }, render(tokens, idx) { const m = tokens[idx].info.trim().match(/^demo\s*(.*)$/) if (tokens[idx].nesting === 1 /* means the tag is opening */) { const description = m && m.length > 1 ? m[1] : '' const sourceFileToken = tokens[idx + 2] let source = '' const sourceFile = sourceFileToken.children?.[0].content ?? '' if (sourceFileToken.type === 'inline') { source = fs.readFileSync( path.resolve(docRoot, 'examples', `${sourceFile}.vue`), 'utf-8' ) } if (!source) throw new Error(`Incorrect source file: ${sourceFile}`) return `` } else { return '' } }, } as ContainerOpts) md.use(ApiTableContainer) }