40 lines
1.7 KiB
JavaScript
40 lines
1.7 KiB
JavaScript
(() => {
|
|
const mermaid = globalThis.mermaid;
|
|
const vscode = acquireVsCodeApi();
|
|
mermaid.initialize({ startOnLoad: false, securityLevel: 'loose', theme: document.body.classList.contains('vscode-dark') ? 'dark' : 'default', flowchart: { htmlLabels: false } });
|
|
|
|
// 渲染失败保留原始 Mermaid 并显示原因,不把空白图当成成功。
|
|
async function render() {
|
|
let sequence = 0;
|
|
for (const code of document.querySelectorAll('pre > code.language-mermaid')) {
|
|
try {
|
|
const { svg } = await mermaid.render(`dever-flow-${sequence++}`, code.textContent);
|
|
const container = document.createElement('div');
|
|
container.className = 'dever-flow';
|
|
container.innerHTML = svg;
|
|
code.parentElement.replaceWith(container);
|
|
} catch (error) {
|
|
const message = document.createElement('p');
|
|
message.className = 'dever-flow-error';
|
|
message.textContent = `流程图渲染失败:${error.message}`;
|
|
code.parentElement.before(message);
|
|
}
|
|
// Mermaid 的连续 Promise 会占满微任务队列;每张图后让页面处理加载、滚动和点击。
|
|
await new Promise(resolve => setTimeout(resolve, 0));
|
|
}
|
|
document.getElementById(document.body.dataset.anchor)?.scrollIntoView();
|
|
document.body.dataset.rendered = 'true';
|
|
}
|
|
|
|
document.addEventListener('click', event => {
|
|
const link = event.target.closest('a');
|
|
if (!link) return;
|
|
const href = link.getAttribute('href') || link.getAttribute('xlink:href');
|
|
if (!href) return;
|
|
event.preventDefault();
|
|
if (href.startsWith('#')) document.getElementById(decodeURIComponent(href.slice(1)))?.scrollIntoView();
|
|
else vscode.postMessage({ type: 'open', href });
|
|
});
|
|
render();
|
|
})();
|