From ba1f533134d230e4bc65d3f6072c63993e07228a Mon Sep 17 00:00:00 2001 From: pennae Date: Mon, 23 Jan 2023 21:11:47 +0100 Subject: 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. --- nixos/lib/make-options-doc/default.nix | 1 + nixos/lib/make-options-doc/optionsToDocbook.py | 37 ++++++++++++++++---------- 2 files changed, 24 insertions(+), 14 deletions(-) (limited to 'nixos/lib/make-options-doc') 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"{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: -- cgit 1.4.1