New MOBI output: Fix geenration of image indices

This commit is contained in:
Kovid Goyal 2011-08-19 13:03:01 -06:00
parent aa37d7963d
commit 32a1c612ca
4 changed files with 28 additions and 11 deletions

View File

@ -1421,7 +1421,7 @@ class MOBIFile(object): # {{{
except:
pass
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:
self.binary_records.append(BinaryRecord(i, r))

View File

@ -314,6 +314,8 @@ def detect_periodical(toc, log=None):
Detect if the TOC object toc contains a periodical that conforms to the
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():
if node.depth() == 1 and node.klass != 'article':
if log is not None:

View File

@ -97,6 +97,9 @@ class MobiWriter(object):
# Indexing {{{
def generate_index(self):
self.primary_index_record_idx = None
if self.oeb.toc.count() < 1:
self.log.warn('No TOC, MOBI index not generated')
return
try:
self.indexer = Indexer(self.serializer, 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...')
self.image_records = []
self.image_map = {}
self.masthead_offset = 0
index = 1
mh_href = self.masthead_offset = None
mh_href = None
if 'masthead' in oeb.guide:
mh_href = oeb.guide['masthead'].href
self.image_records.append(None)
index += 1
elif self.is_periodical:
# 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.masthead_offset = 0
index += 1
cover_href = self.cover_offset = self.thumbnail_offset = None
if (oeb.metadata.cover and
@ -172,13 +179,16 @@ class MobiWriter(object):
oeb.logger.warn('Bad image file %r' % item.href)
continue
else:
self.image_map[item.href] = len(self.image_records)
self.image_records.append(data)
if mh_href and item.href == mh_href:
self.image_records[0] = data
continue
if item.href == mh_href:
self.masthead_offset = len(self.image_records) - 1
elif item.href == cover_href:
self.cover_offset = len(self.image_records) - 1
self.image_records.append(data)
self.image_map[item.href] = index
index += 1
if cover_href and item.href == cover_href:
self.cover_offset = self.image_map[item.href] - 1
try:
data = rescale_image(item.data, dimen=MAX_THUMB_DIMEN,
maxsizeb=MAX_THUMB_SIZE)
@ -186,10 +196,14 @@ class MobiWriter(object):
oeb.logger.warn('Failed to generate thumbnail')
else:
self.image_records.append(data)
self.thumbnail_offset = len(self.image_records) - 1
self.thumbnail_offset = index - 1
index += 1
finally:
item.unload_data_from_memory()
if self.image_records[0] is None:
raise ValueError('Failed to find masthead image in manifest')
# }}}
# Text {{{

View File

@ -37,6 +37,7 @@ class Serializer(object):
is written after every element of the spine in ``oeb``.
'''
self.oeb = oeb
# Map of image hrefs to image index in the MOBI file
self.images = images
self.logger = oeb.logger
self.is_periodical = is_periodical