struct-data.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import MarkdownIt from 'markdown-it'
  2. import type { RenderRule } from 'markdown-it/lib/renderer.mjs'
  3. import type Token from 'markdown-it/lib/token.mjs'
  4. import { defineMarkdownPlugin } from '../type/markdown.ts'
  5. import { h } from 'vue'
  6. import VueStructData from '/@/components/markdown/plugins/impl/VueStructData.vue'
  7. // 渲染echarts代码块
  8. const renderStructData: RenderRule = (tokens: Token[], idx: number) => {
  9. const token = tokens[idx]
  10. const content = token.content.trim()
  11. if (!content) {
  12. return '<div style="padding: 16px;background-color: #fff5f5;border: 1px solid #fed7d7;border-radius: 6px;color: #c53030;margin: 16px 0;">ECharts配置不能为空</div>'
  13. }
  14. // 生成完整HTML
  15. return `<struct-data style="width: 100%;height: 350px;margin: 16px 0; border-radius: 6px" data="${encodeURIComponent(
  16. content
  17. )}"></struct-data>`
  18. }
  19. const StructDataPlugin = defineMarkdownPlugin({
  20. tagName: 'struct-data',
  21. mdItPlugin: function (md: MarkdownIt) {
  22. // 保存原始的fence渲染器
  23. const defaultRender =
  24. md.renderer.rules.fence ??
  25. function (tokens, idx, options, _env, renderer) {
  26. return renderer.renderToken(tokens, idx, options)
  27. }
  28. // if (customElements.get('struct-data') === undefined) {
  29. // customElements.define('struct-data', EChartsElement, { extends: 'div' })
  30. // }
  31. // 重写fence渲染器
  32. md.renderer.rules.fence = function (tokens, idx, options, env, renderer) {
  33. const token = tokens[idx]
  34. const info = token.info ? token.info.trim() : ''
  35. // 检查是否是echarts代码块
  36. if (info === 'structdata') {
  37. return renderStructData(tokens, idx, options, env, renderer)
  38. }
  39. // 其他代码块使用默认渲染器
  40. return defaultRender(tokens, idx, options, env, renderer)
  41. }
  42. },
  43. renderer: (node: { attribs: Record<string, string> }) => {
  44. return h(VueStructData, {
  45. data: node.attribs.data,
  46. })
  47. },
  48. })
  49. export default StructDataPlugin