Skip to content

Commit 3cf0f26

Browse files
committed
Deploy Logseq SPA @ b24d582cf55ed14259e9cd938a83f11826a99b60 jjohare/logseq@b24d582
1 parent 0f1c2ef commit 3cf0f26

2 files changed

Lines changed: 95 additions & 2 deletions

File tree

notes/index.html

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

notes/mermaid-init.js

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
(function() {
2+
var KROKI_URL = 'https://kroki.io/mermaid/svg';
3+
4+
function extractCodeMirrorText(codeWrapper) {
5+
var cmCode = codeWrapper.querySelector('.CodeMirror-code');
6+
if (cmCode) {
7+
var lines = cmCode.querySelectorAll('.CodeMirror-line');
8+
return Array.prototype.map.call(lines, function(line) {
9+
return line.textContent;
10+
}).join('\n');
11+
}
12+
var textarea = codeWrapper.querySelector('textarea');
13+
if (textarea) return textarea.value;
14+
var code = codeWrapper.querySelector('pre code, code');
15+
if (code) return code.textContent;
16+
return codeWrapper.textContent;
17+
}
18+
19+
function renderViaKroki(source, targetEl, hideEl) {
20+
if (!source || !source.trim()) return;
21+
var container = document.createElement('div');
22+
container.className = 'kroki-diagram';
23+
container.style.cssText = 'text-align:center;padding:8px;';
24+
container.innerHTML = '<span style="color:#888">Rendering diagram...</span>';
25+
targetEl.parentNode.insertBefore(container, targetEl);
26+
if (hideEl) hideEl.style.display = 'none';
27+
28+
fetch(KROKI_URL, {
29+
method: 'POST',
30+
headers: { 'Content-Type': 'text/plain' },
31+
body: source.trim()
32+
})
33+
.then(function(resp) {
34+
if (!resp.ok) throw new Error('kroki ' + resp.status);
35+
return resp.text();
36+
})
37+
.then(function(svg) {
38+
container.innerHTML = svg;
39+
var svgEl = container.querySelector('svg');
40+
if (svgEl) {
41+
svgEl.style.maxWidth = '100%';
42+
svgEl.style.height = 'auto';
43+
}
44+
})
45+
.catch(function(err) {
46+
console.warn('Kroki render error:', err);
47+
container.innerHTML = '<span style="color:#f44">Diagram render failed</span>';
48+
if (hideEl) hideEl.style.display = '';
49+
});
50+
}
51+
52+
function renderMermaidBlocks() {
53+
// Strategy 1: Logseq extensions__code with language label
54+
var langLabels = document.querySelectorAll('.extensions__code-lang');
55+
langLabels.forEach(function(label) {
56+
if (label.textContent.trim().toLowerCase() !== 'mermaid') return;
57+
var wrapper = label.closest('.extensions__code');
58+
if (!wrapper || wrapper.dataset.krokiProcessed) return;
59+
wrapper.dataset.krokiProcessed = 'true';
60+
var source = extractCodeMirrorText(wrapper);
61+
renderViaKroki(source, wrapper, wrapper);
62+
});
63+
64+
// Strategy 2: pre > code.language-mermaid
65+
var codeEls = document.querySelectorAll(
66+
'code.language-mermaid, code[data-lang="mermaid"]'
67+
);
68+
codeEls.forEach(function(codeEl) {
69+
var pre = codeEl.closest('pre');
70+
if (!pre || pre.dataset.krokiProcessed) return;
71+
pre.dataset.krokiProcessed = 'true';
72+
renderViaKroki(codeEl.textContent, pre, pre);
73+
});
74+
}
75+
76+
// Initial render after DOM settles
77+
setTimeout(renderMermaidBlocks, 1000);
78+
79+
// Watch for dynamic content changes (SPA navigation)
80+
var observer = new MutationObserver(function(mutations) {
81+
var hasNewNodes = mutations.some(function(m) {
82+
return m.addedNodes.length > 0;
83+
});
84+
if (hasNewNodes) {
85+
clearTimeout(window._krokiDebounce);
86+
window._krokiDebounce = setTimeout(renderMermaidBlocks, 500);
87+
}
88+
});
89+
observer.observe(document.body, {
90+
childList: true,
91+
subtree: true
92+
});
93+
})();

0 commit comments

Comments
 (0)