Merge pull request #5701 from tk0miya/refactor_metadata_collector

Refactor metadata collector
This commit is contained in:
Takeshi KOMIYA 2018-12-02 11:29:11 +09:00 committed by GitHub
commit 55a587ad80
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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):