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 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/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) 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" 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/extension.py b/mkdocs_markmap/extension.py index cd42eb6..30c73a8 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 @@ -48,30 +49,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: str = path.read_text(encoding=self.encoding) + 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..daa5e4e 100644
--- a/mkdocs_markmap/static_files/mkdocs-markmap.js
+++ b/mkdocs_markmap/static_files/mkdocs-markmap.js
@@ -1,45 +1,60 @@
(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) {
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);
+ 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) {
- let svg = el.querySelector('svg');
- if (svg) return;
- const content = el.textContent;
- el.innerHTML = '