Skip to content

Commit

Permalink
Fix sphinx-doc#3002: i18n: same node_id is assigned to multiple footn…
Browse files Browse the repository at this point in the history
…ote_references
  • Loading branch information
tk0miya committed Oct 30, 2018
1 parent a4f1b0e commit db48596
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 11 deletions.
1 change: 1 addition & 0 deletions CHANGES
Expand Up @@ -32,6 +32,7 @@ Bugs fixed
* #5419: incompatible math_block node has been generated
* #5548: Fix ensuredir() in case of pre-existing file
* #5549: graphviz Correctly deal with non-existing static dir
* #3002: i18n: same node_id is assigned to multiple footnote_references

Testing
--------
Expand Down
12 changes: 6 additions & 6 deletions sphinx/transforms/i18n.py
Expand Up @@ -373,11 +373,11 @@ def is_refnamed_footnote_ref(node):
.format(old_foot_ref_rawsources, new_foot_ref_rawsources),
location=node)
for old in old_foot_refs:
refname_ids_map[old["refname"]] = old["ids"]
refname_ids_map.setdefault(old["refname"], []).append(old["ids"])
for new in new_foot_refs:
refname = new["refname"]
if refname in refname_ids_map:
new["ids"] = refname_ids_map[refname]
if refname_ids_map.get(refname):
new["ids"] = refname_ids_map[refname].pop(0)

# citation should use original 'ids'.
def is_citation_ref(node):
Expand All @@ -395,11 +395,11 @@ def is_citation_ref(node):
.format(old_cite_ref_rawsources, new_cite_ref_rawsources),
location=node)
for old in old_cite_refs:
refname_ids_map[old["refname"]] = old["ids"]
refname_ids_map.setdefault(old["refname"], []).append(old["ids"])
for new in new_cite_refs:
refname = new["refname"]
if refname in refname_ids_map:
new["ids"] = refname_ids_map[refname]
if refname_ids_map.get(refname):
new["ids"] = refname_ids_map[refname].pop()

# Original pending_xref['reftarget'] contain not-translated
# target name, new pending_xref must use original one.
Expand Down
6 changes: 4 additions & 2 deletions tests/roots/test-intl/footnote.po
Expand Up @@ -19,8 +19,10 @@ msgstr ""
msgid "i18n with Footnote"
msgstr "I18N WITH FOOTNOTE"

msgid "[100]_ Contents [#]_ for `i18n with Footnote`_ [ref]_ [#named]_ [*]_."
msgstr "`I18N WITH FOOTNOTE`_ INCLUDE THIS CONTENTS [#named]_ [ref]_ [#]_ [100]_ [*]_."
msgid "[100]_ Contents [#]_ for `i18n with Footnote`_ [ref]_ [#named]_ [*]_. "
"second footnote_ref [100]_."
msgstr "`I18N WITH FOOTNOTE`_ INCLUDE THIS CONTENTS [#named]_ [ref]_ [#]_ [100]_ [*]_. "
"SECOND FOOTNOTE_REF [100]_."

msgid "This is a auto numbered footnote."
msgstr "THIS IS A AUTO NUMBERED FOOTNOTE."
Expand Down
1 change: 1 addition & 0 deletions tests/roots/test-intl/footnote.txt
Expand Up @@ -5,6 +5,7 @@ i18n with Footnote
.. #955 cant-build-html-with-footnotes-when-using

[100]_ Contents [#]_ for `i18n with Footnote`_ [ref]_ [#named]_ [*]_.
second footnote_ref [100]_.

.. [#] This is a auto numbered footnote.
.. [ref] This is a named footnote.
Expand Down
10 changes: 7 additions & 3 deletions tests/test_intl.py
Expand Up @@ -794,9 +794,13 @@ def test_xml_footnotes(app, warning):
assert_elem(
para0[0],
['I18N WITH FOOTNOTE', 'INCLUDE THIS CONTENTS',
'2', '[ref]', '1', '100', '*', '.'],
'2', '[ref]', '1', '100', '*', '. SECOND FOOTNOTE_REF', '100', '.'],
['i18n-with-footnote', 'ref'])

# check node_id for footnote_references which refer same footnote (refs: #3002)
assert para0[0][4].text == para0[0][6].text == '100'
assert para0[0][4].attrib['ids'] != para0[0][6].attrib['ids']

footnote0 = secs[0].findall('footnote')
assert_elem(
footnote0[0],
Expand Down Expand Up @@ -848,8 +852,8 @@ def test_xml_footnote_backlinks(app):
footnote0 = secs[0].findall('footnote')
for footnote in footnote0:
ids = footnote.attrib.get('ids')
backrefs = footnote.attrib.get('backrefs')
assert refid2id[ids] == backrefs
backrefs = footnote.attrib.get('backrefs').split()
assert refid2id[ids] in backrefs


@sphinx_intl
Expand Down

0 comments on commit db48596

Please sign in to comment.