summary refs log tree commit diff
path: root/nixos/lib/make-options-doc
diff options
context:
space:
mode:
authorpennae <github@quasiparticle.net>2023-01-23 21:11:47 +0100
committerpennae <github@quasiparticle.net>2023-01-26 00:38:06 +0100
commitba1f533134d230e4bc65d3f6072c63993e07228a (patch)
tree822e6805ce4c7db3f61364151237abc583457630 /nixos/lib/make-options-doc
parent3e45994a3bd92be78891e869352cb5d9741b1046 (diff)
downloadnixpkgs-ba1f533134d230e4bc65d3f6072c63993e07228a.tar
nixpkgs-ba1f533134d230e4bc65d3f6072c63993e07228a.tar.gz
nixpkgs-ba1f533134d230e4bc65d3f6072c63993e07228a.tar.bz2
nixpkgs-ba1f533134d230e4bc65d3f6072c63993e07228a.tar.lz
nixpkgs-ba1f533134d230e4bc65d3f6072c63993e07228a.tar.xz
nixpkgs-ba1f533134d230e4bc65d3f6072c63993e07228a.tar.zst
nixpkgs-ba1f533134d230e4bc65d3f6072c63993e07228a.zip
nixos/make-option-docs: wrap md parser+renderer into Converter
the new rendering tool will consist of a number of different Converters,
each with a possibly specialized Renderer.
Diffstat (limited to 'nixos/lib/make-options-doc')
-rw-r--r--nixos/lib/make-options-doc/default.nix1
-rw-r--r--nixos/lib/make-options-doc/optionsToDocbook.py37
2 files changed, 24 insertions, 14 deletions
diff --git a/nixos/lib/make-options-doc/default.nix b/nixos/lib/make-options-doc/default.nix
index 01db7bcbee9..b7a47f9713e 100644
--- a/nixos/lib/make-options-doc/default.nix
+++ b/nixos/lib/make-options-doc/default.nix
@@ -177,6 +177,7 @@ in rec {
         in [
           markdown-it-py
           mdit-py-plugins
+          p.frozendict
         ]))
     ];
   } ''
diff --git a/nixos/lib/make-options-doc/optionsToDocbook.py b/nixos/lib/make-options-doc/optionsToDocbook.py
index 14a2c39b13a..d671c046ee1 100644
--- a/nixos/lib/make-options-doc/optionsToDocbook.py
+++ b/nixos/lib/make-options-doc/optionsToDocbook.py
@@ -2,8 +2,9 @@ import collections
 import json
 import os
 import sys
-from typing import Any, Dict, List
 from collections.abc import MutableMapping, Sequence
+from typing import Any, Dict, List
+from frozendict import frozendict
 
 # for MD conversion
 import markdown_it
@@ -15,8 +16,6 @@ from mdit_py_plugins.deflist import deflist_plugin
 from mdit_py_plugins.myst_role import myst_role_plugin
 from xml.sax.saxutils import escape, quoteattr
 
-manpage_urls = json.load(open(os.getenv('MANPAGE_URLS')))
-
 class Renderer(markdown_it.renderer.RendererProtocol):
     __output__ = "docbook"
     def __init__(self, parser=None):
@@ -187,21 +186,31 @@ class Renderer(markdown_it.renderer.RendererProtocol):
             title = f"<refentrytitle>{escape(page)}</refentrytitle>"
             vol = f"<manvolnum>{escape(section)}</manvolnum>"
             ref = f"<citerefentry>{title}{vol}</citerefentry>"
-            if man in manpage_urls:
-                return f"<link xlink:href={quoteattr(manpage_urls[man])}>{ref}</link>"
+            if man in env['manpage_urls']:
+                return f"<link xlink:href={quoteattr(env['manpage_urls'][man])}>{ref}</link>"
             else:
                 return ref
         raise NotImplementedError("md node not supported yet", token)
 
-md = (
-    markdown_it.MarkdownIt(renderer_cls=Renderer)
-    # TODO maybe fork the plugin and have only a single rule for all?
-    .use(container_plugin, name="{.note}")
-    .use(container_plugin, name="{.important}")
-    .use(container_plugin, name="{.warning}")
-    .use(deflist_plugin)
-    .use(myst_role_plugin)
-)
+class Converter:
+    def __init__(self, manpage_urls: Dict[str, str]):
+        self._md = markdown_it.MarkdownIt(renderer_cls=Renderer)
+        # TODO maybe fork the plugin and have only a single rule for all?
+        self._md.use(container_plugin, name="{.note}")
+        self._md.use(container_plugin, name="{.important}")
+        self._md.use(container_plugin, name="{.warning}")
+        self._md.use(deflist_plugin)
+        self._md.use(myst_role_plugin)
+
+        self._manpage_urls = frozendict(manpage_urls)
+
+    def render(self, src: str) -> str:
+        env = {
+            'manpage_urls': self._manpage_urls
+        }
+        return self._md.render(src, env)
+
+md = Converter(json.load(open(os.getenv('MANPAGE_URLS'))))
 
 # converts in-place!
 def convertMD(options: Dict[str, Any]) -> str: