From e2f6842db2fbc74517119e5de06133936d16f199 Mon Sep 17 00:00:00 2001 From: Sergio Callegari Date: Wed, 2 Mar 2016 13:09:00 +0100 Subject: [PATCH 1/4] Factor out function to rename references * This makes the functionality easier to replace from other extensions, should this be needed --- numpydoc/numpydoc.py | 54 ++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/numpydoc/numpydoc.py b/numpydoc/numpydoc.py index b9804ad2..9fc261b2 100644 --- a/numpydoc/numpydoc.py +++ b/numpydoc/numpydoc.py @@ -37,8 +37,34 @@ sixu = lambda s: unicode(s, 'unicode_escape') -def mangle_docstrings(app, what, name, obj, options, lines, +def rename_references(app, what, name, obj, options, lines, reference_offset=[0]): + # replace reference numbers so that there are no duplicates + references = [] + for line in lines: + line = line.strip() + m = re.match(sixu('^.. \\[([a-z0-9_.-])\\]'), line, re.I) + if m: + references.append(m.group(1)) + + # start renaming from the longest string, to avoid overwriting parts + references.sort(key=lambda x: -len(x)) + if references: + for i, line in enumerate(lines): + for r in references: + if re.match(sixu('^\\d+$'), r): + new_r = sixu("R%d") % (reference_offset[0] + int(r)) + else: + new_r = sixu("%s%d") % (r, reference_offset[0]) + lines[i] = lines[i].replace(sixu('[%s]_') % r, + sixu('[%s]_') % new_r) + lines[i] = lines[i].replace(sixu('.. [%s]') % r, + sixu('.. [%s]') % new_r) + + reference_offset[0] += len(references) + + +def mangle_docstrings(app, what, name, obj, options, lines): cfg = {'use_plots': app.config.numpydoc_use_plots, 'show_class_members': app.config.numpydoc_show_class_members, @@ -70,29 +96,9 @@ def mangle_docstrings(app, what, name, obj, options, lines, lines += [sixu(' %s') % x for x in (app.config.numpydoc_edit_link % v).split("\n")] - # replace reference numbers so that there are no duplicates - references = [] - for line in lines: - line = line.strip() - m = re.match(sixu('^.. \\[([a-z0-9_.-])\\]'), line, re.I) - if m: - references.append(m.group(1)) - - # start renaming from the longest string, to avoid overwriting parts - references.sort(key=lambda x: -len(x)) - if references: - for i, line in enumerate(lines): - for r in references: - if re.match(sixu('^\\d+$'), r): - new_r = sixu("R%d") % (reference_offset[0] + int(r)) - else: - new_r = sixu("%s%d") % (r, reference_offset[0]) - lines[i] = lines[i].replace(sixu('[%s]_') % r, - sixu('[%s]_') % new_r) - lines[i] = lines[i].replace(sixu('.. [%s]') % r, - sixu('.. [%s]') % new_r) - - reference_offset[0] += len(references) + # call function to replace reference numbers so that there are no + # duplicates + rename_references(app, what, name, obj, options, lines) def mangle_signature(app, what, name, obj, options, sig, retann): From 20decf6e7243da4055645e345105fb0e82e0a429 Mon Sep 17 00:00:00 2001 From: Sergio Callegari Date: Wed, 2 Mar 2016 13:13:40 +0100 Subject: [PATCH 2/4] Avoid sorting references by length while renaming --- numpydoc/numpydoc.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/numpydoc/numpydoc.py b/numpydoc/numpydoc.py index 9fc261b2..7dcfa6f3 100644 --- a/numpydoc/numpydoc.py +++ b/numpydoc/numpydoc.py @@ -47,8 +47,6 @@ def rename_references(app, what, name, obj, options, lines, if m: references.append(m.group(1)) - # start renaming from the longest string, to avoid overwriting parts - references.sort(key=lambda x: -len(x)) if references: for i, line in enumerate(lines): for r in references: From e5773419d6bc28f4abf5f78683ecb16bfe4a22b4 Mon Sep 17 00:00:00 2001 From: Sergio Callegari Date: Wed, 2 Mar 2016 13:25:21 +0100 Subject: [PATCH 3/4] Make citation pattern configurable --- numpydoc/numpydoc.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/numpydoc/numpydoc.py b/numpydoc/numpydoc.py index 7dcfa6f3..abbcc8d5 100644 --- a/numpydoc/numpydoc.py +++ b/numpydoc/numpydoc.py @@ -43,7 +43,8 @@ def rename_references(app, what, name, obj, options, lines, references = [] for line in lines: line = line.strip() - m = re.match(sixu('^.. \\[([a-z0-9_.-])\\]'), line, re.I) + m = re.match(sixu('^.. \\[(%s)\\]') % app.config.numpydoc_citation_re, + line, re.I) if m: references.append(m.group(1)) @@ -133,6 +134,7 @@ def setup(app, get_doc_object_=get_doc_object): app.add_config_value('numpydoc_show_class_members', True, True) app.add_config_value('numpydoc_show_inherited_class_members', True, True) app.add_config_value('numpydoc_class_members_toctree', True, True) + app.add_config_value('numpydoc_citation_re', '[a-z0-9_.-]', True) # Extra mangling domains app.add_domain(NumpyPythonDomain) From 8ee66bd1d433bdb4efa1ff009381530afe14fcc2 Mon Sep 17 00:00:00 2001 From: Sergio Callegari Date: Wed, 2 Mar 2016 13:25:50 +0100 Subject: [PATCH 4/4] Make default citation pattern more general --- numpydoc/numpydoc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numpydoc/numpydoc.py b/numpydoc/numpydoc.py index abbcc8d5..3398c678 100644 --- a/numpydoc/numpydoc.py +++ b/numpydoc/numpydoc.py @@ -134,7 +134,7 @@ def setup(app, get_doc_object_=get_doc_object): app.add_config_value('numpydoc_show_class_members', True, True) app.add_config_value('numpydoc_show_inherited_class_members', True, True) app.add_config_value('numpydoc_class_members_toctree', True, True) - app.add_config_value('numpydoc_citation_re', '[a-z0-9_.-]', True) + app.add_config_value('numpydoc_citation_re', '[a-z0-9_.-]+', True) # Extra mangling domains app.add_domain(NumpyPythonDomain)