28 lines
1.0 KiB
JavaScript
28 lines
1.0 KiB
JavaScript
// markdown 渲染 + 代码高亮。依赖 vendor 全局(window.marked / DOMPurify / hljs)。
|
|
// 三个库任一缺失 → 优雅降级回 <pre>escapeHtml</pre>(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 `<pre style="white-space:pre-wrap;word-break:break-word;font-family:inherit;margin:0;">${escapeHtml(raw)}</pre>`;
|
|
}
|
|
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) {}
|
|
});
|
|
}
|