diff options
Diffstat (limited to 'common/sphinxcontrib/bibtex/roles.py')
-rw-r--r-- | common/sphinxcontrib/bibtex/roles.py | 43 |
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 |