Skip to content

Commit 0970cdb

Browse files
committed
sphinxext: use real RST references for bibliographies, and add suitable links for Latex
1 parent 3ecee46 commit 0970cdb

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

Diff for: docscrape_sphinx.py

+13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import re, inspect, textwrap, pydoc
2+
import sphinx
23
from docscrape import NumpyDocString, FunctionDoc, ClassDoc
34

45
class SphinxDocString(NumpyDocString):
@@ -90,6 +91,18 @@ def _str_references(self):
9091
self['References'] = [self['References']]
9192
out.extend(self['References'])
9293
out += ['']
94+
# Latex collects all references to a separate bibliography,
95+
# so we need to insert links to it
96+
if sphinx.__version__ >= 0.6:
97+
out += ['.. only:: latex','']
98+
else:
99+
out += ['.. latexonly::','']
100+
items = []
101+
for line in self['References']:
102+
m = re.match(r'.. \[([a-z0-9._-]+)\]', line, re.I)
103+
if m:
104+
items.append(m.group(1))
105+
out += [' ' + ", ".join(["[%s]_" % item for item in items]), '']
93106
return out
94107

95108
def __str__(self, indent=0, func_role="obj"):

Diff for: numpydoc.py

+17-16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
def mangle_docstrings(app, what, name, obj, options, lines,
2424
reference_offset=[0]):
25+
2526
if what == 'module':
2627
# Strip top title
2728
title_re = re.compile(r'^\s*[#*=]{4,}\n[a-z0-9 -]+\n[#*=]{4,}\s*',
@@ -43,25 +44,25 @@ def mangle_docstrings(app, what, name, obj, options, lines,
4344

4445
# replace reference numbers so that there are no duplicates
4546
references = []
46-
for l in lines:
47-
l = l.strip()
48-
if l.startswith('.. ['):
49-
try:
50-
references.append(int(l[len('.. ['):l.index(']')]))
51-
except ValueError:
52-
print "WARNING: invalid reference in %s docstring" % name
53-
54-
# Start renaming from the biggest number, otherwise we may
55-
# overwrite references.
56-
references.sort()
47+
for line in lines:
48+
line = line.strip()
49+
m = re.match(r'^.. \[([a-z0-9_.-])\]', line, re.I)
50+
if m:
51+
references.append(m.group(1))
52+
53+
# start renaming from the longest string, to avoid overwriting parts
54+
references.sort(key=lambda x: -len(x))
5755
if references:
5856
for i, line in enumerate(lines):
5957
for r in references:
60-
new_r = reference_offset[0] + r
61-
lines[i] = lines[i].replace('[%d]_' % r,
62-
'[%d]_' % new_r)
63-
lines[i] = lines[i].replace('.. [%d]' % r,
64-
'.. [%d]' % new_r)
58+
if re.match(r'^\d+$', r):
59+
new_r = "R%d" % (reference_offset[0] + int(r))
60+
else:
61+
new_r = "%s%d" % (r, reference_offset[0])
62+
lines[i] = lines[i].replace('[%s]_' % r,
63+
'[%s]_' % new_r)
64+
lines[i] = lines[i].replace('.. [%s]' % r,
65+
'.. [%s]' % new_r)
6566

6667
reference_offset[0] += len(references)
6768

0 commit comments

Comments
 (0)