diff --git a/content/other.md b/content/other.md index 836959b..e29140f 100644 --- a/content/other.md +++ b/content/other.md @@ -1,6 +1,6 @@ # Other -```kroki-blockdiag no-transparency=false +```{.blockdiag title="Blocks"} blockdiag { blockdiag -> generates -> "block-diagrams"; blockdiag -> is -> "very easy!"; diff --git a/hooks/kroki.py b/hooks/kroki.py new file mode 100644 index 0000000..c05de6f --- /dev/null +++ b/hooks/kroki.py @@ -0,0 +1,55 @@ +import base64 +import zlib +from mkdocs.utils.cache import download_and_cache_url +from datetime import timedelta +from mkdocs.plugins import get_plugin_logger +from urllib.request import build_opener, install_opener +import hashlib +from functools import partial +from mkdocs.utils import write_file +import os + +logger = get_plugin_logger("kroki") + +DIAGRAM_CACHE_TIME = timedelta(days=7) + +def get_kroki_diagram(source, language): + encoded_diagram = base64.urlsafe_b64encode(zlib.compress(source.encode(), 9)).decode() + + return download_and_cache_url(f"https://kroki.io/{language}/svg/{encoded_diagram}", DIAGRAM_CACHE_TIME) + + +def fence_div_format(site_dir, source, language, *args, attrs, **kwargs): + try: + title = attrs.get("title") + + diagram = get_kroki_diagram(source, language) + + filename = hashlib.md5(source.encode()).hexdigest() + ".svg" + + image_url = f"/assets/kroki-generated/{language}/{filename}" + + write_file(diagram, os.path.join(site_dir, image_url.removeprefix("/"))) + + except Exception: + logger.exception("Failed to generate diagram") + return + + return f"{title}" + +def on_config(config): + # Override user-agent so kroki accepts it + opener = build_opener() + opener.addheaders = [('User-Agent','mkdocs')] + install_opener(opener) + + custom_fences = [{ + "name": "blockdiag", + "class": "blockdiag", + "format": partial(fence_div_format, config["site_dir"]) + }] + + config.mdx_configs["pymdownx.superfences"] = { + "custom_fences": custom_fences + } + return config diff --git a/mkdocs.yml b/mkdocs.yml index 35cfff4..5ba3acc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -17,6 +17,7 @@ hooks: - hooks/redirects.py - hooks/globals.py - hooks/pygments-styles.py + - hooks/kroki.py markdown_extensions: - attr_list @@ -24,7 +25,4 @@ markdown_extensions: - pymdownx.superfences plugins: - # - kroki: - # DownloadImages: true - # DownloadDir: assets/kroki-generated - search diff --git a/requirements.txt b/requirements.txt index 1b13b39..06bdea3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ mkdocs jinja2-simple-tags -mkdocs-kroki-plugin pymdown-extensions pygments minify-html