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: