@@ -289,7 +289,7 @@ def visit_sections(self, ent: QAPISchemaEntity) -> None:
# Add sections *in the order they are documented*:
for section in sections:
- if section.kind == QAPIDoc.Kind.PLAIN:
+ if section.kind.name in ("INTRO", "DETAIL"):
self.visit_paragraph(section)
elif section.kind == QAPIDoc.Kind.MEMBER:
self.visit_member(section)
@@ -578,7 +578,7 @@ def _nodes_for_sections(self, doc):
# Hide TODO: sections
continue
- if section.kind == QAPIDoc.Kind.PLAIN:
+ if section.kind.name in ("INTRO", "DETAIL"):
# Sphinx cannot handle sectionless titles;
# Instead, just append the results to the prior section.
container = nodes.container()
@@ -499,7 +499,7 @@ def get_doc(self) -> 'QAPIDoc':
doc = QAPIDoc(info, symbol)
self.accept(False)
line = self.get_doc_line()
- no_more_args = False
+ have_tagged = False
while line is not None:
# Blank lines
@@ -528,10 +528,10 @@ def get_doc(self) -> 'QAPIDoc':
if not doc.features:
raise QAPIParseError(
self, 'feature descriptions expected')
- no_more_args = True
+ have_tagged = True
elif match := self._match_at_name_colon(line):
# description
- if no_more_args:
+ if have_tagged:
raise QAPIParseError(
self,
"description of '@%s:' follows a section"
@@ -543,7 +543,7 @@ def get_doc(self) -> 'QAPIDoc':
if text:
doc.append_line(text)
line = self.get_doc_indented(doc)
- no_more_args = True
+ have_tagged = True
elif match := re.match(
r'(Returns|Errors|Since|Notes?|Examples?|TODO)'
r'(?!::): *',
@@ -584,14 +584,20 @@ def get_doc(self) -> 'QAPIDoc':
if text:
doc.append_line(text)
line = self.get_doc_indented(doc)
- no_more_args = True
+ have_tagged = True
elif line.startswith('='):
raise QAPIParseError(
self,
"unexpected '=' markup in definition documentation")
else:
# plain paragraph(s)
- doc.ensure_untagged_section(self.info)
+ if have_tagged:
+ no_more_tags = True
+
+ # Paragraphs before tagged sections are "intro" paragraphs.
+ # Any appearing after are "detail" paragraphs.
+ intro = not have_tagged
+ doc.ensure_untagged_section(self.info, intro)
doc.append_line(line)
line = self.get_doc_paragraph(doc)
else:
@@ -640,21 +646,22 @@ class QAPIDoc:
"""
class Kind(enum.Enum):
- PLAIN = 0
+ INTRO = 0
MEMBER = 1
FEATURE = 2
RETURNS = 3
ERRORS = 4
SINCE = 5
TODO = 6
+ DETAIL = 7
@staticmethod
def from_string(kind: str) -> 'QAPIDoc.Kind':
return QAPIDoc.Kind[kind.upper()]
def text_required(self) -> bool:
- # Only "plain" sections can be empty
- return self.value not in (0,)
+ # Only Intro/Detail sections can be empty
+ return self.value not in (0, 7)
def __str__(self) -> str:
return self.name.title()
@@ -700,7 +707,7 @@ def __init__(self, info: QAPISourceInfo, symbol: Optional[str] = None):
self.symbol: Optional[str] = symbol
# the sections in textual order
self.all_sections: List[QAPIDoc.Section] = [
- QAPIDoc.Section(info, QAPIDoc.Kind.PLAIN)
+ QAPIDoc.Section(info, QAPIDoc.Kind.INTRO)
]
# the body section
self.body: Optional[QAPIDoc.Section] = self.all_sections[0]
@@ -725,8 +732,9 @@ def end(self) -> None:
def ensure_untagged_section(
self,
info: QAPISourceInfo,
+ intro: bool = True,
) -> None:
- kind = QAPIDoc.Kind.PLAIN
+ kind = QAPIDoc.Kind.INTRO if intro else QAPIDoc.Kind.DETAIL
if self.all_sections and self.all_sections[-1].kind == kind:
# extend current section
@@ -110,7 +110,7 @@ The _one_ {and only}, description on the same line
Also _one_ {and only}
feature=enum-member-feat
a member feature
- section=Plain
+ section=Detail
@two is undocumented
doc symbol=Base
body=
@@ -168,7 +168,7 @@ description starts on the same line
a feature
feature=cmd-feat2
another feature
- section=Plain
+ section=Detail
.. note:: @arg3 is undocumented
section=Returns
@Object
@@ -176,7 +176,7 @@ another feature
some
section=Todo
frobnicate
- section=Plain
+ section=Detail
.. admonition:: Notes
- Lorem ipsum dolor sit amet
@@ -209,7 +209,7 @@ If you're bored enough to read this, go see a video of boxed cats
a feature
feature=cmd-feat2
another feature
- section=Plain
+ section=Detail
.. qmp-example::
-> "this example"
This patch begins distinguishing "Plain" sections as being either "Intro" or "Details" sections for the purpose of knowing when and where to inline those sections. Signed-off-by: John Snow <jsnow@redhat.com> --- docs/sphinx/qapidoc.py | 4 ++-- scripts/qapi/parser.py | 30 +++++++++++++++++++----------- tests/qapi-schema/doc-good.out | 8 ++++---- 3 files changed, 25 insertions(+), 17 deletions(-)