mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
New MOBI output: Fix geenration of image indices
This commit is contained in:
parent
aa37d7963d
commit
32a1c612ca
@ -1421,7 +1421,7 @@ class MOBIFile(object): # {{{
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if fmt is not None:
|
if fmt is not None:
|
||||||
self.image_records.append(ImageRecord(i, r, fmt))
|
self.image_records.append(ImageRecord(len(self.image_records)+1, r, fmt))
|
||||||
else:
|
else:
|
||||||
self.binary_records.append(BinaryRecord(i, r))
|
self.binary_records.append(BinaryRecord(i, r))
|
||||||
|
|
||||||
|
@ -314,6 +314,8 @@ def detect_periodical(toc, log=None):
|
|||||||
Detect if the TOC object toc contains a periodical that conforms to the
|
Detect if the TOC object toc contains a periodical that conforms to the
|
||||||
structure required by kindlegen to generate a periodical.
|
structure required by kindlegen to generate a periodical.
|
||||||
'''
|
'''
|
||||||
|
if toc.count() < 1 or not toc[0].klass == 'periodical':
|
||||||
|
return False
|
||||||
for node in toc.iterdescendants():
|
for node in toc.iterdescendants():
|
||||||
if node.depth() == 1 and node.klass != 'article':
|
if node.depth() == 1 and node.klass != 'article':
|
||||||
if log is not None:
|
if log is not None:
|
||||||
|
@ -97,6 +97,9 @@ class MobiWriter(object):
|
|||||||
# Indexing {{{
|
# Indexing {{{
|
||||||
def generate_index(self):
|
def generate_index(self):
|
||||||
self.primary_index_record_idx = None
|
self.primary_index_record_idx = None
|
||||||
|
if self.oeb.toc.count() < 1:
|
||||||
|
self.log.warn('No TOC, MOBI index not generated')
|
||||||
|
return
|
||||||
try:
|
try:
|
||||||
self.indexer = Indexer(self.serializer, self.last_text_record_idx,
|
self.indexer = Indexer(self.serializer, self.last_text_record_idx,
|
||||||
len(self.records[self.last_text_record_idx]),
|
len(self.records[self.last_text_record_idx]),
|
||||||
@ -147,15 +150,19 @@ class MobiWriter(object):
|
|||||||
oeb.logger.info('Serializing images...')
|
oeb.logger.info('Serializing images...')
|
||||||
self.image_records = []
|
self.image_records = []
|
||||||
self.image_map = {}
|
self.image_map = {}
|
||||||
|
self.masthead_offset = 0
|
||||||
|
index = 1
|
||||||
|
|
||||||
mh_href = self.masthead_offset = None
|
mh_href = None
|
||||||
if 'masthead' in oeb.guide:
|
if 'masthead' in oeb.guide:
|
||||||
mh_href = oeb.guide['masthead'].href
|
mh_href = oeb.guide['masthead'].href
|
||||||
|
self.image_records.append(None)
|
||||||
|
index += 1
|
||||||
elif self.is_periodical:
|
elif self.is_periodical:
|
||||||
# Generate a default masthead
|
# Generate a default masthead
|
||||||
data = generate_masthead(unicode(self.oeb.metadata('title')[0]))
|
data = generate_masthead(unicode(self.oeb.metadata['title'][0]))
|
||||||
self.image_records.append(data)
|
self.image_records.append(data)
|
||||||
self.masthead_offset = 0
|
index += 1
|
||||||
|
|
||||||
cover_href = self.cover_offset = self.thumbnail_offset = None
|
cover_href = self.cover_offset = self.thumbnail_offset = None
|
||||||
if (oeb.metadata.cover and
|
if (oeb.metadata.cover and
|
||||||
@ -172,13 +179,16 @@ class MobiWriter(object):
|
|||||||
oeb.logger.warn('Bad image file %r' % item.href)
|
oeb.logger.warn('Bad image file %r' % item.href)
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
self.image_map[item.href] = len(self.image_records)
|
if mh_href and item.href == mh_href:
|
||||||
self.image_records.append(data)
|
self.image_records[0] = data
|
||||||
|
continue
|
||||||
|
|
||||||
if item.href == mh_href:
|
self.image_records.append(data)
|
||||||
self.masthead_offset = len(self.image_records) - 1
|
self.image_map[item.href] = index
|
||||||
elif item.href == cover_href:
|
index += 1
|
||||||
self.cover_offset = len(self.image_records) - 1
|
|
||||||
|
if cover_href and item.href == cover_href:
|
||||||
|
self.cover_offset = self.image_map[item.href] - 1
|
||||||
try:
|
try:
|
||||||
data = rescale_image(item.data, dimen=MAX_THUMB_DIMEN,
|
data = rescale_image(item.data, dimen=MAX_THUMB_DIMEN,
|
||||||
maxsizeb=MAX_THUMB_SIZE)
|
maxsizeb=MAX_THUMB_SIZE)
|
||||||
@ -186,10 +196,14 @@ class MobiWriter(object):
|
|||||||
oeb.logger.warn('Failed to generate thumbnail')
|
oeb.logger.warn('Failed to generate thumbnail')
|
||||||
else:
|
else:
|
||||||
self.image_records.append(data)
|
self.image_records.append(data)
|
||||||
self.thumbnail_offset = len(self.image_records) - 1
|
self.thumbnail_offset = index - 1
|
||||||
|
index += 1
|
||||||
finally:
|
finally:
|
||||||
item.unload_data_from_memory()
|
item.unload_data_from_memory()
|
||||||
|
|
||||||
|
if self.image_records[0] is None:
|
||||||
|
raise ValueError('Failed to find masthead image in manifest')
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Text {{{
|
# Text {{{
|
||||||
|
@ -37,6 +37,7 @@ class Serializer(object):
|
|||||||
is written after every element of the spine in ``oeb``.
|
is written after every element of the spine in ``oeb``.
|
||||||
'''
|
'''
|
||||||
self.oeb = oeb
|
self.oeb = oeb
|
||||||
|
# Map of image hrefs to image index in the MOBI file
|
||||||
self.images = images
|
self.images = images
|
||||||
self.logger = oeb.logger
|
self.logger = oeb.logger
|
||||||
self.is_periodical = is_periodical
|
self.is_periodical = is_periodical
|
||||||
|
Loading…
x
Reference in New Issue
Block a user