More MOBI indexing fixes

This commit is contained in:
Kovid Goyal 2009-05-31 14:31:24 -07:00
commit f77c8345b9
3 changed files with 23 additions and 14 deletions

View File

@ -85,7 +85,7 @@ class USBMS(CLI, Device):
elif on_card == 'cardb' and not self._card_b_prefix: elif on_card == 'cardb' and not self._card_b_prefix:
raise ValueError(_('The reader has no storage card in this slot.')) raise ValueError(_('The reader has no storage card in this slot.'))
elif on_card and on_card not in ('carda', 'cardb'): elif on_card and on_card not in ('carda', 'cardb'):
raise DeviceError(_('The reader has no storage card in this slot.')) raise DeviceError(_('Selected slot: %s is not supported.' % on_card))
if on_card == 'carda': if on_card == 'carda':
path = os.path.join(self._card_a_prefix, self.EBOOK_DIR_CARD_A) path = os.path.join(self._card_a_prefix, self.EBOOK_DIR_CARD_A)

View File

@ -29,6 +29,8 @@ from calibre.ebooks.oeb.base import prefixname
from calibre.ebooks.oeb.base import urlnormalize from calibre.ebooks.oeb.base import urlnormalize
from calibre.ebooks.compression.palmdoc import compress_doc from calibre.ebooks.compression.palmdoc import compress_doc
INDEXING = True
# TODO: # TODO:
# - Optionally rasterize tables # - Optionally rasterize tables
@ -99,8 +101,7 @@ def decint(value, direction):
def align_block(raw, multiple=4, pad='\0'): def align_block(raw, multiple=4, pad='\0'):
l = len(raw) extra = len(raw) % multiple
extra = l % multiple
if extra == 0: return raw if extra == 0: return raw
return raw + pad*(multiple - extra) return raw + pad*(multiple - extra)
@ -355,7 +356,7 @@ class MobiWriter(object):
def _generate_content(self): def _generate_content(self):
self._map_image_names() self._map_image_names()
self._generate_text() self._generate_text()
if not self.opts.no_mobi_index: if INDEXING and not self.opts.no_mobi_index:
self._generate_index() self._generate_index()
self._generate_images() self._generate_images()
@ -406,6 +407,7 @@ class MobiWriter(object):
self._content_length = len(text) self._content_length = len(text)
self._text_length = len(text) self._text_length = len(text)
text = StringIO(text) text = StringIO(text)
buf = []
nrecords = 0 nrecords = 0
offset = 0 offset = 0
if self._compression != UNCOMPRESSED: if self._compression != UNCOMPRESSED:
@ -435,9 +437,13 @@ class MobiWriter(object):
lsize += 1 lsize += 1
record.write(size) record.write(size)
self._records.append(record.getvalue()) self._records.append(record.getvalue())
buf.append(self._records[-1])
nrecords += 1 nrecords += 1
offset += RECORD_SIZE offset += RECORD_SIZE
data, overlap = self._read_text_record(text) data, overlap = self._read_text_record(text)
extra = len(''.join(buf))%4
if extra > 0 and INDEXING:
self._records[-1] += '\0'*(4-extra)
self._text_nrecords = nrecords self._text_nrecords = nrecords
def _generate_indxt(self, ctoc): def _generate_indxt(self, ctoc):
@ -448,7 +454,7 @@ class MobiWriter(object):
indices.write('IDXT') indices.write('IDXT')
c = 0 c = 0
last_index = last_name = None last_name = None
def add_node(node, offset, length, count): def add_node(node, offset, length, count):
if self.opts.verbose > 2: if self.opts.verbose > 2:
@ -487,20 +493,19 @@ class MobiWriter(object):
length = self._content_length - offset length = self._content_length - offset
add_node(child, offset, length, c) add_node(child, offset, length, c)
last_index = c
ctoc_offset = self._ctoc_map[child] ctoc_offset = self._ctoc_map[child]
last_name = "%4d"%c last_name = "%4d"%c
c += 1 c += 1
return align_block(indxt.getvalue()), c, \ return align_block(indxt.getvalue()), c, \
align_block(indices.getvalue()), last_index, last_name align_block(indices.getvalue()), last_name
def _generate_index(self): def _generate_index(self):
self._oeb.log('Generating index...') self._oeb.log('Generating index...')
self._primary_index_record = None self._primary_index_record = None
ctoc = self._generate_ctoc() ctoc = self._generate_ctoc()
indxt, indxt_count, indices, last_index, last_name = \ indxt, indxt_count, indices, last_name = \
self._generate_indxt(ctoc) self._generate_indxt(ctoc)
indx1 = StringIO() indx1 = StringIO()
@ -529,7 +534,7 @@ class MobiWriter(object):
indx1.write(indices) indx1.write(indices)
indx1 = indx1.getvalue() indx1 = indx1.getvalue()
idxt0 = chr(len(last_name)) + last_name + pack('>H', last_index) idxt0 = chr(len(last_name)) + last_name + pack('>H', indxt_count)
idxt0 = align_block(idxt0) idxt0 = align_block(idxt0)
indx0 = StringIO() indx0 = StringIO()
@ -666,7 +671,8 @@ class MobiWriter(object):
metadata = self._oeb.metadata metadata = self._oeb.metadata
exth = self._build_exth() exth = self._build_exth()
last_content_record = len(self._records) - 1 last_content_record = len(self._records) - 1
self._generate_end_records() if INDEXING:
self._generate_end_records()
record0 = StringIO() record0 = StringIO()
# The PalmDOC Header # The PalmDOC Header
record0.write(pack('>HHIHHHH', self._compression, 0, record0.write(pack('>HHIHHHH', self._compression, 0,
@ -827,6 +833,10 @@ class MobiWriter(object):
if index is not None: if index is not None:
exth.write(pack('>III', 0xca, 0x0c, index - 1)) exth.write(pack('>III', 0xca, 0x0c, index - 1))
nrecs += 1 nrecs += 1
if INDEXING:
# Write unknown EXTH records as 0s
for code, size in [(204,4), (205,4), (206,4), (207,4), (300,40)]:
exth.write(pack('>I', code)+'\0'*size)
exth = exth.getvalue() exth = exth.getvalue()
trail = len(exth) % 4 trail = len(exth) % 4
pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte
@ -849,7 +859,7 @@ class MobiWriter(object):
def _write_header(self): def _write_header(self):
title = str(self._oeb.metadata.title[0]) title = str(self._oeb.metadata.title[0])
title = re.sub('[^-A-Za-z0-9]+', '_', title)[:32] title = re.sub('[^-A-Za-z0-9]+', '_', title)[:31]
title = title + ('\0' * (32 - len(title))) title = title + ('\0' * (32 - len(title)))
now = int(time.time()) now = int(time.time())
nrecords = len(self._records) nrecords = len(self._records)
@ -866,4 +876,3 @@ class MobiWriter(object):
self._write(record) self._write(record)

View File

@ -785,7 +785,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
def _add_books(self, paths, to_device, on_card=None): def _add_books(self, paths, to_device, on_card=None):
if on_card is None: if on_card is None:
on_card = self.stack.currentIndex() >= 2 on_card = 'carda' if self.stack.currentIndex() == 2 else 'cardb' if self.stack.currentIndex() == 3 else None
if not paths: if not paths:
return return
from calibre.gui2.add import Adder from calibre.gui2.add import Adder
@ -795,7 +795,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
Dispatcher(self.__adder_func)) Dispatcher(self.__adder_func))
self._adder.add(paths) self._adder.add(paths)
def _files_added(self, paths=[], names=[], infos=[], on_card=False): def _files_added(self, paths=[], names=[], infos=[], on_card=None):
if paths: if paths:
self.upload_books(paths, self.upload_books(paths,
list(map(sanitize_file_name, names)), list(map(sanitize_file_name, names)),