1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
|