summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshimizukawa <shimizukawa@gmail.com>2012-12-05 20:52:19 +0900
committershimizukawa <shimizukawa@gmail.com>2012-12-05 20:52:19 +0900
commit407ce391fd453c901eb3fa19f7b0f621b526ea55 (patch)
treedcfaf832f98d4371c12c37271e999678bf2ef04b
parent62aedd88001d4c7d2806f86cfee9358fe3808bea (diff)
downloadsphinx-407ce391fd453c901eb3fa19f7b0f621b526ea55.tar.gz
fix: rescue extra named-reference that appeared in same translation message.
-rw-r--r--sphinx/environment.py17
-rw-r--r--tests/root/i18n/refs_inconsistency.po3
-rw-r--r--tests/root/i18n/refs_inconsistency.txt1
-rw-r--r--tests/test_intl.py10
4 files changed, 25 insertions, 6 deletions
diff --git a/sphinx/environment.py b/sphinx/environment.py
index 2c28cf97..4a4ffa72 100644
--- a/sphinx/environment.py
+++ b/sphinx/environment.py
@@ -251,12 +251,25 @@ class Locale(Transform):
and 'refname' in node
old_refs = node.traverse(is_refnamed_ref)
new_refs = patch.traverse(is_refnamed_ref)
+ applied_refname_map = {}
if len(old_refs) != len(new_refs):
env.warn_node('The number of reference are inconsistent '
'in both the translated form and the '
'untranslated form. skip translation.', node)
- for old, new in zip(old_refs, new_refs):
- new['refname'] = old['refname']
+ for new in new_refs:
+ if new['refname'] in applied_refname_map:
+ # 2nd appearance of the reference
+ new['refname'] = applied_refname_map[new['refname']]
+ elif old_refs:
+ # 1st appearance of the reference in old_refs
+ old = old_refs.pop(0)
+ refname = old['refname']
+ new['refname'] = refname
+ applied_refname_map[new['refname']] = refname
+ else:
+ # the reference is not found in old_refs
+ applied_refname_map[new['refname']] = new['refname']
+
self.document.note_refname(new)
# update leaves
diff --git a/tests/root/i18n/refs_inconsistency.po b/tests/root/i18n/refs_inconsistency.po
index 947190c7..9cab687f 100644
--- a/tests/root/i18n/refs_inconsistency.po
+++ b/tests/root/i18n/refs_inconsistency.po
@@ -25,6 +25,9 @@ msgstr "FOR FOOTNOTE [ref2]_."
msgid "for reference_."
msgstr "reference_ FOR reference_."
+msgid "normal text."
+msgstr "ORPHAN REFERENCE: `I18N WITH REFS INCONSISTENCY`_."
+
msgid "This is a auto numbered footnote."
msgstr "THIS IS A AUTO NUMBERED FOOTNOTE."
diff --git a/tests/root/i18n/refs_inconsistency.txt b/tests/root/i18n/refs_inconsistency.txt
index 24bd5592..c65c5b45 100644
--- a/tests/root/i18n/refs_inconsistency.txt
+++ b/tests/root/i18n/refs_inconsistency.txt
@@ -5,6 +5,7 @@ i18n with refs inconsistency
* [100]_ for [#]_ footnote [ref2]_.
* for reference_.
+* normal text.
.. [#] This is a auto numbered footnote.
.. [ref2] This is a named footnote.
diff --git a/tests/test_intl.py b/tests/test_intl.py
index 6d084d13..c2c4cb2a 100644
--- a/tests/test_intl.py
+++ b/tests/test_intl.py
@@ -113,6 +113,7 @@ def test_i18n_warn_for_number_of_references_inconsistency(app):
u"\n****************************\n"
u"\n* FOR FOOTNOTE [ref2].\n"
u"\n* reference FOR reference.\n"
+ u"\n* ORPHAN REFERENCE: I18N WITH REFS INCONSISTENCY.\n"
u"\n[1] THIS IS A AUTO NUMBERED FOOTNOTE.\n"
u"\n[ref2] THIS IS A NAMED FOOTNOTE.\n"
u"\n[100] THIS IS A NUMBERED FOOTNOTE.\n")
@@ -120,7 +121,7 @@ def test_i18n_warn_for_number_of_references_inconsistency(app):
warnings = warnfile.getvalue().replace(os.sep, '/')
expected_warning_expr = "i18n/refs_inconsistency.txt:\d+: WARNING: The number of reference are inconsistent in both the translated form and the untranslated form. skip translation."
- assert len(re.findall(expected_warning_expr, warnings)) == 2
+ assert len(re.findall(expected_warning_expr, warnings)) == 3
@with_app(buildername='html', cleanenv=True,
@@ -131,11 +132,12 @@ def test_i18n_link_to_undefined_reference(app):
result = (app.outdir / 'i18n' / 'refs_inconsistency.html').text(encoding='utf-8')
expected_expr = """<a class="reference external" href="http://www.example.com">reference</a>"""
- assert len(re.findall(expected_expr, result)) == 1
+ assert len(re.findall(expected_expr, result)) == 2
- # the 2nd 'reference_' is to be internal-link instead of external-link.
- # TODO: Can we re-use the same name named-reference?
expected_expr = """<a class="reference internal" href="#reference">reference</a>"""
+ assert len(re.findall(expected_expr, result)) == 0
+
+ expected_expr = """<a class="reference internal" href="#i18n-with-refs-inconsistency">I18N WITH REFS INCONSISTENCY</a>"""
assert len(re.findall(expected_expr, result)) == 1