summaryrefslogtreecommitdiffstats
path: root/common/rtemsext.py
blob: 85b989e4bf4d963c3263a19feb55ab72eb89fd65 (plain) (blame)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from docutils import nodes
import sphinx.domains.std

# Borrowed from: http://stackoverflow.com/questions/13848328/sphinx-references-to-other-sections-containing-section-number-and-section-title
class CustomStandardDomain(sphinx.domains.std.StandardDomain):

	def __init__(self, env):
		env.settings['footnote_references'] = 'superscript'
		sphinx.domains.std.StandardDomain.__init__(self, env)

	def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
		res = super(CustomStandardDomain, self).resolve_xref(env, fromdocname, builder, typ, target, node, contnode)
	
		if res is None:
			return res
		
		if typ == 'ref' and not node['refexplicit']:
			docname, labelid, sectname = self.data['labels'].get(target, ('','',''))
			res['refdocname'] = docname
		
		return res

def doctree_resolved(app, doctree, docname):
	secnums = app.builder.env.toc_secnumbers
	for node in doctree.traverse(nodes.reference):
		if 'refdocname' in node:
			refdocname = node['refdocname']
			if refdocname in secnums:
				secnum = secnums[refdocname]
				emphnode = node.children[0]
				textnode = emphnode.children[0]

				toclist = app.builder.env.tocs[refdocname]
				anchorname = None
				for refnode in toclist.traverse(nodes.reference):
					if refnode.astext() == textnode.astext():
						anchorname = refnode['anchorname']
				if anchorname is None:
					continue
				sec_number = secnum[anchorname]
				chapter = sec_number[0]
				section = None

				if len(sec_number) > 1:
					section = ".".join(map(str, sec_number[1:]))

				if section:
					node.replace(emphnode, nodes.Text("Chapter %s Section %s - %s" % (chapter, section, textnode)))
				else:
					node.replace(emphnode, nodes.Text("Chapter %s - %s" % (chapter, textnode)))

def setup(app):
	app.override_domain(CustomStandardDomain)
	app.connect('doctree-resolved', doctree_resolved)

	return {'version': "1.0", 'parallel_read_safe': True}