summaryrefslogtreecommitdiffstats
path: root/common/sphinxcontrib/bibtex/roles.py
diff options
context:
space:
mode:
Diffstat (limited to 'common/sphinxcontrib/bibtex/roles.py')
-rw-r--r--common/sphinxcontrib/bibtex/roles.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/common/sphinxcontrib/bibtex/roles.py b/common/sphinxcontrib/bibtex/roles.py
new file mode 100644
index 0000000..bbbd1f0
--- /dev/null
+++ b/common/sphinxcontrib/bibtex/roles.py
@@ -0,0 +1,43 @@
+"""
+ New Doctree Roles
+ ~~~~~~~~~~~~~~~~~
+
+ .. autoclass:: CiteRole
+ :show-inheritance:
+
+ .. automethod:: result_nodes
+"""
+
+from pybtex.plugin import find_plugin
+import pybtex.database
+from sphinx.roles import XRefRole # for :cite:
+
+
+class CiteRole(XRefRole):
+
+ """Class for processing the :rst:role:`cite` role."""
+ backend = find_plugin('pybtex.backends', 'docutils')()
+
+ def result_nodes(self, document, env, node, is_ref):
+ """Transform reference node into a citation reference,
+ and note that the reference was cited.
+ """
+ keys = node['reftarget'].split(',')
+ # Note that at this point, usually, env.bibtex_cache.bibfiles
+ # is still empty because the bibliography directive may not
+ # have been processed yet, so we cannot get the actual entry.
+ # Instead, we simply fake an entry with the desired key, and
+ # fix the label at doctree-resolved time. This happens in
+ # process_citation_references.
+ refnodes = [
+ self.backend.citation_reference(_fake_entry(key), document)
+ for key in keys]
+ for key in keys:
+ env.bibtex_cache.add_cited(key, env.docname)
+ return refnodes, []
+
+
+def _fake_entry(key):
+ entry = pybtex.database.Entry(type_="")
+ entry.key = key
+ return entry