From 081c5385f2862be4d0a7e73f76b9c8f9477156ae Mon Sep 17 00:00:00 2001 From: Li Fanxi Date: Sun, 10 Oct 2010 21:24:27 +0800 Subject: [PATCH] [SNBOutput] Improve TOC handling. If an spice is not referenced in TOC, it will be appended to the last TOC item. --- src/calibre/ebooks/snb/output.py | 51 +++++++++++++++++++++++++------- src/calibre/ebooks/snb/snbml.py | 13 ++++++-- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/calibre/ebooks/snb/output.py b/src/calibre/ebooks/snb/output.py index a682062de2..c8457347ec 100644 --- a/src/calibre/ebooks/snb/output.py +++ b/src/calibre/ebooks/snb/output.py @@ -131,6 +131,10 @@ class SNBOutput(OutputFormatPlugin): 'Creating a default TOC') first = iter(oeb_book.spine).next() oeb_book.toc.add(_('Start'), first.href) + else: + first = iter(oeb_book.spine).next() + if oeb_book.toc[0].href != first.href: + oeb_book.toc.add(_('Start'), first.href) for tocitem in oeb_book.toc: if tocitem.href.find('#') != -1: @@ -166,22 +170,49 @@ class SNBOutput(OutputFormatPlugin): tocInfoFile.close() # Output Files + oldTree = None + mergeLast = False + lastName = None for item in s: from calibre.ebooks.oeb.base import OEB_DOCS, OEB_IMAGES, PNG_MIME if m.hrefs[item.href].media_type in OEB_DOCS: if not item.href in outputFiles: - log.debug('Skipping %s because unused in TOC.' % item.href) - continue + log.debug('File %s is unused in TOC. Continue in last chapter' % item.href) + mergeLast = True + else: + log.debug('Output the modified chapter again: %s' % lastName) + if oldTree != None and mergeLast: + outputFile = open(os.path.join(snbcDir, lastName), 'wb') + outputFile.write(etree.tostring(oldTree, pretty_print=True, encoding='utf-8')) + outputFile.close() + mergeLast = False + log.debug('Converting %s to snbc...' % item.href) snbwriter = SNBMLizer(log) - snbcTrees = snbwriter.extract_content(oeb_book, item, outputFiles[item.href], opts) - for subName in snbcTrees: - postfix = '' - if subName != '': - postfix = '_' + subName - outputFile = open(os.path.join(snbcDir, ProcessFileName(item.href + postfix + ".snbc")), 'wb') - outputFile.write(etree.tostring(snbcTrees[subName], pretty_print=True, encoding='utf-8')) - outputFile.close() + snbcTrees = None + if not mergeLast: + snbcTrees = snbwriter.extract_content(oeb_book, item, outputFiles[item.href], opts) + for subName in snbcTrees: + postfix = '' + if subName != '': + postfix = '_' + subName + lastName = ProcessFileName(item.href + postfix + ".snbc") + oldTree = snbcTrees[subName] + outputFile = open(os.path.join(snbcDir, lastName), 'wb') + outputFile.write(etree.tostring(oldTree, pretty_print=True, encoding='utf-8')) + outputFile.close() + else: + log.debug('Merge %s with last TOC item...' % item.href) + snbwriter.merge_content(oldTree, oeb_book, item, [('', _("Start"))], opts) + + # Output the last one if needed + log.debug('Output the last modified chapter again: %s' % lastName) + if oldTree != None and mergeLast: + outputFile = open(os.path.join(snbcDir, lastName), 'wb') + outputFile.write(etree.tostring(oldTree, pretty_print=True, encoding='utf-8')) + outputFile.close() + mergeLast = False + for item in m: if m.hrefs[item.href].media_type in OEB_IMAGES: log.debug('Converting image: %s ...' % item.href) diff --git a/src/calibre/ebooks/snb/snbml.py b/src/calibre/ebooks/snb/snbml.py index c357971b5e..bfdaf53cae 100644 --- a/src/calibre/ebooks/snb/snbml.py +++ b/src/calibre/ebooks/snb/snbml.py @@ -70,6 +70,14 @@ class SNBMLizer(object): self.subitems = subitems return self.mlize(); + def merge_content(self, old_tree, oeb_book, item, subitems, opts): + newTrees = self.extract_content(oeb_book, item, subitems, opts) + body = old_tree.find(".//body") + if body != None: + for subName in newTrees: + newbody = newTrees[subName].find(".//body") + for entity in newbody: + body.append(entity) def mlize(self): output = [ u'' ] @@ -91,11 +99,12 @@ class SNBMLizer(object): line = line.strip(' \t\n\r') if len(line) != 0: if line.find(CALIBRE_SNB_IMG_TAG) == 0: - etree.SubElement(trees[subitem], "img").text = line[len(CALIBRE_SNB_IMG_TAG):] + etree.SubElement(trees[subitem].find(".//body"), "img").text = line[len(CALIBRE_SNB_IMG_TAG):] elif line.find(CALIBRE_SNB_BM_TAG) == 0: subitem = line[len(CALIBRE_SNB_BM_TAG):] else: - etree.SubElement(trees[subitem], "text").text = etree.CDATA(unicode(u'\u3000\u3000' + line)) + etree.SubElement(trees[subitem].find(".//body"), "text").text = \ + etree.CDATA(unicode(u'\u3000\u3000' + line)) return trees def remove_newlines(self, text):