[PATCH 23/57] docs/qapi-domain: add :ifcond: directive option

John Snow posted 57 patches 4 weeks ago
There is a newer version of this series
[PATCH 23/57] docs/qapi-domain: add :ifcond: directive option
Posted by John Snow 4 weeks ago
Add a special :ifcond: option that allows us to annotate the
definition-level conditionals.

RFC: This patch renders IFCOND information in two places, because I'm
undecided about how to style this information. One option is in the
signature bar, and another option is in an eye-catch, like :deprecated:
or :unstable:.

A benefit to having this be a directive option is that we can put it in
the signature bar, the QAPI index, etc. However, if we merely want it in
the content section, a directive would work just as well,
e.g. ".. qapi:ifcond:: CONFIG_LINUX".

(Though, having it be in the same containing box as the unstable/ifcond
boxes might require some extra fiddling/post-processing to
achieve. Generally, the less docutils tree muddling I have to do, the
happier I am.)

The syntax of the argument is currently undefined, but it is possible to
parse it back down into constituent parts to avoid applying literal
formatting to "AND" or "&&" or whichever syntax we formalize. (Or, in
the future, applying cross-reference links to the config values for
additional reading on some of those build options. Not for this series.)

"Vote now on your phones!"

Signed-off-by: Harmonie Snow <harmonie@gmail.com>
Signed-off-by: John Snow <jsnow@redhat.com>
---
 docs/sphinx-static/theme_overrides.css | 13 +++++++++
 docs/sphinx/qapi_domain.py             | 39 ++++++++++++++++++++++++--
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/docs/sphinx-static/theme_overrides.css b/docs/sphinx-static/theme_overrides.css
index 5f58f1d5246..3fd326613d9 100644
--- a/docs/sphinx-static/theme_overrides.css
+++ b/docs/sphinx-static/theme_overrides.css
@@ -237,3 +237,16 @@ div[class^="highlight"] pre {
 .qapi-deprecated::before {
     content: '⚠️ ';
 }
+
+.qapi-ifcond::before {
+    /* gaze ye into the crystal ball to determine feature availability */
+    content: '🔮 ';
+}
+
+.qapi-ifcond {
+    background-color: #f9f5ff;
+    border: solid #dac2ff 6px;
+    padding: 8px;
+    border-radius: 15px;
+    margin: 5px;
+}
diff --git a/docs/sphinx/qapi_domain.py b/docs/sphinx/qapi_domain.py
index ef4fa978a3a..c75b0e6e22d 100644
--- a/docs/sphinx/qapi_domain.py
+++ b/docs/sphinx/qapi_domain.py
@@ -16,6 +16,7 @@
     NamedTuple,
     Optional,
     Tuple,
+    Union,
     cast,
 )
 
@@ -140,6 +141,7 @@ class QAPIObject(ObjectDescription[Signature]):
             "module": directives.unchanged,  # Override contextual module name
             # These are QAPI originals:
             "since": since_validator,
+            "ifcond": directives.unchanged,
             "deprecated": directives.flag,
             "unstable": directives.flag,
         }
@@ -167,6 +169,22 @@ def get_signature_suffix(self) -> List[nodes.Node]:
         """Returns a suffix to put after the object name in the signature."""
         ret: List[nodes.Node] = []
 
+        if "ifcond" in self.options:
+            ret += [
+                SpaceNode(" "),
+                nodes.inline(
+                    self.options["ifcond"],
+                    "",
+                    nodes.Text("["),
+                    nodes.literal("", "#if"),
+                    SpaceNode(" "),
+                    nodes.literal(
+                        self.options["ifcond"], self.options["ifcond"]
+                    ),
+                    nodes.Text("]"),
+                ),
+            ]
+
         if "since" in self.options:
             ret += [
                 SpaceNode(" "),
@@ -261,9 +279,14 @@ def _add_infopips(self, contentnode: addnodes.desc_content) -> None:
         infopips = nodes.container()
         infopips.attributes["classes"].append("qapi-infopips")
 
-        def _add_pip(source: str, content: str, classname: str) -> None:
+        def _add_pip(
+            source: str, content: Union[str, List[nodes.Node]], classname: str
+        ) -> None:
             node = nodes.container(source)
-            node.append(nodes.Text(content))
+            if isinstance(content, str):
+                node.append(nodes.Text(content))
+            else:
+                node.extend(content)
             node.attributes["classes"].extend(["qapi-infopip", classname])
             infopips.append(node)
 
@@ -281,6 +304,18 @@ def _add_pip(source: str, content: str, classname: str) -> None:
                 "qapi-unstable",
             )
 
+        if self.options.get("ifcond", ""):
+            ifcond = self.options["ifcond"]
+            _add_pip(
+                f":ifcond: {ifcond}",
+                [
+                    nodes.emphasis("", "Availability"),
+                    nodes.Text(": "),
+                    nodes.literal(ifcond, ifcond),
+                ],
+                "qapi-ifcond",
+            )
+
         if infopips.children:
             contentnode.insert(0, infopips)
 
-- 
2.48.1


Re: [PATCH 23/57] docs/qapi-domain: add :ifcond: directive option
Posted by Markus Armbruster 3 weeks, 5 days ago
John Snow <jsnow@redhat.com> writes:

> Add a special :ifcond: option that allows us to annotate the
> definition-level conditionals.
>
> RFC: This patch renders IFCOND information in two places, because I'm
> undecided about how to style this information. One option is in the
> signature bar, and another option is in an eye-catch, like :deprecated:
> or :unstable:.
>
> A benefit to having this be a directive option is that we can put it in
> the signature bar, the QAPI index, etc. However, if we merely want it in
> the content section, a directive would work just as well,
> e.g. ".. qapi:ifcond:: CONFIG_LINUX".

You haven't implemented conditionals that aren't at definition-level.
As I said elsewhere, that's okay for now.  All I want to say here is
that implementing it might influence your preference on how to do the
definition-level conditionals.  That's fine, we can revisit this.

> (Though, having it be in the same containing box as the unstable/ifcond
> boxes might require some extra fiddling/post-processing to
> achieve. Generally, the less docutils tree muddling I have to do, the
> happier I am.)
>
> The syntax of the argument is currently undefined, but it is possible to
> parse it back down into constituent parts to avoid applying literal
> formatting to "AND" or "&&" or whichever syntax we formalize. (Or, in
> the future, applying cross-reference links to the config values for
> additional reading on some of those build options. Not for this series.)
>
> "Vote now on your phones!"

Find my vote here:

    Message-ID: <87zfhya0is.fsf@pond.sub.org>
    https://lore.kernel.org/qemu-devel/87zfhya0is.fsf@pond.sub.org/

> Signed-off-by: Harmonie Snow <harmonie@gmail.com>
> Signed-off-by: John Snow <jsnow@redhat.com>