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: 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))

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 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:

View File

@ -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 {{{

View File

@ -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