summaryrefslogtreecommitdiff
path: root/sphinx
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2020-03-29 23:55:45 +0900
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2020-03-29 23:55:56 +0900
commit32b256dc2f1bf498a10e51429f9c88ea5dea8a10 (patch)
tree407d813b7c282226f2f129900cff2c851474f91b /sphinx
parent7aa5584a47d269aa656a4d8a296aa56e2c69dc6c (diff)
downloadsphinx-git-32b256dc2f1bf498a10e51429f9c88ea5dea8a10.tar.gz
Fix #7301: epub: duplicated node_ids are generated
Diffstat (limited to 'sphinx')
-rw-r--r--sphinx/builders/_epub_base.py23
1 files changed, 12 insertions, 11 deletions
diff --git a/sphinx/builders/_epub_base.py b/sphinx/builders/_epub_base.py
index f86715fcf..b2d8413a8 100644
--- a/sphinx/builders/_epub_base.py
+++ b/sphinx/builders/_epub_base.py
@@ -259,6 +259,15 @@ class EpubBuilder(StandaloneHTMLBuilder):
Some readers crash because they interpret the part as a
transport protocol specification.
"""
+ def update_node_id(node: Element) -> None:
+ """Update IDs of given *node*."""
+ new_ids = []
+ for node_id in node['ids']:
+ new_id = self.fix_fragment('', node_id)
+ if new_id not in new_ids:
+ new_ids.append(new_id)
+ node['ids'] = new_ids
+
for reference in tree.traverse(nodes.reference):
if 'refuri' in reference:
m = self.refuri_re.match(reference['refuri'])
@@ -268,22 +277,14 @@ class EpubBuilder(StandaloneHTMLBuilder):
reference['refid'] = self.fix_fragment('', reference['refid'])
for target in tree.traverse(nodes.target):
- for i, node_id in enumerate(target['ids']):
- if ':' in node_id:
- target['ids'][i] = self.fix_fragment('', node_id)
+ update_node_id(target)
next_node = target.next_node(ascend=True) # type: Node
if isinstance(next_node, nodes.Element):
- for i, node_id in enumerate(next_node['ids']):
- if ':' in node_id:
- next_node['ids'][i] = self.fix_fragment('', node_id)
+ update_node_id(next_node)
for desc_signature in tree.traverse(addnodes.desc_signature):
- ids = desc_signature.attributes['ids']
- newids = []
- for id in ids:
- newids.append(self.fix_fragment('', id))
- desc_signature.attributes['ids'] = newids
+ update_node_id(desc_signature)
def add_visible_links(self, tree: nodes.document, show_urls: str = 'inline') -> None:
"""Add visible link targets for external links"""