diff options
author | pennae <github@quasiparticle.net> | 2023-06-10 22:32:22 +0200 |
---|---|---|
committer | pennae <github@quasiparticle.net> | 2023-07-01 20:27:29 +0200 |
commit | ac7be1f106c139f6153576a80372b2e216f005fc (patch) | |
tree | 0e96fc75786615570bf1d100f76a94f9dbfe788b /pkgs/tools/nix | |
parent | 8fb4cf8b7c6f9d180a59e0f33405bc6a61e24d60 (diff) |
nixos-render-docs: add support for tables
Diffstat (limited to 'pkgs/tools/nix')
3 files changed, 114 insertions, 0 deletions
diff --git a/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/html.py b/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/html.py index e5ffcdadba944..2c8113339b7b6 100644 --- a/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/html.py +++ b/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/html.py @@ -257,6 +257,47 @@ class HTMLRenderer(Renderer): '</p>' '<div class="figure-contents">' ) + def table_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return ( + '<div class="informaltable">' + '<table class="informaltable" border="1">' + ) + def table_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return ( + '</table>' + '</div>' + ) + def thead_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + cols = [] + for j in range(i + 1, len(tokens)): + if tokens[j].type == 'thead_close': + break + elif tokens[j].type == 'th_open': + cols.append(cast(str, tokens[j].attrs.get('style', 'left')).removeprefix('text-align:')) + return "".join([ + "<colgroup>", + "".join([ f'<col align="{col}" />' for col in cols ]), + "</colgroup>", + "<thead>", + ]) + def thead_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return "</thead>" + def tr_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return "<tr>" + def tr_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return "</tr>" + def th_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return f'<th align="{cast(str, token.attrs.get("style", "left")).removeprefix("text-align:")}">' + def th_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return "</th>" + def tbody_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return "<tbody>" + def tbody_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return "</tbody>" + def td_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return f'<td align="{cast(str, token.attrs.get("style", "left")).removeprefix("text-align:")}">' + def td_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + return "</td>" def _make_hN(self, level: int) -> tuple[str, str]: return f"h{min(6, max(1, level + self._hlevel_offset))}", "" diff --git a/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py b/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py index 1ee21986b0ff1..c5efe2021a250 100644 --- a/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py +++ b/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py @@ -95,6 +95,18 @@ class Renderer: "figure_close": self.figure_close, "figure_title_open": self.figure_title_open, "figure_title_close": self.figure_title_close, + "table_open": self.table_open, + "table_close": self.table_close, + "thead_open": self.thead_open, + "thead_close": self.thead_close, + "tr_open": self.tr_open, + "tr_close": self.tr_close, + "th_open": self.th_open, + "th_close": self.th_close, + "tbody_open": self.tbody_open, + "tbody_close": self.tbody_close, + "td_open": self.td_open, + "td_close": self.td_close, } self._admonitions = { @@ -240,6 +252,30 @@ class Renderer: raise RuntimeError("md token not supported", token) def figure_title_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: raise RuntimeError("md token not supported", token) + def table_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def table_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def thead_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def thead_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def tr_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def tr_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def th_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def th_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def tbody_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def tbody_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def td_open(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) + def td_close(self, token: Token, tokens: Sequence[Token], i: int) -> str: + raise RuntimeError("md token not supported", token) def _is_escaped(src: str, pos: int) -> bool: found = 0 @@ -506,6 +542,7 @@ class Converter(ABC, Generic[TR]): }, renderer_cls=self.ForbiddenRenderer ) + self._md.enable('table') self._md.use( container_plugin, name="blockattr", diff --git a/pkgs/tools/nix/nixos-render-docs/src/tests/test_html.py b/pkgs/tools/nix/nixos-render-docs/src/tests/test_html.py index 863aa68e3820c..ad1f7189be2c3 100644 --- a/pkgs/tools/nix/nixos-render-docs/src/tests/test_html.py +++ b/pkgs/tools/nix/nixos-render-docs/src/tests/test_html.py @@ -1,5 +1,6 @@ import nixos_render_docs as nrd import pytest +import textwrap from sample_md import sample1 @@ -83,6 +84,41 @@ def test_images() -> None: </p> """) +def test_tables() -> None: + c = Converter({}, {}) + assert c._render(textwrap.dedent(""" + | d | l | m | r | + |---|:--|:-:|--:| + | a | b | c | d | + """)) == unpretty(""" + <div class="informaltable"> + <table class="informaltable" border="1"> + <colgroup> + <col align="left" /> + <col align="left" /> + <col align="center" /> + <col align="right" /> + </colgroup> + <thead> + <tr> + <th align="left">d</th> + <th align="left">l</th> + <th align="center">m</th> + <th align="right">r</th> + </tr> + </thead> + <tbody> + <tr> + <td align="left">a</td> + <td align="left">b</td> + <td align="center">c</td> + <td align="right">d</td> + </tr> + </tbody> + </table> + </div> + """) + def test_full() -> None: c = Converter({ 'man(1)': 'http://example.org' }, {}) assert c._render(sample1) == unpretty(""" |