This commit is contained in:
Kovid Goyal 2011-07-26 23:05:11 -06:00
parent 3453746d90
commit 543cabb418
3 changed files with 32 additions and 36 deletions

View File

@ -302,5 +302,29 @@ def align_block(raw, multiple=4, pad=b'\0'):
return raw + pad*(multiple - extra) 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

View File

@ -14,7 +14,7 @@ from collections import OrderedDict, defaultdict
from calibre.ebooks.mobi.writer2 import RECORD_SIZE from calibre.ebooks.mobi.writer2 import RECORD_SIZE
from calibre.ebooks.mobi.utils import (encint, encode_number_as_hex, 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): # {{{ class CNCX(object): # {{{
@ -320,7 +320,7 @@ class Indexer(object): # {{{
self.log = oeb.log self.log = oeb.log
self.opts = opts 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.log('Generating MOBI index for a %s'%('periodical' if
self.is_periodical else 'book')) self.is_periodical else 'book'))
self.is_flat_periodical = False self.is_flat_periodical = False
@ -344,28 +344,6 @@ class Indexer(object): # {{{
self.calculate_trailing_byte_sequences() 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): # {{{ def create_index_record(self): # {{{
header_length = 192 header_length = 192
buf = StringIO() buf = StringIO()

View File

@ -198,7 +198,6 @@ class MobiWriter(object):
self.serializer = Serializer(self.oeb, self.images, self.serializer = Serializer(self.oeb, self.images,
write_page_breaks_after_item=self.write_page_breaks_after_item) write_page_breaks_after_item=self.write_page_breaks_after_item)
text = self.serializer() text = self.serializer()
self.content_length = len(text)
self.text_length = len(text) self.text_length = len(text)
text = StringIO(text) text = StringIO(text)
nrecords = 0 nrecords = 0
@ -206,21 +205,16 @@ class MobiWriter(object):
if self.compression != UNCOMPRESSED: if self.compression != UNCOMPRESSED:
self.oeb.logger.info(' Compressing markup content...') self.oeb.logger.info(' Compressing markup content...')
data, overlap = self.read_text_record(text) while text.tell() < self.text_length:
data, overlap = self.read_text_record(text)
while len(data) > 0:
if self.compression == PALMDOC: if self.compression == PALMDOC:
data = compress_doc(data) data = compress_doc(data)
record = StringIO()
data += overlap
data += pack(b'>B', len(overlap))
self.records.append(data)
nrecords += 1 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 self.last_text_record_idx = nrecords