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.

58 lines
1.6 KiB

8 months ago
"""
.. autoclass:: CitationRef
:members:
.. autoclass:: CiteRole
:show-inheritance:
.. automethod:: result_nodes
"""
from typing import TYPE_CHECKING, List, NamedTuple, cast
import docutils.nodes
from pybtex.plugin import find_plugin
from sphinx.roles import XRefRole
from .citation_target import CitationTarget, parse_citation_targets
if TYPE_CHECKING:
from .domain import BibtexDomain
class CitationRef(NamedTuple):
"""Information about a citation reference."""
citation_ref_id: str #: Unique id of this citation reference.
docname: str #: Document name.
line: int #: Line number.
targets: List[CitationTarget] #: Citation targets (key, pre, post).
class CiteRole(XRefRole):
"""Class for processing the :rst:role:`cite` role."""
backend = find_plugin("pybtex.backends", "docutils")()
innernodeclass = docutils.nodes.inline
def result_nodes(self, document, env, node, is_ref):
"""Associate the pending_xref with the cite domain,
and note the cited citation keys.
"""
if not node.get("refdomain"):
assert node["reftype"] == "cite"
node["refdomain"] = "cite"
node["reftype"] = "p"
document.note_explicit_target(node, node) # for backrefs
domain = cast("BibtexDomain", env.get_domain("cite"))
domain.citation_refs.append(
CitationRef(
citation_ref_id=node["ids"][0],
docname=env.docname,
line=document.line,
targets=list(parse_citation_targets(self.target)),
)
)
return [node], []