11// Mermaid diagram renderer for XOOPS Docs
22// Loaded as a static asset — no build step, no npm dependency.
3- // Finds every <pre><code class="language-mermaid"> block that Starlight emits
4- // and replaces it with a rendered SVG. Re-renders when the user switches
5- // between dark and light mode.
3+ // Starlight uses expressive-code, which renders mermaid blocks as:
4+ // <div class="expressive-code">
5+ // <figure><pre data-language="mermaid"><code>...</code></pre></figure>
6+ // </div>
7+ // We target that structure, extract the raw source via textContent,
8+ // replace the whole expressive-code container with the rendered SVG,
9+ // and re-render when the user toggles dark/light mode.
610
711import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs' ;
812
@@ -13,14 +17,15 @@ function currentTheme() {
1317}
1418
1519async function renderMermaid ( ) {
16- const codeBlocks = document . querySelectorAll ( 'pre code.language- mermaid' ) ;
20+ const codeBlocks = document . querySelectorAll ( 'pre[data-language=" mermaid"] code ' ) ;
1721 if ( ! codeBlocks . length ) return ;
1822
1923 mermaid . initialize ( { startOnLoad : false , theme : currentTheme ( ) } ) ;
2024
2125 for ( const code of codeBlocks ) {
22- const pre = code . closest ( 'pre' ) ;
23- const src = code . textContent ;
26+ const src = code . textContent . trim ( ) ;
27+ // Replace the whole expressive-code wrapper, falling back to the <pre>
28+ const container = code . closest ( '.expressive-code' ) || code . closest ( 'pre' ) ;
2429 const wrapper = document . createElement ( 'div' ) ;
2530 wrapper . dataset . mermaidSrc = src ;
2631 wrapper . className = 'mermaid-diagram not-content' ;
@@ -32,7 +37,7 @@ async function renderMermaid() {
3237 } catch {
3338 wrapper . textContent = src ;
3439 }
35- pre . replaceWith ( wrapper ) ;
40+ container . replaceWith ( wrapper ) ;
3641 }
3742}
3843
0 commit comments