plugins.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import path from 'path'
  2. import fs from 'fs'
  3. import MarkdownIt from 'markdown-it'
  4. import mdContainer from 'markdown-it-container'
  5. import { docRoot } from '@element-plus/build-utils'
  6. import externalLinkIcon from '../plugins/external-link-icon'
  7. import tableWrapper from '../plugins/table-wrapper'
  8. import tooltip from '../plugins/tooltip'
  9. import tag from '../plugins/tag'
  10. import { ApiTableContainer } from '../plugins/api-table'
  11. import { highlight } from '../utils/highlight'
  12. import type Token from 'markdown-it/lib/token'
  13. import type Renderer from 'markdown-it/lib/renderer'
  14. const localMd = MarkdownIt().use(tag)
  15. interface ContainerOpts {
  16. marker?: string | undefined
  17. validate?(params: string): boolean
  18. render?(
  19. tokens: Token[],
  20. index: number,
  21. options: any,
  22. env: any,
  23. self: Renderer
  24. ): string
  25. }
  26. export const mdPlugin = (md: MarkdownIt) => {
  27. md.use(externalLinkIcon)
  28. md.use(tableWrapper)
  29. md.use(tooltip)
  30. md.use(tag)
  31. md.use(mdContainer, 'demo', {
  32. validate(params) {
  33. return !!params.trim().match(/^demo\s*(.*)$/)
  34. },
  35. render(tokens, idx) {
  36. const m = tokens[idx].info.trim().match(/^demo\s*(.*)$/)
  37. if (tokens[idx].nesting === 1 /* means the tag is opening */) {
  38. const description = m && m.length > 1 ? m[1] : ''
  39. const sourceFileToken = tokens[idx + 2]
  40. let source = ''
  41. const sourceFile = sourceFileToken.children?.[0].content ?? ''
  42. if (sourceFileToken.type === 'inline') {
  43. source = fs.readFileSync(
  44. path.resolve(docRoot, 'examples', `${sourceFile}.vue`),
  45. 'utf-8'
  46. )
  47. }
  48. if (!source) throw new Error(`Incorrect source file: ${sourceFile}`)
  49. return `<Demo :demos="demos" source="${encodeURIComponent(
  50. highlight(source, 'vue')
  51. )}" path="${sourceFile}" raw-source="${encodeURIComponent(
  52. source
  53. )}" description="${encodeURIComponent(localMd.render(description))}">`
  54. } else {
  55. return '</Demo>'
  56. }
  57. },
  58. } as ContainerOpts)
  59. md.use(ApiTableContainer)
  60. }