From 8118f979dc09f1ed027810dbb5abb8a982d7cf23 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 11 Oct 2021 01:23:29 +0900 Subject: [PATCH] Support docutils-0.18: allow PreBibliographic nodes before docinfo Since 0.18, `meta` directive inserts meta node into the top of the document. It confuses MetadataCollector. This allows doctree contains PreBibliographic nodes just before docinfo node. --- sphinx/environment/collectors/metadata.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sphinx/environment/collectors/metadata.py b/sphinx/environment/collectors/metadata.py index c684e4a4fd8..c3a0aa2f48b 100644 --- a/sphinx/environment/collectors/metadata.py +++ b/sphinx/environment/collectors/metadata.py @@ -33,9 +33,12 @@ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None: Keep processing minimal -- just return what docutils says. """ - if len(doctree) > 0 and isinstance(doctree[0], nodes.docinfo): + index = doctree.first_child_not_matching_class(nodes.PreBibliographic) + if index is None: + return + elif isinstance(doctree[index], nodes.docinfo): md = app.env.metadata[app.env.docname] - for node in doctree[0]: + for node in doctree[index]: # type: ignore # nodes are multiply inherited... if isinstance(node, nodes.authors): authors = cast(List[nodes.author], node) @@ -58,7 +61,7 @@ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None: value = 0 md[name] = value - doctree.pop(0) + doctree.pop(index) def setup(app: Sphinx) -> Dict[str, Any]: