nixos-render-docs: add the .keycap class

this lets us parse the `[F12]{.keycap}` syntax we recently introduced to
the nixos manual markdown sources. the docbook renderer emits the keycap
element for this class, the manpage renderer will reject it because it's
not entirely clear what to do with it: while html has <kbd> mandoc has
nothing of the sort, and with no current occurences in options doc we
don't have to settle on a (potentially bad) way to render these.
This commit is contained in:
pennae
2023-02-08 08:16:42 +01:00
committed by Florian Brandes
parent 15ffa716b0
commit c09b3a3cc7

View File

@@ -34,12 +34,14 @@ class DocBookRenderer(Renderer):
_link_tags: list[str] _link_tags: list[str]
_deflists: list[Deflist] _deflists: list[Deflist]
_headings: list[Heading] _headings: list[Heading]
_attrspans: list[str]
def __init__(self, manpage_urls: Mapping[str, str], parser: Optional[markdown_it.MarkdownIt] = None): def __init__(self, manpage_urls: Mapping[str, str], parser: Optional[markdown_it.MarkdownIt] = None):
super().__init__(manpage_urls, parser) super().__init__(manpage_urls, parser)
self._link_tags = [] self._link_tags = []
self._deflists = [] self._deflists = []
self._headings = [] self._headings = []
self._attrspans = []
def render(self, tokens: Sequence[Token], options: OptionsDict, def render(self, tokens: Sequence[Token], options: OptionsDict,
env: MutableMapping[str, Any]) -> str: env: MutableMapping[str, Any]) -> str:
@@ -214,16 +216,23 @@ class DocBookRenderer(Renderer):
raise NotImplementedError("md node not supported yet", token) raise NotImplementedError("md node not supported yet", token)
def attr_span_begin(self, token: Token, tokens: Sequence[Token], i: int, options: OptionsDict, def attr_span_begin(self, token: Token, tokens: Sequence[Token], i: int, options: OptionsDict,
env: MutableMapping[str, Any]) -> str: env: MutableMapping[str, Any]) -> str:
# we currently support *only* inline anchors (and no attributes at all). # we currently support *only* inline anchors and the special .keycap class to produce
id_part = "" # <keycap> docbook elements.
(id_part, class_part) = ("", "")
if s := token.attrs.get('id'): if s := token.attrs.get('id'):
id_part = f'<anchor xml:id={quoteattr(cast(str, s))} />' id_part = f'<anchor xml:id={quoteattr(cast(str, s))} />'
if 'class' in token.attrs: if s := token.attrs.get('class'):
if s == 'keycap':
class_part = "<keycap>"
self._attrspans.append("</keycap>")
else:
return super().attr_span_begin(token, tokens, i, options, env) return super().attr_span_begin(token, tokens, i, options, env)
return id_part else:
self._attrspans.append("")
return id_part + class_part
def attr_span_end(self, token: Token, tokens: Sequence[Token], i: int, options: OptionsDict, def attr_span_end(self, token: Token, tokens: Sequence[Token], i: int, options: OptionsDict,
env: MutableMapping[str, Any]) -> str: env: MutableMapping[str, Any]) -> str:
return "" return self._attrspans.pop()
def ordered_list_open(self, token: Token, tokens: Sequence[Token], i: int, options: OptionsDict, def ordered_list_open(self, token: Token, tokens: Sequence[Token], i: int, options: OptionsDict,
env: MutableMapping[str, Any]) -> str: env: MutableMapping[str, Any]) -> str:
start = f' startingnumber="{token.attrs["start"]}"' if 'start' in token.attrs else "" start = f' startingnumber="{token.attrs["start"]}"' if 'start' in token.attrs else ""