api-table.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import markdown from 'markdown-it'
  2. import type MarkdownIt from 'markdown-it'
  3. const ApiMd = new markdown()
  4. export const ApiTableContainer = (md: MarkdownIt) => {
  5. const fence = md.renderer.rules.fence!
  6. ApiMd.renderer.rules = md.renderer.rules
  7. md.renderer.rules.fence = (...args) => {
  8. const [tokens, idx, ...rest] = args
  9. const [options, env] = rest
  10. const token = tokens[idx]
  11. if (token.info === 'api') {
  12. const newTokens = md.parse(token.content, env)
  13. let result = ''
  14. const { rules } = md.renderer
  15. newTokens.forEach((newToken, idx) => {
  16. const { type } = newToken
  17. if (type === 'inline') {
  18. result += md.renderer.renderInline(newToken.children!, options, env)
  19. } else if (typeof rules[type] !== 'undefined') {
  20. result += rules[newToken.type]!(
  21. newTokens,
  22. idx,
  23. options,
  24. env,
  25. md.renderer
  26. )
  27. } else {
  28. result += md.renderer.renderToken(newTokens, idx, options)
  29. }
  30. })
  31. return result
  32. }
  33. return fence.call(md, ...args)
  34. }
  35. }