mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
...
This commit is contained in:
parent
3453746d90
commit
543cabb418
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user