import MarkdownIt from 'markdown-it' import hljs from 'highlight.js' import DOMPurify from 'isomorphic-dompurify' import { stripFrontMatter } from './markdown-front-matter' const escapeHtml = (value: string): string => value .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') .replaceAll("'", ''') const toSafeLanguageClass = (lang: string): string => { const normalized = lang.trim().toLowerCase().replaceAll(/[^a-z0-9_-]/g, '') return normalized || 'text' } const getHighlightedCode = (source: string, lang: string): string => { const normalizedLang = lang.trim().toLowerCase() if (normalizedLang && hljs.getLanguage(normalizedLang)) { return hljs.highlight(source, { language: normalizedLang, ignoreIllegals: true }).value } if (normalizedLang) { return hljs.highlightAuto(source).value } return escapeHtml(source) } const md = new MarkdownIt({ html: false, linkify: true, typographer: false, breaks: true, // 开启代码块语言识别 highlight: function (str: string, lang: string) { // 处理语言标签(如果没有指定语言,默认 text) const language = toSafeLanguageClass(lang || 'text') const highlightedCode = getHighlightedCode(str, lang || '') // 生成带语言标识 + 复制按钮的代码块外壳 return ( `
${highlightedCode}