This repository provides User Manual for setting up a Docker environment tailored for testing DGTD code.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.9 KiB

8 months ago
"""
Domain for footnote citations.
.. autoclass:: BibtexFootDomain
:members:
"""
from typing import TYPE_CHECKING, Dict, List, Tuple
import docutils.nodes
import docutils.utils
import sphinx.util
from sphinx.domains import Domain, ObjType
from sphinx.locale import _
import sphinxcontrib.bibtex.plugin
from .domain import parse_header
from .foot_roles import FootCiteRole
from .style.referencing import BaseReferenceStyle
if TYPE_CHECKING:
from sphinx.addnodes import pending_xref
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
logger = sphinx.util.logging.getLogger(__name__)
class BibtexFootDomain(Domain):
"""Sphinx domain for footnote citations."""
name = "footcite"
label = "BibTeX Footnote Citations"
data_version = 0
initial_data = dict(
bibliography_header=docutils.nodes.container(),
)
reference_style: BaseReferenceStyle
@property
def bibliography_header(self) -> docutils.nodes.Element:
return self.data["bibliography_header"]
def __init__(self, env: "BuildEnvironment"):
# set up referencing style
style = sphinxcontrib.bibtex.plugin.find_plugin(
"sphinxcontrib.bibtex.style.referencing",
env.app.config.bibtex_foot_reference_style,
)
self.reference_style = style()
# set up object types and roles for referencing style
role_names = self.reference_style.role_names()
self.object_types = dict(
citation=ObjType(_("citation"), *role_names, searchprio=-1),
)
self.roles = dict((name, FootCiteRole()) for name in role_names)
# initialize the domain
super().__init__(env)
# parse bibliography header
header = getattr(env.app.config, "bibtex_footbibliography_header")
if header:
self.data["bibliography_header"] = docutils.nodes.container()
self.data["bibliography_header"] += parse_header(
header, "foot_bibliography_header"
)
def merge_domaindata(self, docnames: List[str], otherdata: Dict) -> None:
"""Merge in data regarding *docnames* from domain data
inventory *otherdata*.
As there is no document specific data for this domain, this function
does nothing.
"""
pass
def resolve_any_xref(
self,
env: "BuildEnvironment",
fromdocname: str,
builder: "Builder",
target: str,
node: "pending_xref",
contnode: docutils.nodes.Element,
) -> List[Tuple[str, docutils.nodes.Element]]:
"""Resolve the pending reference *node* with the given *target*,
where the reference comes from an "any" role.
Since citation references are resolved to regular citations,
and not to footnote citations,
this implementation simply returns an empty list.
"""
return []