22
33from __future__ import annotations
44
5+ from itertools import starmap
56from typing import TYPE_CHECKING
67
78from docutils import nodes
1112from sphinx .util .docutils import SphinxDirective
1213
1314if TYPE_CHECKING :
15+ from collections .abc import Callable
16+
1417 from sphinx .application import Sphinx
1518 from sphinx .util .typing import ExtensionMetadata
1619
4952KNOWN_PLATFORMS = _PLATFORMS | _LIBC | _THREADING
5053
5154
55+ def _print_platform (
56+ platform : str , version : str | bool
57+ ) -> str | Callable [[str ], str ]:
58+ if version is True :
59+ return platform
60+ if not version :
61+ return sphinx_gettext ("not {platform}" ).format (platform = platform )
62+ return f"{ platform } >= { version } "
63+
64+
5265class Availability (SphinxDirective ):
5366 has_content = True
5467 required_arguments = 1
@@ -68,14 +81,17 @@ def run(self) -> list[nodes.container]:
6881 refwarn = True ,
6982 )
7083 sep = nodes .Text (": " )
71- parsed , msgs = self .state .inline_text (self .arguments [0 ], self .lineno )
84+ platforms = self .parse_platforms ()
85+ platforms_text = (
86+ f"{ ', ' .join (starmap (_print_platform , platforms .items ()))} ."
87+ )
88+ parsed , msgs = self .state .inline_text (platforms_text , self .lineno )
7289 pnode = nodes .paragraph (title , "" , refnode , sep , * parsed , * msgs )
7390 self .set_source_info (pnode )
7491 cnode = nodes .container ("" , pnode , classes = ["availability" ])
7592 self .set_source_info (cnode )
7693 if self .content :
7794 self .state .nested_parse (self .content , self .content_offset , cnode )
78- self .parse_platforms ()
7995
8096 return [cnode ]
8197
0 commit comments