|
1 | 1 | (function initializeMarkmap() { |
2 | | - function update_markmaps() { |
3 | | - const markmap_transformer = new markmap.Transformer(); |
| 2 | + const transformer = new markmap.Transformer(); |
| 3 | + const assets = transformer.getAssets(); |
| 4 | + const loading = Promise.all([ |
| 5 | + assets.styles && markmap.loadCSS(assets.styles), |
| 6 | + assets.scripts && markmap.loadJS(assets.scripts), |
| 7 | + ]); |
| 8 | + |
| 9 | + function parseData(content) { |
| 10 | + const { root, frontmatter } = transformer.transform(content); |
| 11 | + let options = markmap.deriveOptions(frontmatter?.markmap); |
| 12 | + options = Object.assign({ |
| 13 | + fitRatio: 0.85, |
| 14 | + }, options); |
| 15 | + return { root, options }; |
| 16 | + } |
| 17 | + |
| 18 | + function resetMarkmap(m, el) { |
| 19 | + const { minX, maxX, minY, maxY } = m.state; |
| 20 | + const height = el.clientWidth * (maxX - minX) / (maxY - minY); |
| 21 | + el.style.height = height + "px"; |
| 22 | + m.fit(); |
| 23 | + } |
| 24 | + |
| 25 | + function renderMarkmap(el) { |
| 26 | + let svg = el.querySelector('svg'); |
| 27 | + if (svg) return; |
| 28 | + const content = el.textContent; |
| 29 | + el.innerHTML = '<svg>'; |
| 30 | + svg = el.firstChild; |
| 31 | + const { root, options } = parseData(content); |
| 32 | + const m = markmap.Markmap.create(svg, options, root); |
| 33 | + resetMarkmap(m, el); |
| 34 | + transformer.hooks.retransform.tap(() => { |
| 35 | + const { root, options } = parseData(content); |
| 36 | + m.setData(root, options); |
| 37 | + resetMarkmap(m, el); |
| 38 | + }); |
| 39 | + } |
| 40 | + |
| 41 | + function updateMarkmaps() { |
4 | 42 | const markmaps = document.getElementsByClassName('mkdocs-markmap'); |
5 | | - var el, content, svg, root, m; |
6 | 43 | for (var i = 0; i < markmaps.length; i++) { |
7 | | - el = markmaps[i]; |
8 | | - svg = el.querySelector('svg'); |
9 | | - if (svg) continue; |
10 | | - content = el.textContent; |
11 | | - el.innerHTML = '<svg>'; |
12 | | - svg = el.firstChild; |
13 | | - root = markmap_transformer.transform(content).root; |
14 | | - m = markmap.Markmap.create(svg, null, root); |
15 | | - |
16 | | - (function(obj, e, r) { |
17 | | - obj.rescale(1).then(function() { |
18 | | - e.parentElement.style.height = (e.getBBox().height + 10) + "px"; |
19 | | - requestAnimationFrame(() => { obj.fit(); }) |
20 | | - }); |
21 | | - })(m, svg, root); |
| 44 | + const el = markmaps[i]; |
| 45 | + renderMarkmap(el); |
22 | 46 | } |
23 | 47 | } |
24 | 48 |
|
25 | | - var MutationObserver = window.MutationObserver || window.WebKitMutationObserver; |
26 | | - var observer = new MutationObserver(function(mutations) { |
27 | | - update_markmaps(); |
28 | | - }); |
| 49 | + loading.then(() => { |
| 50 | + var MutationObserver = window.MutationObserver || window.WebKitMutationObserver; |
| 51 | + var observer = new MutationObserver(function(mutations) { |
| 52 | + updateMarkmaps(); |
| 53 | + }); |
29 | 54 |
|
30 | | - var target = document.getElementById('mkdocs-decrypted-content'); |
31 | | - if (undefined != target) { |
32 | | - observer.observe(target, { childList: true }); |
33 | | - } |
| 55 | + var target = document.getElementById('mkdocs-decrypted-content'); |
| 56 | + if (undefined != target) { |
| 57 | + observer.observe(target, { childList: true }); |
| 58 | + } |
34 | 59 |
|
35 | | - update_markmaps(); |
| 60 | + updateMarkmaps(); |
| 61 | + }); |
36 | 62 | })(); |
0 commit comments