// markdown 渲染 + 代码高亮。依赖 vendor 全局(window.marked / DOMPurify / hljs)。 // 三个库任一缺失 → 优雅降级回
escapeHtml
(plain text wrap)。 import { escapeHtml } from "./format.js"; if (window.marked && window.marked.setOptions) { window.marked.setOptions({ gfm: true, breaks: true, headerIds: false, mangle: false }); } export function renderMd(text) { const raw = String(text || ""); if (!window.marked || !window.marked.parse) { return `
${escapeHtml(raw)}
`; } let html = window.marked.parse(raw); if (window.DOMPurify) { html = window.DOMPurify.sanitize(html, { USE_PROFILES: { html: true } }); } return html; } export function highlightIn(container) { if (!window.hljs || !container) return; container.querySelectorAll("pre code").forEach((b) => { if (b.dataset.hl === "1") return; try { window.hljs.highlightElement(b); b.dataset.hl = "1"; } catch (e) {} }); }