From 543cabb4184f0f909056e406af6f217b3f604479 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 26 Jul 2011 23:05:11 -0600 Subject: [PATCH] ... --- src/calibre/ebooks/mobi/utils.py | 24 ++++++++++++++++++++ src/calibre/ebooks/mobi/writer2/indexer.py | 26 ++-------------------- src/calibre/ebooks/mobi/writer2/main.py | 18 +++++---------- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/calibre/ebooks/mobi/utils.py b/src/calibre/ebooks/mobi/utils.py index 6df9db3b3b..80214b04d3 100644 --- a/src/calibre/ebooks/mobi/utils.py +++ b/src/calibre/ebooks/mobi/utils.py @@ -302,5 +302,29 @@ def align_block(raw, multiple=4, pad=b'\0'): return raw + pad*(multiple - extra) +def detect_periodical(toc, log): + ''' + Detect if the TOC object toc contains a periodical that conforms to the + structure required by kindlegen to generate a periodical. + ''' + for node in toc.iterdescendants(): + if node.depth() == 1 and node.klass != 'article': + log.debug( + 'Not a periodical: Deepest node does not have ' + 'class="article"') + return False + if node.depth() == 2 and node.klass != 'section': + log.debug( + 'Not a periodical: Second deepest node does not have' + ' class="section"') + return False + if node.depth() == 3 and node.klass != 'periodical': + log.debug('Not a periodical: Third deepest node' + ' does not have class="periodical"') + return False + if node.depth() > 3: + log.debug('Not a periodical: Has nodes of depth > 3') + return False + return True diff --git a/src/calibre/ebooks/mobi/writer2/indexer.py b/src/calibre/ebooks/mobi/writer2/indexer.py index f121e29835..54bef57ae3 100644 --- a/src/calibre/ebooks/mobi/writer2/indexer.py +++ b/src/calibre/ebooks/mobi/writer2/indexer.py @@ -14,7 +14,7 @@ from collections import OrderedDict, defaultdict from calibre.ebooks.mobi.writer2 import RECORD_SIZE from calibre.ebooks.mobi.utils import (encint, encode_number_as_hex, - encode_tbs, align_block, utf8_text) + encode_tbs, align_block, utf8_text, detect_periodical) class CNCX(object): # {{{ @@ -320,7 +320,7 @@ class Indexer(object): # {{{ self.log = oeb.log self.opts = opts - self.is_periodical = self.detect_periodical() + self.is_periodical = detect_periodical(self.oeb.toc, self.log) self.log('Generating MOBI index for a %s'%('periodical' if self.is_periodical else 'book')) self.is_flat_periodical = False @@ -344,28 +344,6 @@ class Indexer(object): # {{{ self.calculate_trailing_byte_sequences() - def detect_periodical(self): # {{{ - for node in self.oeb.toc.iterdescendants(): - if node.depth() == 1 and node.klass != 'article': - self.log.debug( - 'Not a periodical: Deepest node does not have ' - 'class="article"') - return False - if node.depth() == 2 and node.klass != 'section': - self.log.debug( - 'Not a periodical: Second deepest node does not have' - ' class="section"') - return False - if node.depth() == 3 and node.klass != 'periodical': - self.log.debug('Not a periodical: Third deepest node' - ' does not have class="periodical"') - return False - if node.depth() > 3: - self.log.debug('Not a periodical: Has nodes of depth > 3') - return False - return True - # }}} - def create_index_record(self): # {{{ header_length = 192 buf = StringIO() diff --git a/src/calibre/ebooks/mobi/writer2/main.py b/src/calibre/ebooks/mobi/writer2/main.py index 44c471d3d4..e3f4081670 100644 --- a/src/calibre/ebooks/mobi/writer2/main.py +++ b/src/calibre/ebooks/mobi/writer2/main.py @@ -198,7 +198,6 @@ class MobiWriter(object): self.serializer = Serializer(self.oeb, self.images, write_page_breaks_after_item=self.write_page_breaks_after_item) text = self.serializer() - self.content_length = len(text) self.text_length = len(text) text = StringIO(text) nrecords = 0 @@ -206,21 +205,16 @@ class MobiWriter(object): if self.compression != UNCOMPRESSED: self.oeb.logger.info(' Compressing markup content...') - data, overlap = self.read_text_record(text) - - while len(data) > 0: + while text.tell() < self.text_length: + data, overlap = self.read_text_record(text) if self.compression == PALMDOC: data = compress_doc(data) - record = StringIO() + data += overlap + data += pack(b'>B', len(overlap)) + + self.records.append(data) nrecords += 1 - data, overlap = self.read_text_record(text) - record.write(data) - - # Write information about the multibyte character overlap, if any - record.write(overlap) - record.write(pack(b'>B', len(overlap))) - self.records.append(record.getvalue()) self.last_text_record_idx = nrecords