Source code for sphinxcontrib.bibtex.foot_transforms

"""
    .. autoclass:: FootBibliographyTransform
        :show-inheritance:

        .. autoattribute:: default_priority
        .. automethod:: apply
"""

from typing import cast

import docutils.nodes
from pybtex.plugin import find_plugin
from sphinx.transforms import SphinxTransform
from sphinx.util.logging import getLogger

from .domain import BibtexDomain
from .transforms import node_text_transform, transform_url_command
from .foot_nodes import footbibliography
from .bibfile import get_bibliography_entry


logger = getLogger(__name__)


[docs]class FootBibliographyTransform(SphinxTransform): """A docutils transform to generate footnotes for bibliography nodes. """ # transform must be applied before references are resolved default_priority = 10 """Priority of the transform. See https://docutils.sourceforge.io/docs/ref/transforms.html """
[docs] def apply(self): """Transform each :class:`~sphinxcontrib.bibtex.foot_nodes.footbibliography` node into a list of citations. """ for bibnode in self.document.traverse(footbibliography): domain = cast(BibtexDomain, self.env.get_domain('cite')) id_ = bibnode['ids'][0] keys = self.env.temp_data.get( "bibtex_foot_citation_refs", {}).get(id_, {}) entries = [ get_bibliography_entry(domain.bibfiles, key) for key in keys] assert None not in entries # locate and instantiate style and backend plugins style = find_plugin( 'pybtex.style.formatting', self.config.bibtex_default_style)() backend = find_plugin('pybtex.backends', 'docutils')() # create footnote nodes for all references footnotes = docutils.nodes.paragraph() for entry in style.format_entries(entries): footnote = backend.footnote(entry, self.document) node_text_transform(footnote, transform_url_command) footnotes += footnote if self.env.bibtex_footbibliography_header is not None: footnotes = [ self.env.bibtex_footbibliography_header.deepcopy(), footnotes] bibnode.replace_self(footnotes)