From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: stefanha@redhat.com, John Snow <jsnow@redhat.com>
Subject: [PULL 04/61] docs/qapi-domain: add QAPI index
Date: Tue, 11 Mar 2025 12:30:40 +0100 [thread overview]
Message-ID: <20250311113137.1277125-5-armbru@redhat.com> (raw)
In-Reply-To: <20250311113137.1277125-1-armbru@redhat.com>
From: John Snow <jsnow@redhat.com>
Use the QAPI object registry to generate a special index just for QAPI
definitions. The index can show entries both by definition type and all
together, alphabetically.
The index can be linked from anywhere in the QEMU manual by using the
reference `qapi-index`.
Signed-off-by: John Snow <jsnow@redhat.com>
Message-ID: <20250311034303.75779-7-jsnow@redhat.com>
Acked-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
docs/sphinx/qapi_domain.py | 73 ++++++++++++++++++++++++++++++++++++--
1 file changed, 70 insertions(+), 3 deletions(-)
diff --git a/docs/sphinx/qapi_domain.py b/docs/sphinx/qapi_domain.py
index f3ece42bc2..3e7718d32d 100644
--- a/docs/sphinx/qapi_domain.py
+++ b/docs/sphinx/qapi_domain.py
@@ -9,12 +9,20 @@
AbstractSet,
Any,
Dict,
+ Iterable,
+ List,
NamedTuple,
+ Optional,
Tuple,
)
-from sphinx.domains import Domain, ObjType
-from sphinx.locale import __
+from sphinx.domains import (
+ Domain,
+ Index,
+ IndexEntry,
+ ObjType,
+)
+from sphinx.locale import _, __
from sphinx.util import logging
@@ -31,6 +39,62 @@ class ObjectEntry(NamedTuple):
aliased: bool
+class QAPIIndex(Index):
+ """
+ Index subclass to provide the QAPI definition index.
+ """
+
+ # pylint: disable=too-few-public-methods
+
+ name = "index"
+ localname = _("QAPI Index")
+ shortname = _("QAPI Index")
+
+ def generate(
+ self,
+ docnames: Optional[Iterable[str]] = None,
+ ) -> Tuple[List[Tuple[str, List[IndexEntry]]], bool]:
+ assert isinstance(self.domain, QAPIDomain)
+ content: Dict[str, List[IndexEntry]] = {}
+ collapse = False
+
+ # list of all object (name, ObjectEntry) pairs, sorted by name
+ # (ignoring the module)
+ objects = sorted(
+ self.domain.objects.items(),
+ key=lambda x: x[0].split(".")[-1].lower(),
+ )
+
+ for objname, obj in objects:
+ if docnames and obj.docname not in docnames:
+ continue
+
+ # Strip the module name out:
+ objname = objname.split(".")[-1]
+
+ # Add an alphabetical entry:
+ entries = content.setdefault(objname[0].upper(), [])
+ entries.append(
+ IndexEntry(
+ objname, 0, obj.docname, obj.node_id, obj.objtype, "", ""
+ )
+ )
+
+ # Add a categorical entry:
+ category = obj.objtype.title() + "s"
+ entries = content.setdefault(category, [])
+ entries.append(
+ IndexEntry(objname, 0, obj.docname, obj.node_id, "", "", "")
+ )
+
+ # alphabetically sort categories; type names first, ABC entries last.
+ sorted_content = sorted(
+ content.items(),
+ key=lambda x: (len(x[0]) == 1, x[0]),
+ )
+ return sorted_content, collapse
+
+
class QAPIDomain(Domain):
"""QAPI language domain."""
@@ -54,7 +118,10 @@ class QAPIDomain(Domain):
"objects": {}, # fullname -> ObjectEntry
}
- indices = []
+ # Index pages to generate; each entry is an Index class.
+ indices = [
+ QAPIIndex,
+ ]
@property
def objects(self) -> Dict[str, ObjectEntry]:
--
2.48.1
next prev parent reply other threads:[~2025-03-11 11:34 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-11 11:30 [PULL 00/61] QAPI patches patches for 2025-03-11 Markus Armbruster
2025-03-11 11:30 ` [PULL 01/61] docs/sphinx: create QAPI domain extension stub Markus Armbruster
2025-03-11 11:30 ` [PULL 02/61] docs/sphinx: add compat.py module and nested_parse helper Markus Armbruster
2025-03-11 11:30 ` [PULL 03/61] docs/qapi-domain: add QAPI domain object registry Markus Armbruster
2025-03-11 11:30 ` Markus Armbruster [this message]
2025-03-11 11:30 ` [PULL 05/61] docs/qapi-domain: add resolve_any_xref() Markus Armbruster
2025-03-11 11:30 ` [PULL 06/61] docs/qapi-domain: add QAPI xref roles Markus Armbruster
2025-03-11 11:30 ` [PULL 07/61] docs/qapi-domain: add compatibility node classes Markus Armbruster
2025-03-11 11:30 ` [PULL 08/61] docs/qapi-domain: Add QAPIDescription abstract class Markus Armbruster
2025-03-11 11:30 ` [PULL 09/61] docs/qapi-domain: add qapi:module directive Markus Armbruster
2025-03-11 11:30 ` [PULL 10/61] docs/qapi-domain: add QAPIObject class Markus Armbruster
2025-03-11 11:30 ` [PULL 11/61] docs/qapi-domain: add qapi:command directive Markus Armbruster
2025-03-11 11:30 ` [PULL 12/61] docs/qapi-domain: add :since: directive option Markus Armbruster
2025-03-11 11:30 ` [PULL 13/61] docs/qapi-domain: add "Arguments:" field lists Markus Armbruster
2025-03-11 11:30 ` [PULL 14/61] docs/qapi-domain: add "Features:" " Markus Armbruster
2025-03-11 11:30 ` [PULL 15/61] docs/qapi-domain: add "Errors:" " Markus Armbruster
2025-03-11 11:30 ` [PULL 16/61] docs/qapi-domain: add "Return:" " Markus Armbruster
2025-03-11 11:30 ` [PULL 17/61] docs/qapi-domain: add qapi:enum directive Markus Armbruster
2025-03-11 11:30 ` [PULL 18/61] docs/qapi-domain: add qapi:alternate directive Markus Armbruster
2025-03-11 11:30 ` [PULL 19/61] docs/qapi-domain: add qapi:event directive Markus Armbruster
2025-03-11 11:30 ` [PULL 20/61] docs/qapi-domain: add qapi:object directive Markus Armbruster
2025-03-11 11:30 ` [PULL 21/61] docs/qapi-domain: add :deprecated: directive option Markus Armbruster
2025-03-11 11:30 ` [PULL 22/61] docs/qapi-domain: add :unstable: " Markus Armbruster
2025-03-11 11:30 ` [PULL 23/61] docs/qapi-domain: add :ifcond: " Markus Armbruster
2025-03-11 11:31 ` [PULL 24/61] docs/qapi-domain: add warnings for malformed field lists Markus Armbruster
2025-03-11 11:31 ` [PULL 25/61] docs/qapi-domain: add type cross-refs to " Markus Armbruster
2025-03-11 11:31 ` [PULL 26/61] docs/qapi-domain: add CSS styling Markus Armbruster
2025-03-11 11:31 ` [PULL 27/61] docs/qapi-domain: add XREF compatibility goop for Sphinx < 4.1 Markus Armbruster
2025-03-11 11:31 ` [PULL 28/61] docs/qapi-domain: warn when QAPI domain xrefs fail to resolve Markus Armbruster
2025-03-11 11:31 ` [PULL 29/61] docs/qapi-domain: Fix error context reporting in Sphinx 5.x and 6.x Markus Armbruster
2025-03-11 11:31 ` [PULL 30/61] qapi/parser: adjust info location for doc body section Markus Armbruster
2025-03-11 11:31 ` [PULL 31/61] qapi: clean up encoding of section kinds Markus Armbruster
2025-03-11 11:31 ` [PULL 32/61] qapi/schema: add __repr__ to QAPIDoc.Section Markus Armbruster
2025-03-11 11:31 ` [PULL 33/61] docs/qapidoc: add transmogrifier stub Markus Armbruster
2025-03-11 11:31 ` [PULL 34/61] docs/qapidoc: split old implementation into qapidoc_legacy.py Markus Armbruster
2025-03-11 11:31 ` [PULL 35/61] docs/qapidoc: Fix static typing on qapidoc.py Markus Armbruster
2025-03-11 11:31 ` [PULL 36/61] docs/qapidoc: add transmogrifier class stub Markus Armbruster
2025-03-11 11:31 ` [PULL 37/61] docs/qapidoc: add visit_module() method Markus Armbruster
2025-03-11 11:31 ` [PULL 38/61] qapi/source: allow multi-line QAPISourceInfo advancing Markus Armbruster
2025-03-11 11:31 ` [PULL 39/61] docs/qapidoc: add visit_freeform() method Markus Armbruster
2025-03-11 11:31 ` [PULL 40/61] docs/qapidoc: add preamble() method Markus Armbruster
2025-03-11 11:31 ` [PULL 41/61] docs/qapidoc: add visit_paragraph() method Markus Armbruster
2025-03-11 11:31 ` [PULL 42/61] docs/qapidoc: add visit_errors() method Markus Armbruster
2025-03-11 11:31 ` [PULL 43/61] docs/qapidoc: add format_type() method Markus Armbruster
2025-03-11 11:31 ` [PULL 44/61] docs/qapidoc: add add_field() and generate_field() helper methods Markus Armbruster
2025-03-11 11:31 ` [PULL 45/61] docs/qapidoc: add visit_feature() method Markus Armbruster
2025-03-11 11:31 ` [PULL 46/61] docs/qapidoc: prepare to record entity being transmogrified Markus Armbruster
2025-03-11 11:31 ` [PULL 47/61] docs/qapidoc: add visit_returns() method Markus Armbruster
2025-03-11 11:31 ` [PULL 48/61] docs/qapidoc: add visit_member() method Markus Armbruster
2025-03-11 11:31 ` [PULL 49/61] docs/qapidoc: add visit_sections() method Markus Armbruster
2025-03-11 11:31 ` [PULL 50/61] docs/qapidoc: add visit_entity() Markus Armbruster
2025-03-11 11:31 ` [PULL 51/61] docs/qapidoc: implement transmogrify() method Markus Armbruster
2025-03-11 11:31 ` [PULL 52/61] docs/qapidoc: process @foo into ``foo`` Markus Armbruster
2025-03-11 11:31 ` [PULL 53/61] docs/qapidoc: add intermediate output debugger Markus Armbruster
2025-03-11 11:31 ` [PULL 54/61] docs/qapidoc: Add "the members of" pointers Markus Armbruster
2025-03-11 11:31 ` [PULL 55/61] docs/qapidoc: generate entries for undocumented members Markus Armbruster
2025-03-11 11:31 ` [PULL 56/61] qapi/parser: add undocumented stub members to all_sections Markus Armbruster
2025-03-11 11:31 ` [PULL 57/61] docs: disambiguate cross-references Markus Armbruster
2025-03-11 11:31 ` [PULL 58/61] docs: enable qapidoc transmogrifier for QEMU QMP Reference Markus Armbruster
2025-03-11 11:31 ` [PULL 59/61] docs: add qapi-domain syntax documentation Markus Armbruster
2025-03-11 11:31 ` [PULL 60/61] MAINTAINERS: Add jsnow as maintainer for Sphinx documentation Markus Armbruster
2025-03-11 11:31 ` [PULL 61/61] scripts/qapi/backend: Clean up create_backend()'s failure mode Markus Armbruster
2025-03-13 7:04 ` [PULL 00/61] QAPI patches patches for 2025-03-11 Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250311113137.1277125-5-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=jsnow@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).