From 908c0ce46ee389a7c3dcbfc40221be1662762cd4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 3 Nov 2010 10:05:26 -0600 Subject: [PATCH] EPUB Input: Handle ncx files that have elements with no content correctly. Fixes #7396 (calibre does not show TOC from attached epub file) --- src/calibre/ebooks/metadata/toc.py | 20 +++++++++----------- src/calibre/gui2/viewer/main.py | 9 +++++---- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/calibre/ebooks/metadata/toc.py b/src/calibre/ebooks/metadata/toc.py index 0ed527d26a..10d45186de 100644 --- a/src/calibre/ebooks/metadata/toc.py +++ b/src/calibre/ebooks/metadata/toc.py @@ -182,6 +182,7 @@ class TOC(list): except: play_order = 1 href = fragment = text = None + nd = dest nl = nl_path(np) if nl: nl = nl[0] @@ -190,17 +191,14 @@ class TOC(list): text += etree.tostring(txt, method='text', encoding=unicode, with_tail=False) content = content_path(np) - if not content or not text: - return - content = content[0] - src = get_attr(content, attr='src') - if src is None: - return - - purl = urlparse(unquote(content.get('src'))) - href, fragment = purl[2], purl[5] - nd = dest.add_item(href, fragment, text) - nd.play_order = play_order + if content and text: + content = content[0] + src = get_attr(content, attr='src') + if src: + purl = urlparse(unquote(content.get('src'))) + href, fragment = purl[2], purl[5] + nd = dest.add_item(href, fragment, text) + nd.play_order = play_order for c in np_path(np): process_navpoint(c, nd) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 09019af18b..4a098785b1 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -358,10 +358,11 @@ class EbookViewer(MainWindow, Ui_EbookViewer): def toc_clicked(self, index): item = self.toc_model.itemFromIndex(index) - url = QUrl.fromLocalFile(item.abspath) - if item.fragment: - url.setFragment(item.fragment) - self.link_clicked(url) + if item.abspath is not None: + url = QUrl.fromLocalFile(item.abspath) + if item.fragment: + url.setFragment(item.fragment) + self.link_clicked(url) def selection_changed(self, selected_text): self.selected_text = selected_text.strip()