forked from markmap/mkdocs_markmap
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmkdocs-markmap.js
More file actions
79 lines (71 loc) · 2.46 KB
/
mkdocs-markmap.js
File metadata and controls
79 lines (71 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
(function initializeMarkmap() {
const transformer = new markmap.Transformer();
const preloadScripts = transformer.plugins
.flatMap((plugin) => plugin.config?.preloadScripts || [])
.map((item) => transformer.resolveJS(item));
const assets = transformer.getAssets();
const loading = Promise.all([
assets.styles && markmap.loadCSS(assets.styles),
markmap.loadJS([...preloadScripts, ...assets.scripts]),
]);
function parseData(content) {
const { root, frontmatter } = transformer.transform(content);
let options = markmap.deriveOptions(frontmatter?.markmap);
options = Object.assign(
{
fitRatio: 0.85,
},
options
);
return { root, options };
}
function resetMarkmap(m, el) {
if (!m.state.rect) return;
const { x1, y1, x2, y2 } = m.state.rect;
const height = (el.offsetWidth / (x2 - x1)) * (y2 - y1);
el.style.height = height + "px";
m.fit();
}
function decodeBase64(encoded) {
const binary = atob(encoded);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < bytes.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
return new TextDecoder().decode(bytes);
}
function renderMarkmap(el) {
const dataEl = el.querySelector("markmap-data");
if (!dataEl) return;
let content = el.textContent;
if (dataEl.getAttribute("encoding") === "base64") {
content = decodeBase64(content);
}
el.innerHTML = "<svg>";
svg = el.firstChild;
const { root, options } = parseData(content);
const m = markmap.Markmap.create(svg, options);
m.setData(root);
requestAnimationFrame(() => {
resetMarkmap(m, el);
});
}
function updateMarkmaps(node) {
for (const el of node.querySelectorAll(".mkdocs-markmap")) {
renderMarkmap(el);
}
}
loading.then(() => {
const observer = new MutationObserver((mutationList) => {
for (const mutation of mutationList) {
if (mutation.type === "childList") {
for (const node of mutation.addedNodes) {
updateMarkmaps(node);
}
}
}
});
observer.observe(document.body, { childList: true });
updateMarkmaps(document);
});
})();