mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
fix #1058: footnote backlinks with i18n
This commit is contained in:
parent
da008da569
commit
ccd8067ee5
@ -237,9 +237,9 @@ class Locale(Transform):
|
|||||||
continue # skip for now
|
continue # skip for now
|
||||||
|
|
||||||
# auto-numbered foot note reference should use original 'ids'.
|
# auto-numbered foot note reference should use original 'ids'.
|
||||||
is_autonumber_footnote_ref = lambda node: \
|
def is_autonumber_footnote_ref(node):
|
||||||
isinstance(node, nodes.footnote_reference) \
|
return isinstance(node, nodes.footnote_reference) and \
|
||||||
and node.get('auto') == 1
|
node.get('auto') == 1
|
||||||
old_foot_refs = node.traverse(is_autonumber_footnote_ref)
|
old_foot_refs = node.traverse(is_autonumber_footnote_ref)
|
||||||
new_foot_refs = patch.traverse(is_autonumber_footnote_ref)
|
new_foot_refs = patch.traverse(is_autonumber_footnote_ref)
|
||||||
if len(old_foot_refs) != len(new_foot_refs):
|
if len(old_foot_refs) != len(new_foot_refs):
|
||||||
@ -254,9 +254,9 @@ class Locale(Transform):
|
|||||||
# * reference target ".. _Python: ..." is not translatable.
|
# * reference target ".. _Python: ..." is not translatable.
|
||||||
# * section refname is not translatable.
|
# * section refname is not translatable.
|
||||||
# * inline reference "`Python <...>`_" has no 'refname'.
|
# * inline reference "`Python <...>`_" has no 'refname'.
|
||||||
is_refnamed_ref = lambda node: \
|
def is_refnamed_ref(node):
|
||||||
isinstance(node, nodes.reference) \
|
return isinstance(node, nodes.reference) and \
|
||||||
and 'refname' in node
|
'refname' in node
|
||||||
old_refs = node.traverse(is_refnamed_ref)
|
old_refs = node.traverse(is_refnamed_ref)
|
||||||
new_refs = patch.traverse(is_refnamed_ref)
|
new_refs = patch.traverse(is_refnamed_ref)
|
||||||
applied_refname_map = {}
|
applied_refname_map = {}
|
||||||
@ -279,6 +279,25 @@ class Locale(Transform):
|
|||||||
|
|
||||||
self.document.note_refname(new)
|
self.document.note_refname(new)
|
||||||
|
|
||||||
|
# refnamed footnote and citation should use original 'ids'.
|
||||||
|
def is_refnamed_footnote_ref(node):
|
||||||
|
footnote_ref_classes = (nodes.footnote_reference,
|
||||||
|
nodes.citation_reference)
|
||||||
|
return isinstance(node, footnote_ref_classes) and \
|
||||||
|
'refname' in node
|
||||||
|
old_refs = node.traverse(is_refnamed_footnote_ref)
|
||||||
|
new_refs = patch.traverse(is_refnamed_footnote_ref)
|
||||||
|
refname_ids_map = {}
|
||||||
|
if len(old_refs) != len(new_refs):
|
||||||
|
env.warn_node('inconsistent references in '
|
||||||
|
'translated message', node)
|
||||||
|
for old in old_refs:
|
||||||
|
refname_ids_map[old["refname"]] = old["ids"]
|
||||||
|
for new in new_refs:
|
||||||
|
refname = new["refname"]
|
||||||
|
if refname in refname_ids_map:
|
||||||
|
new["ids"] = refname_ids_map[refname]
|
||||||
|
|
||||||
# update leaves
|
# update leaves
|
||||||
for child in patch.children:
|
for child in patch.children:
|
||||||
child.parent = node
|
child.parent = node
|
||||||
|
@ -101,6 +101,26 @@ def test_i18n_footnote_regression(app):
|
|||||||
assert result == expect
|
assert result == expect
|
||||||
|
|
||||||
|
|
||||||
|
@with_app(buildername='html', cleanenv=True,
|
||||||
|
confoverrides={'language': 'xx', 'locale_dirs': ['.'],
|
||||||
|
'gettext_compact': False})
|
||||||
|
def test_i18n_footnote_backlink(app):
|
||||||
|
"""i18n test for #1058"""
|
||||||
|
app.builder.build(['i18n/footnote'])
|
||||||
|
result = (app.outdir / 'i18n' / 'footnote.html').text(encoding='utf-8')
|
||||||
|
expects = [
|
||||||
|
'<a class="footnote-reference" href="#id5" id="id1">[100]</a>', # id="id3"
|
||||||
|
'<a class="footnote-reference" href="#id4" id="id2">[1]</a>', # id="id2"
|
||||||
|
'<a class="reference internal" href="#ref" id="id3">[ref]</a>', # id="id1"
|
||||||
|
'<a class="fn-backref" href="#id2">[1]</a>',
|
||||||
|
'<a class="fn-backref" href="#id3">[ref]</a>',
|
||||||
|
'<a class="fn-backref" href="#id1">[100]</a>',
|
||||||
|
]
|
||||||
|
for expect in expects:
|
||||||
|
matches = re.findall(re.escape(expect), result)
|
||||||
|
assert len(matches) == 1
|
||||||
|
|
||||||
|
|
||||||
@with_app(buildername='text', warning=warnfile, cleanenv=True,
|
@with_app(buildername='text', warning=warnfile, cleanenv=True,
|
||||||
confoverrides={'language': 'xx', 'locale_dirs': ['.'],
|
confoverrides={'language': 'xx', 'locale_dirs': ['.'],
|
||||||
'gettext_compact': False})
|
'gettext_compact': False})
|
||||||
|
Loading…
Reference in New Issue
Block a user