import MarkdownIt from 'markdown-it'; import hljs from 'highlight.js'; import mk from 'markdown-it-katex'; // 配置 markdown-it const md = new MarkdownIt({ html: true, linkify: true, typographer: true, highlight: function (str, lang) { if (lang && hljs.getLanguage(lang)) { try { return '
' +
hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
'';
} catch (__) {}
}
return '' + md.utils.escapeHtml(str) + '';
}
});
// 添加 LaTeX 数学公式支持
md.use(mk);
// 导出渲染函数
export function renderMarkdown(markdown, container) {
if (!container) {
console.error('Markdown container not found');
return;
}
if (!markdown) {
container.innerHTML = 'No content
'; return; } const html = md.render(markdown); container.innerHTML = html; // 添加样式类 addMarkdownStyles(container); } function addMarkdownStyles(container) { // 为 markdown 内容添加样式类 const elements = container.querySelectorAll('h1, h2, h3, h4, h5, h6, p, code, pre, blockquote, ul, ol, li, table, thead, tbody, tr, th, td, a, img'); elements.forEach(el => { // 标题样式 if (el.tagName.match(/^H[1-6]$/)) { el.classList.add('font-bold', 'mt-6', 'mb-4'); if (el.tagName === 'H1') el.classList.add('text-3xl'); if (el.tagName === 'H2') el.classList.add('text-2xl'); if (el.tagName === 'H3') el.classList.add('text-xl'); if (el.tagName === 'H4') el.classList.add('text-lg'); } // 段落样式 if (el.tagName === 'P') { el.classList.add('mb-4', 'leading-relaxed'); } // 链接样式 if (el.tagName === 'A') { el.classList.add('text-blue-600', 'hover:text-blue-800', 'underline'); } // 代码样式 if (el.tagName === 'CODE') { el.classList.add('bg-gray-100', 'px-2', 'py-1', 'rounded', 'text-sm', 'font-mono'); } // 预格式化代码样式 if (el.tagName === 'PRE') { el.classList.add('bg-gray-900', 'p-4', 'rounded-lg', 'overflow-x-auto', 'mb-4'); } // 块引用样式 if (el.tagName === 'BLOCKQUOTE') { el.classList.add('border-l-4', 'border-blue-500', 'pl-4', 'italic', 'text-gray-600', 'my-4'); } // 表格样式 if (el.tagName === 'TABLE') { el.classList.add('w-full', 'border-collapse', 'mb-4'); } if (el.tagName === 'TH' || el.tagName === 'TD') { el.classList.add('border', 'border-gray-300', 'px-4', 'py-2', 'text-left'); } if (el.tagName === 'TH') { el.classList.add('bg-gray-100', 'font-semibold'); } // 列表样式 if (el.tagName === 'UL' || el.tagName === 'OL') { el.classList.add('mb-4', 'pl-6'); } if (el.tagName === 'LI') { el.classList.add('mb-2'); } // 图片样式 if (el.tagName === 'IMG') { el.classList.add('max-w-full', 'h-auto', 'rounded-lg', 'shadow-md', 'my-4'); } }); } // 导出到全局 if (typeof window !== 'undefined') { window.renderMarkdown = renderMarkdown; }