diff --git a/sphinx/environment/collectors/metadata.py b/sphinx/environment/collectors/metadata.py index fdc3627bc..c55b8458e 100644 --- a/sphinx/environment/collectors/metadata.py +++ b/sphinx/environment/collectors/metadata.py @@ -37,44 +37,37 @@ class MetadataCollector(EnvironmentCollector): env.metadata[docname] = other.metadata[docname] def process_doc(self, app, doctree): - # type: (Sphinx, nodes.Node) -> None + # type: (Sphinx, nodes.document) -> None """Process the docinfo part of the doctree as metadata. Keep processing minimal -- just return what docutils says. """ - md = app.env.metadata[app.env.docname] - try: - docinfo = doctree[0] - except IndexError: - # probably an empty document - return - if docinfo.__class__ is not nodes.docinfo: - # nothing to see here - return - for node in docinfo: - # nodes are multiply inherited... - if isinstance(node, nodes.authors): - authors = cast(List[nodes.author], node) - md['authors'] = [author.astext() for author in authors] - elif isinstance(node, nodes.field): - assert len(node) == 2 - field_name = cast(nodes.field_name, node[0]) - field_body = cast(nodes.field_body, node[1]) - md[field_name.astext()] = field_body.astext() - else: - # other children must be TextElement - # see: http://docutils.sourceforge.net/docs/ref/doctree.html#bibliographic-elements # NOQA - element = cast(nodes.TextElement, node) - md[element.__class__.__name__] = element.astext() - for name, value in md.items(): - if name in ('tocdepth',): - try: - value = int(value) - except ValueError: - value = 0 - md[name] = value + if len(doctree) > 0 and isinstance(doctree[0], nodes.docinfo): + md = app.env.metadata[app.env.docname] + for node in doctree[0]: + # nodes are multiply inherited... + if isinstance(node, nodes.authors): + authors = cast(List[nodes.author], node) + md['authors'] = [author.astext() for author in authors] + elif isinstance(node, nodes.field): + assert len(node) == 2 + field_name = cast(nodes.field_name, node[0]) + field_body = cast(nodes.field_body, node[1]) + md[field_name.astext()] = field_body.astext() + elif isinstance(node, nodes.TextElement): + # other children must be TextElement + # see: http://docutils.sourceforge.net/docs/ref/doctree.html#bibliographic-elements # NOQA + md[node.__class__.__name__] = node.astext() - del doctree[0] + for name, value in md.items(): + if name in ('tocdepth',): + try: + value = int(value) + except ValueError: + value = 0 + md[name] = value + + doctree.pop(0) def setup(app):