diff --git a/nixos/lib/make-options-doc/default.nix b/nixos/lib/make-options-doc/default.nix
index 01db7bcbee9b..b7a47f9713e6 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 14a2c39b13a1..d671c046ee1b 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"{escape(page)}"
vol = f"{escape(section)}"
ref = f"{title}{vol}"
- if man in manpage_urls:
- return f"{ref}"
+ if man in env['manpage_urls']:
+ return f"{ref}"
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: