From 2aa4f7c70bb5749e714dc2d2b3044b1e872b292e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 25 Jul 2012 10:14:40 +0530 Subject: [PATCH] Conversion: Ignore invalid chapter detection and level n ToC expressions instead of erroring out --- .../ebooks/oeb/transforms/structure.py | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/oeb/transforms/structure.py b/src/calibre/ebooks/oeb/transforms/structure.py index dd3db1415a..b90774bcc7 100644 --- a/src/calibre/ebooks/oeb/transforms/structure.py +++ b/src/calibre/ebooks/oeb/transforms/structure.py @@ -82,10 +82,17 @@ class DetectStructure(object): def detect_chapters(self): self.detected_chapters = [] + + def find_matches(expr, doc): + try: + return XPath(expr)(doc) + except: + self.log.warn('Invalid chapter expression, ignoring: %s'%expr) + return [] + if self.opts.chapter: - chapter_xpath = XPath(self.opts.chapter) for item in self.oeb.spine: - for x in chapter_xpath(item.data): + for x in find_matches(self.opts.chapter, item.data): self.detected_chapters.append((item, x)) chapter_mark = self.opts.chapter_mark @@ -164,11 +171,19 @@ class DetectStructure(object): added = OrderedDict() added2 = OrderedDict() counter = 1 + + def find_matches(expr, doc): + try: + return XPath(expr)(doc) + except: + self.log.warn('Invalid ToC expression, ignoring: %s'%expr) + return [] + for document in self.oeb.spine: previous_level1 = list(added.itervalues())[-1] if added else None previous_level2 = list(added2.itervalues())[-1] if added2 else None - for elem in XPath(self.opts.level1_toc)(document.data): + for elem in find_matches(self.opts.level1_toc, document.data): text, _href = self.elem_to_link(document, elem, counter) counter += 1 if text: @@ -178,7 +193,7 @@ class DetectStructure(object): #node.add(_('Top'), _href) if self.opts.level2_toc is not None and added: - for elem in XPath(self.opts.level2_toc)(document.data): + for elem in find_matches(self.opts.level2_toc, document.data): level1 = None for item in document.data.iterdescendants(): if item in added: @@ -196,7 +211,8 @@ class DetectStructure(object): break if self.opts.level3_toc is not None and added2: - for elem in XPath(self.opts.level3_toc)(document.data): + for elem in find_matches(self.opts.level3_toc, + document.data): level2 = None for item in document.data.iterdescendants(): if item in added2: