diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-03-29 23:55:45 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-03-29 23:55:56 +0900 |
commit | 32b256dc2f1bf498a10e51429f9c88ea5dea8a10 (patch) | |
tree | 407d813b7c282226f2f129900cff2c851474f91b /sphinx | |
parent | 7aa5584a47d269aa656a4d8a296aa56e2c69dc6c (diff) | |
download | sphinx-git-32b256dc2f1bf498a10e51429f9c88ea5dea8a10.tar.gz |
Fix #7301: epub: duplicated node_ids are generated
Diffstat (limited to 'sphinx')
-rw-r--r-- | sphinx/builders/_epub_base.py | 23 |
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""" |