1 | from docutils import nodes |
---|
2 | import sphinx.domains.std |
---|
3 | |
---|
4 | # Borrowed from: http://stackoverflow.com/questions/13848328/sphinx-references-to-other-sections-containing-section-number-and-section-title |
---|
5 | class CustomStandardDomain(sphinx.domains.std.StandardDomain): |
---|
6 | |
---|
7 | def __init__(self, env): |
---|
8 | env.settings['footnote_references'] = 'superscript' |
---|
9 | sphinx.domains.std.StandardDomain.__init__(self, env) |
---|
10 | |
---|
11 | def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): |
---|
12 | res = super(CustomStandardDomain, self).resolve_xref(env, fromdocname, builder, typ, target, node, contnode) |
---|
13 | |
---|
14 | if res is None: |
---|
15 | return res |
---|
16 | |
---|
17 | if typ == 'ref' and not node['refexplicit']: |
---|
18 | docname, labelid, sectname = self.data['labels'].get(target, ('','','')) |
---|
19 | res['refdocname'] = docname |
---|
20 | |
---|
21 | return res |
---|
22 | |
---|
23 | def doctree_resolved(app, doctree, docname): |
---|
24 | secnums = app.builder.env.toc_secnumbers |
---|
25 | for node in doctree.traverse(nodes.reference): |
---|
26 | if 'refdocname' in node: |
---|
27 | refdocname = node['refdocname'] |
---|
28 | if refdocname in secnums: |
---|
29 | secnum = secnums[refdocname] |
---|
30 | emphnode = node.children[0] |
---|
31 | textnode = emphnode.children[0] |
---|
32 | |
---|
33 | toclist = app.builder.env.tocs[refdocname] |
---|
34 | anchorname = None |
---|
35 | for refnode in toclist.traverse(nodes.reference): |
---|
36 | if refnode.astext() == textnode.astext(): |
---|
37 | anchorname = refnode['anchorname'] |
---|
38 | if anchorname is None: |
---|
39 | continue |
---|
40 | sec_number = secnum[anchorname] |
---|
41 | chapter = sec_number[0] |
---|
42 | section = None |
---|
43 | |
---|
44 | if len(sec_number) > 1: |
---|
45 | section = ".".join(map(str, sec_number[1:])) |
---|
46 | |
---|
47 | if section: |
---|
48 | node.replace(emphnode, nodes.Text("Chapter %s Section %s - %s" % (chapter, section, textnode))) |
---|
49 | else: |
---|
50 | node.replace(emphnode, nodes.Text("Chapter %s - %s" % (chapter, textnode))) |
---|
51 | |
---|
52 | def setup(app): |
---|
53 | app.override_domain(CustomStandardDomain) |
---|
54 | app.connect('doctree-resolved', doctree_resolved) |
---|
55 | |
---|
56 | return {'version': "1.0", 'parallel_read_safe': True} |
---|
57 | |
---|