mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Merge pull request #5701 from tk0miya/refactor_metadata_collector
Refactor metadata collector
This commit is contained in:
commit
55a587ad80
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user