Skip to content

Commit 2218c97

Browse files
committed
Fix Mermaid diagram rendering and add dark mode support
- Use correct mermaid.run({ nodes }) API for Mermaid v11 - Handle both plain and Rouge-wrapped code blocks - Re-render diagrams on dark/light theme toggle via MutationObserver - Add transparent background for mermaid-wrapper in dark mode
1 parent 783428e commit 2218c97

File tree

2 files changed

+73
-11
lines changed

2 files changed

+73
-11
lines changed

_layouts/default.html

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,18 @@
338338
</script>
339339
<script>
340340
(function () {
341-
function initMermaid() {
341+
var mermaidId = 0;
342+
343+
function renderMermaid() {
342344
if (typeof window.mermaid === "undefined") return;
343345

344346
var container = document.querySelector("#main .container");
345347
if (!container) return;
346348

347-
var blocks = container.querySelectorAll("pre code.language-mermaid");
349+
// Match both plain code blocks and Rouge-highlighted blocks
350+
var blocks = container.querySelectorAll(
351+
'pre > code.language-mermaid, .highlight pre code.language-mermaid'
352+
);
348353
if (!blocks.length) return;
349354

350355
var isDark = document.documentElement.getAttribute("data-theme") === "dark";
@@ -354,24 +359,76 @@
354359
securityLevel: "loose"
355360
});
356361

362+
var wrappers = [];
357363
blocks.forEach(function (code) {
358-
var pre = code.closest("pre");
359-
if (!pre) return;
360-
var parent = pre.parentNode;
364+
// Walk up to the outermost wrapper (.highlight div or bare <pre>)
365+
var wrapper = code.closest(".highlight") || code.closest("pre");
366+
if (!wrapper) return;
367+
var parent = wrapper.parentNode;
361368
var div = document.createElement("div");
362369
div.className = "mermaid-wrapper";
363-
div.setAttribute("data-mermaid", "true");
364-
div.textContent = code.textContent.trim();
365-
parent.replaceChild(div, pre);
370+
div.id = "mermaid-" + (++mermaidId);
371+
// textContent automatically decodes HTML entities like &gt;
372+
var source = code.textContent.trim();
373+
div.setAttribute("data-mermaid-source", source);
374+
div.textContent = source;
375+
parent.replaceChild(div, wrapper);
376+
wrappers.push(div);
377+
});
378+
379+
if (wrappers.length) {
380+
window.mermaid.run({ nodes: wrappers, suppressErrors: true });
381+
}
382+
}
383+
384+
// Re-render on dark mode toggle so diagrams pick up the new theme
385+
function reRenderMermaid() {
386+
if (typeof window.mermaid === "undefined") return;
387+
var existing = document.querySelectorAll(".mermaid-wrapper[data-processed]");
388+
if (!existing.length) {
389+
existing = document.querySelectorAll(".mermaid-wrapper");
390+
}
391+
if (!existing.length) return;
392+
393+
var isDark = document.documentElement.getAttribute("data-theme") === "dark";
394+
window.mermaid.initialize({
395+
startOnLoad: false,
396+
theme: isDark ? "dark" : "default",
397+
securityLevel: "loose"
398+
});
399+
400+
// Store original source and reset each wrapper
401+
existing.forEach(function (el) {
402+
if (!el.getAttribute("data-mermaid-source")) {
403+
el.setAttribute("data-mermaid-source", el.textContent.trim());
404+
}
405+
var source = el.getAttribute("data-mermaid-source");
406+
el.removeAttribute("data-processed");
407+
el.innerHTML = "";
408+
el.textContent = source;
409+
el.id = "mermaid-" + (++mermaidId);
366410
});
367411

368-
window.mermaid.run({ querySelector: ".mermaid-wrapper", suppressErrors: true });
412+
window.mermaid.run({
413+
nodes: Array.prototype.slice.call(existing),
414+
suppressErrors: true
415+
});
369416
}
370417

418+
// Observe theme changes for live re-render
419+
var observer = new MutationObserver(function (mutations) {
420+
mutations.forEach(function (m) {
421+
if (m.attributeName === "data-theme") {
422+
reRenderMermaid();
423+
}
424+
});
425+
});
426+
observer.observe(document.documentElement, { attributes: true });
427+
371428
if (document.readyState === "complete") {
372-
initMermaid();
429+
renderMermaid();
373430
} else {
374-
window.addEventListener("load", initMermaid);
431+
window.addEventListener("load", renderMermaid);
375432
}
376433
})();
377434
</script>

_sass/_dark-mode.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,11 @@
384384
}
385385
}
386386

387+
// Mermaid diagrams dark mode
388+
.mermaid-wrapper {
389+
background: transparent;
390+
}
391+
387392
// Status indicator dark mode
388393
.status-indicator {
389394
background: #20c997;

0 commit comments

Comments
 (0)