{"version":3,"file":"md-render-service.mjs","sources":["../../../../../../../packages/components/editor-md/src/composables/md-render-service.ts"],"sourcesContent":["import hljs from 'highlight.js'\nimport MarkdownIt from 'markdown-it'\nimport { mermaidRender, refreshMermaid } from '../plugins/mermaid'\nimport tocAndAnchor from '../plugins/toc'\nimport {\n  filterXSS,\n  getDefaultCSSWhiteList,\n  getDefaultWhiteList,\n} from './xss-inner'\nimport type { IWhiteList } from 'xss'\nimport type {\n  ICustomRenderRule,\n  ICustomXssRule,\n  MdPlugin,\n} from '../editor-md-types'\n\nexport class MDRenderService {\n  private xssWhiteList: any = getDefaultWhiteList()\n  private cssWhiteList: any = getDefaultCSSWhiteList()\n  private mdt = new MarkdownIt({\n    linkify: true,\n    html: true,\n    highlight(str, lang) {\n      if (lang && hljs.getLanguage(lang)) {\n        try {\n          return hljs.highlight(str, { language: lang }).value\n        } catch {}\n      }\n      return ''\n    },\n  }) as any\n  private baseUrl = ''\n  private breaks = true\n  private renderParse: any | undefined\n\n  constructor() {\n    this.setDefaultXss()\n    this.mdt\n      .use(tocAndAnchor, {\n        linkify: false,\n        anchorLink: false,\n      })\n      .use(mermaidRender, { id: 'devui-mermaid' })\n  }\n\n  private setDefaultXss() {\n    this.xssWhiteList['input'] = ['type', 'checked', 'disabled', 'class']\n    this.xssWhiteList['label'] = ['for']\n    this.xssWhiteList['ul'] = ['class']\n    this.xssWhiteList['div'] = ['class']\n    this.xssWhiteList['a'] = ['href', 'class', 'target', 'name']\n    this.xssWhiteList['ol'] = ['start']\n\n    this.xssWhiteList['p'] = ['class']\n    this.xssWhiteList['span'] = ['style', 'class', 'title', 'id']\n    this.xssWhiteList['svg'] = [\n      'style',\n      'class',\n      'width',\n      'height',\n      'viewbox',\n      'preserveaspectratio',\n      'id',\n      'fill',\n      'stroke',\n    ]\n    this.xssWhiteList['path'] = ['style', 'class', 'd', 'id', 'fill', 'stroke']\n    this.xssWhiteList['th'] = ['style']\n    this.xssWhiteList['td'] = ['style']\n  }\n\n  setBaseUrl(url: string) {\n    this.baseUrl = url\n  }\n\n  setBreaks(breaks: boolean) {\n    this.breaks = breaks\n  }\n\n  setRenderParse(func: any) {\n    this.renderParse = func\n  }\n\n  getXssWhiteList() {\n    return this.xssWhiteList\n  }\n\n  setXssWhiteList(list: IWhiteList) {\n    this.xssWhiteList = list\n  }\n\n  setCustomXssRules(rules: ICustomXssRule[]) {\n    if (rules) {\n      rules.forEach((rule) => {\n        if (rule['value'] === null) {\n          delete this.xssWhiteList[rule['key']]\n        } else {\n          this.xssWhiteList[rule['key']] = rule['value']\n        }\n      })\n    }\n  }\n\n  setCustomRendererRules(rules: ICustomRenderRule[]) {\n    if (rules) {\n      rules.forEach((rule) => {\n        this.mdt.renderer.rules[rule['key']] = rule['value']\n      })\n    }\n  }\n\n  setOptions(options = {}) {\n    this.mdt.set(options)\n  }\n\n  setPlugins(plugins: Array<MdPlugin>) {\n    plugins.forEach((item) => {\n      const { plugin, opts } = item\n      this.mdt.use(plugin, opts)\n    })\n  }\n\n  private onIgnoreTagAttr(\n    tag: string,\n    name: string,\n    value: string,\n    isWhiteAttr: boolean\n  ) {\n    if (\n      !isWhiteAttr &&\n      (name === 'id' || (tag === 'span' && name === 'style'))\n    ) {\n      return `${name}=${value}`\n    }\n  }\n\n  private replaceInternalUrl(html: string) {\n    return html.replace(\n      /(<a[^>]+?href=[\"']?)#([^\"']+)([\"']?[^>]*)>/gi,\n      `$1${this.baseUrl}#$2$3>`\n    )\n  }\n\n  private handleHeaderId(html: string) {\n    const headerRecord = new Map<string, number>()\n    const reg = /<(h[1-6]) id=\"(.*?)\">/gi\n    return html.replace(reg, (match, p1, p2): string => {\n      if (headerRecord.has(p2)) {\n        headerRecord.set(p2, headerRecord.get(p2)! + 1)\n        return `<${p1} id=\"${p2}-${headerRecord.get(p2)}\">`\n      } else {\n        headerRecord.set(p2, 0)\n        return `<${p1} id=\"${p2}\">`\n      }\n    })\n  }\n\n  generateHTML(text: string) {\n    this.mdt.set({\n      breaks: this.breaks,\n    })\n    let html = this.mdt.render(text)\n    html = this.handleHeaderId(html)\n\n    if (this.renderParse) {\n      html = this.renderParse(html)\n    }\n\n    html = filterXSS(html, {\n      whiteList: this.xssWhiteList,\n      onIgnoreTagAttr: this.onIgnoreTagAttr,\n      css: {\n        whiteList: Object.assign({}, this.cssWhiteList, {\n          top: true,\n          left: true,\n          bottom: true,\n          right: true,\n        }),\n      },\n    })\n\n    setTimeout(() => {\n      refreshMermaid()\n    }, 0)\n\n    return this.replaceInternalUrl(html)\n  }\n\n  public setRules(mdRules: Record<string, any>): void {\n    if (mdRules) {\n      Object.keys(mdRules).forEach((rule) => {\n        this.mdt[rule].set(mdRules[rule])\n      })\n    }\n  }\n}\n"],"names":[],"mappings":"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"}