summaryrefslogtreecommitdiff
path: root/sphinx/transforms.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/transforms.py')
-rw-r--r--sphinx/transforms.py27
1 files changed, 24 insertions, 3 deletions
diff --git a/sphinx/transforms.py b/sphinx/transforms.py
index fbc77530..324df2ad 100644
--- a/sphinx/transforms.py
+++ b/sphinx/transforms.py
@@ -300,17 +300,38 @@ class Locale(Transform):
def is_autonumber_footnote_ref(node):
return isinstance(node, nodes.footnote_reference) and \
node.get('auto') == 1
+ def list_replace_or_append(lst, old, new):
+ if old in lst:
+ lst[lst.index(old)] = new
+ else:
+ lst.append(new)
old_foot_refs = node.traverse(is_autonumber_footnote_ref)
new_foot_refs = patch.traverse(is_autonumber_footnote_ref)
if len(old_foot_refs) != len(new_foot_refs):
env.warn_node('inconsistent footnote references in '
'translated message', node)
- for old, new in zip(old_foot_refs, new_foot_refs):
+ old_foot_namerefs = {}
+ for r in old_foot_refs:
+ old_foot_namerefs.setdefault(r.get('refname'), []).append(r)
+ for new in new_foot_refs:
+ refname = new.get('refname')
+ refs = old_foot_namerefs.get(refname, [])
+ if not refs:
+ continue
+
+ old = refs.pop(0)
new['ids'] = old['ids']
for id in new['ids']:
self.document.ids[id] = new
- self.document.autofootnote_refs.remove(old)
- self.document.note_autofootnote_ref(new)
+ list_replace_or_append(
+ self.document.autofootnote_refs, old, new)
+ if refname:
+ list_replace_or_append(
+ self.document.footnote_refs.setdefault(refname, []),
+ old, new)
+ list_replace_or_append(
+ self.document.refnames.setdefault(refname, []),
+ old, new)
# reference should use new (translated) 'refname'.
# * reference target ".. _Python: ..." is not translatable.