Skip to content

Commit a305737

Browse files
committed
fix: Improve Mermaid diagram rendering on GitHub Pages
- Added better error handling and logging - Added delay to ensure Jekyll/Kramdown finishes processing - Improved code block detection (handles various class formats) - Added fallback detection for mermaid syntax - Better error messages for debugging
1 parent 189e7fd commit a305737

2 files changed

Lines changed: 35 additions & 7 deletions

File tree

docs_site/_config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ kramdown:
2323
syntax_highlighter_opts:
2424
disable: false
2525
input: GFM
26+
hard_wrap: false
27+
auto_ids: true
28+
footnote_nr: 1
2629

2730
# Navigation
2831
navigation:

docs_site/_layouts/default.html

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -771,19 +771,22 @@
771771

772772
// Function to process Mermaid diagrams
773773
function processMermaidDiagrams() {
774+
console.log('Processing Mermaid diagrams...');
775+
774776
// Find all code blocks with mermaid language
775-
const mermaidBlocks = document.querySelectorAll('code.language-mermaid, pre code.language-mermaid');
777+
const mermaidBlocks = document.querySelectorAll('code.language-mermaid, pre code.language-mermaid, code[class*="mermaid"]');
778+
779+
console.log('Found', mermaidBlocks.length, 'Mermaid code blocks');
776780

777781
if (mermaidBlocks.length > 0) {
778-
console.log('Found', mermaidBlocks.length, 'Mermaid diagram blocks');
779-
780782
// Process each block
781783
mermaidBlocks.forEach((block, index) => {
782784
// Get the parent pre element if it exists
783785
const preElement = block.parentElement;
784786
if (preElement && preElement.tagName === 'PRE') {
785787
// Get the mermaid code
786788
const mermaidCode = block.textContent || block.innerText;
789+
console.log('Processing Mermaid block', index + 1, ':', mermaidCode.substring(0, 50) + '...');
787790

788791
// Create a div for Mermaid to render into
789792
const mermaidDiv = document.createElement('div');
@@ -796,18 +799,26 @@
796799
});
797800

798801
// Run Mermaid to render all diagrams
802+
console.log('Running Mermaid render...');
799803
mermaid.run().then(() => {
804+
console.log('Mermaid rendering complete');
800805
// After rendering, wrap diagrams with fullscreen buttons
801806
createFullscreenOverlay();
802807
wrapDiagramsWithButtons();
808+
}).catch((err) => {
809+
console.error('Mermaid rendering error:', err);
803810
});
804811
} else {
805812
// Fallback: look for pre > code blocks and check if they contain mermaid syntax
813+
console.log('No mermaid language blocks found, checking all code blocks...');
806814
const allCodeBlocks = document.querySelectorAll('pre code');
815+
let foundMermaid = false;
816+
807817
allCodeBlocks.forEach((codeBlock) => {
808818
const code = codeBlock.textContent || codeBlock.innerText;
809819
// Check if it looks like mermaid code (starts with graph, sequenceDiagram, etc.)
810820
if (code.trim().match(/^(graph|sequenceDiagram|flowchart|classDiagram|stateDiagram|erDiagram|gantt|pie|gitgraph|journey)/)) {
821+
foundMermaid = true;
811822
const preElement = codeBlock.parentElement;
812823
if (preElement && preElement.tagName === 'PRE') {
813824
const mermaidDiv = document.createElement('div');
@@ -819,22 +830,36 @@
819830
});
820831

821832
// Run Mermaid after processing
822-
if (document.querySelectorAll('.mermaid').length > 0) {
833+
if (foundMermaid && document.querySelectorAll('.mermaid').length > 0) {
834+
console.log('Running Mermaid render (fallback)...');
823835
mermaid.run().then(() => {
836+
console.log('Mermaid rendering complete (fallback)');
824837
// After rendering, wrap diagrams with fullscreen buttons
825838
createFullscreenOverlay();
826839
wrapDiagramsWithButtons();
840+
}).catch((err) => {
841+
console.error('Mermaid rendering error (fallback):', err);
827842
});
843+
} else {
844+
console.log('No Mermaid diagrams found to render');
828845
}
829846
}
830847
}
831848

849+
// Wait for everything to be ready
850+
function initMermaid() {
851+
// Wait a bit for Jekyll/Kramdown to finish processing
852+
setTimeout(() => {
853+
processMermaidDiagrams();
854+
}, 100);
855+
}
856+
832857
// Process diagrams when DOM is ready
833858
if (document.readyState === 'loading') {
834-
document.addEventListener('DOMContentLoaded', processMermaidDiagrams);
859+
document.addEventListener('DOMContentLoaded', initMermaid);
835860
} else {
836-
// DOM already loaded, process immediately
837-
processMermaidDiagrams();
861+
// DOM already loaded, process after a short delay
862+
initMermaid();
838863
}
839864
</script>
840865
</body>

0 commit comments

Comments
 (0)