From 512bf91a150eccfe00fc744d24e7ac6901a09a28 Mon Sep 17 00:00:00 2001 From: Gerald Date: Thu, 19 Dec 2024 12:14:26 +0800 Subject: [PATCH 1/6] fix: encode markmap source as base64 to avoid being handled by other plugins --- mkdocs_markmap/extension.py | 23 ++++++------ mkdocs_markmap/plugin.py | 8 +++-- mkdocs_markmap/static_files/mkdocs-markmap.js | 35 +++++++++++++------ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/mkdocs_markmap/extension.py b/mkdocs_markmap/extension.py index cd42eb6..d064ce2 100644 --- a/mkdocs_markmap/extension.py +++ b/mkdocs_markmap/extension.py @@ -1,3 +1,4 @@ +import base64 import logging import re from functools import partial @@ -49,29 +50,31 @@ def run(self, lines: List[str]) -> List[str]: included_paths.append(path) try: with open(path, "r", encoding=self.encoding) as r: - markmap: List[str] = r.readlines() - + markmap = r.read() + except Exception as e: log.error("unable to include file {}. Ignoring statement. Error: {}".format(path, e)) lines[loc] = INCLUDE_SYNTAX.sub("",line) break line_split: List[str] = INCLUDE_SYNTAX.split(line) + output: List[str] = [] if len(markmap) == 0: - markmap.append("") + output.append("") else: - markmap.insert(0, "```markmap") - markmap.append("```") - + output.append('
')
+                    output.append(base64.b64encode(markmap.encode()).decode())
+                    output.append("
") + if line_split[0].strip() != "": - markmap.insert(0, line_split[0]) + output.insert(0, line_split[0]) if line_split[2].strip() != "": - markmap.append(line_split[2]) + output.append(line_split[2]) - lines = lines[:loc] + markmap + lines[loc+1:] + lines = lines[:loc] + output + lines[loc+1:] break - + else: done = True diff --git a/mkdocs_markmap/plugin.py b/mkdocs_markmap/plugin.py index b11239e..ccd6d95 100644 --- a/mkdocs_markmap/plugin.py +++ b/mkdocs_markmap/plugin.py @@ -1,14 +1,15 @@ +import base64 import logging from pathlib import Path import re from typing import Dict, Tuple from bs4 import BeautifulSoup, ResultSet, Tag - from mkdocs.config.base import Config, load_config from mkdocs.config.config_options import Type as PluginType from mkdocs.plugins import BasePlugin from mkdocs.structure.pages import Page + from mkdocs_markmap.extension import MarkmapExtension from .defaults import MARKMAP @@ -116,7 +117,6 @@ def on_page_content(self, html: str, page: Page, **kwargs) -> str: for index, markmap in enumerate(markmaps): markmap: Tag - tag_id: str = f"markmap-{index}" pre: Tag code: Tag if markmap.name == "pre": @@ -129,5 +129,9 @@ def on_page_content(self, html: str, page: Page, **kwargs) -> str: pre["class"] = pre.get("class", []) + ["mkdocs-markmap"] code.name = "markmap-data" code.attrs["hidden"] = "true" + if not code.attrs.get("encoding"): + # Encode content as base64 to avoid being handled by other plugins like KaTeX + code.attrs["encoding"] = "base64" + code.string = base64.b64encode(code.get_text().strip().encode()).decode() return str(soup) diff --git a/mkdocs_markmap/static_files/mkdocs-markmap.js b/mkdocs_markmap/static_files/mkdocs-markmap.js index 3715fc7..ce31c7d 100644 --- a/mkdocs_markmap/static_files/mkdocs-markmap.js +++ b/mkdocs_markmap/static_files/mkdocs-markmap.js @@ -9,24 +9,39 @@ function parseData(content) { const { root, frontmatter } = transformer.transform(content); let options = markmap.deriveOptions(frontmatter?.markmap); - options = Object.assign({ - fitRatio: 0.85, - }, options); + options = Object.assign( + { + fitRatio: 0.85, + }, + options + ); return { root, options }; } function resetMarkmap(m, el) { const { minX, maxX, minY, maxY } = m.state; - const height = el.clientWidth * (maxX - minX) / (maxY - minY); + const height = (el.clientWidth * (maxX - minX)) / (maxY - minY); 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) { - let svg = el.querySelector('svg'); - if (svg) return; - const content = el.textContent; - el.innerHTML = ''; + const dataEl = el.querySelector("markmap-data"); + if (!dataEl) return; + let content = el.textContent; + if (dataEl.getAttribute("encoding") === "base64") { + content = decodeBase64(content); + } + el.innerHTML = ""; svg = el.firstChild; const { root, options } = parseData(content); const m = markmap.Markmap.create(svg, options, root); @@ -39,7 +54,7 @@ } function updateMarkmaps(node) { - for (const el of node.querySelectorAll('.mkdocs-markmap')) { + for (const el of node.querySelectorAll(".mkdocs-markmap")) { renderMarkmap(el); } } @@ -47,7 +62,7 @@ loading.then(() => { const observer = new MutationObserver((mutationList) => { for (const mutation of mutationList) { - if (mutation.type === 'childList') { + if (mutation.type === "childList") { for (const node of mutation.addedNodes) { updateMarkmaps(node); } From 723338ec8ace8af10050872b334e698d14ae5d8c Mon Sep 17 00:00:00 2001 From: Gerald Date: Thu, 19 Dec 2024 12:46:09 +0800 Subject: [PATCH 2/6] fix: update to markmap v0.18 --- README.md | 8 ++++---- mkdocs_markmap/defaults.py | 4 ++-- mkdocs_markmap/static_files/mkdocs-markmap.js | 16 ++++++++-------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 3a73971..79d6e12 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,8 @@ plugins: encoding: utf-8 file_extension: .mm.md d3_version: 7 - lib_version: 0.15.3 - view_version: 0.15.3 + lib_version: 0.18 + view_version: 0.18 ``` In addition, feel free to define your favourite source urls like this: @@ -89,8 +89,8 @@ plugins: extra_javascript: - https://unpkg.com/d3@7/dist/d3.min.js - - https://unpkg.com/markmap-lib@0.15.3/dist/browser/index.js - - https://unpkg.com/markmap-view@0.15.3/dist/browser/index.js + - https://unpkg.com/markmap-lib@0.18/dist/browser/index.iife.js + - https://unpkg.com/markmap-view@0.18/dist/browser/index.js ``` ## Troubleshooting diff --git a/mkdocs_markmap/defaults.py b/mkdocs_markmap/defaults.py index af317e2..efb8a30 100644 --- a/mkdocs_markmap/defaults.py +++ b/mkdocs_markmap/defaults.py @@ -14,12 +14,12 @@ class JsModuleConfig(object): ) MARKMAP_LIB: JsModuleConfig = JsModuleConfig( - version="0.15.4", + version="0.18", uri="https://unpkg.com/markmap-lib@{}", ) MARKMAP_VIEW: JsModuleConfig = JsModuleConfig( - version="0.15.4", + version="0.18", uri="https://unpkg.com/markmap-view@{}", ) diff --git a/mkdocs_markmap/static_files/mkdocs-markmap.js b/mkdocs_markmap/static_files/mkdocs-markmap.js index ce31c7d..daa5e4e 100644 --- a/mkdocs_markmap/static_files/mkdocs-markmap.js +++ b/mkdocs_markmap/static_files/mkdocs-markmap.js @@ -1,9 +1,10 @@ (function initializeMarkmap() { const transformer = new markmap.Transformer(); + const preloadAssets = transformer.getPreloadScripts(); const assets = transformer.getAssets(); const loading = Promise.all([ assets.styles && markmap.loadCSS(assets.styles), - assets.scripts && markmap.loadJS(assets.scripts), + markmap.loadJS([...preloadAssets.scripts, ...assets.scripts]), ]); function parseData(content) { @@ -19,8 +20,9 @@ } function resetMarkmap(m, el) { - const { minX, maxX, minY, maxY } = m.state; - const height = (el.clientWidth * (maxX - minX)) / (maxY - minY); + 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(); } @@ -44,11 +46,9 @@ el.innerHTML = ""; svg = el.firstChild; const { root, options } = parseData(content); - const m = markmap.Markmap.create(svg, options, root); - resetMarkmap(m, el); - transformer.hooks.retransform.tap(() => { - const { root, options } = parseData(content); - m.setData(root, options); + const m = markmap.Markmap.create(svg, options); + m.setData(root); + requestAnimationFrame(() => { resetMarkmap(m, el); }); } From 3613b63bd2b6143897155f3acbe30b5ef46c02e9 Mon Sep 17 00:00:00 2001 From: Gerald Date: Thu, 19 Dec 2024 13:21:04 +0800 Subject: [PATCH 3/6] chore: add editorconfig --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6c592b2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +[*] +indent_style = space +indent_size = 4 +quote_type = double From 1883290ea28219f23cf7ba9297e698a457b2dfe4 Mon Sep 17 00:00:00 2001 From: neatc0der <2805028+neatc0der@users.noreply.github.com> Date: Sun, 2 Feb 2025 12:14:37 +0100 Subject: [PATCH 4/6] Add changeling for v2.5.0.md --- changelog/v2.5.0.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog/v2.5.0.md diff --git a/changelog/v2.5.0.md b/changelog/v2.5.0.md new file mode 100644 index 0000000..151b4c1 --- /dev/null +++ b/changelog/v2.5.0.md @@ -0,0 +1,4 @@ +# v2.5.0 + +* Bump version of `markmap` to v0.18 +* Fix of issue that other plugins broke `markmap` (see #63) From 30887b474043cb3099e1b396bb111b9d022ed5d7 Mon Sep 17 00:00:00 2001 From: neatc0der <2805028+neatc0der@users.noreply.github.com> Date: Sun, 2 Feb 2025 12:15:05 +0100 Subject: [PATCH 5/6] Bump version to 2.5.0 --- mkdocs_markmap/__meta__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs_markmap/__meta__.py b/mkdocs_markmap/__meta__.py index db7fb98..ea88964 100644 --- a/mkdocs_markmap/__meta__.py +++ b/mkdocs_markmap/__meta__.py @@ -1,6 +1,6 @@ PACKAGE_NAME: str = "mkdocs_markmap" PROJECT_NAME: str = PACKAGE_NAME.replace("_", "-") -PROJECT_VERSION: str = "2.4.3" +PROJECT_VERSION: str = "2.5.0" OWNER: str = "neatc0der" ORGANISATION: str = "markmap" From 810ab8e09dc828333950ffd8505f2b8bf9f6af97 Mon Sep 17 00:00:00 2001 From: neatc0der <2805028+neatc0der@users.noreply.github.com> Date: Sun, 2 Feb 2025 12:20:56 +0100 Subject: [PATCH 6/6] Update extension.py --- mkdocs_markmap/extension.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mkdocs_markmap/extension.py b/mkdocs_markmap/extension.py index d064ce2..30c73a8 100644 --- a/mkdocs_markmap/extension.py +++ b/mkdocs_markmap/extension.py @@ -49,8 +49,7 @@ def run(self, lines: List[str]) -> List[str]: included_paths.append(path) try: - with open(path, "r", encoding=self.encoding) as r: - markmap = r.read() + markmap: str = path.read_text(encoding=self.encoding) except Exception as e: log.error("unable to include file {}. Ignoring statement. Error: {}".format(path, e))