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:
raise ValueError(_('The reader has no storage card in this slot.'))
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':
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.compression.palmdoc import compress_doc
INDEXING = True
# TODO:
# - Optionally rasterize tables
@ -99,8 +101,7 @@ def decint(value, direction):
def align_block(raw, multiple=4, pad='\0'):
l = len(raw)
extra = l % multiple
extra = len(raw) % multiple
if extra == 0: return raw
return raw + pad*(multiple - extra)
@ -355,7 +356,7 @@ class MobiWriter(object):
def _generate_content(self):
self._map_image_names()
self._generate_text()
if not self.opts.no_mobi_index:
if INDEXING and not self.opts.no_mobi_index:
self._generate_index()
self._generate_images()
@ -406,6 +407,7 @@ class MobiWriter(object):
self._content_length = len(text)
self._text_length = len(text)
text = StringIO(text)
buf = []
nrecords = 0
offset = 0
if self._compression != UNCOMPRESSED:
@ -435,9 +437,13 @@ class MobiWriter(object):
lsize += 1
record.write(size)
self._records.append(record.getvalue())
buf.append(self._records[-1])
nrecords += 1
offset += RECORD_SIZE
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
def _generate_indxt(self, ctoc):
@ -448,7 +454,7 @@ class MobiWriter(object):
indices.write('IDXT')
c = 0
last_index = last_name = None
last_name = None
def add_node(node, offset, length, count):
if self.opts.verbose > 2:
@ -487,20 +493,19 @@ class MobiWriter(object):
length = self._content_length - offset
add_node(child, offset, length, c)
last_index = c
ctoc_offset = self._ctoc_map[child]
last_name = "%4d"%c
c += 1
return align_block(indxt.getvalue()), c, \
align_block(indices.getvalue()), last_index, last_name
align_block(indices.getvalue()), last_name
def _generate_index(self):
self._oeb.log('Generating index...')
self._primary_index_record = None
ctoc = self._generate_ctoc()
indxt, indxt_count, indices, last_index, last_name = \
indxt, indxt_count, indices, last_name = \
self._generate_indxt(ctoc)
indx1 = StringIO()
@ -529,7 +534,7 @@ class MobiWriter(object):
indx1.write(indices)
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)
indx0 = StringIO()
@ -666,6 +671,7 @@ class MobiWriter(object):
metadata = self._oeb.metadata
exth = self._build_exth()
last_content_record = len(self._records) - 1
if INDEXING:
self._generate_end_records()
record0 = StringIO()
# The PalmDOC Header
@ -827,6 +833,10 @@ class MobiWriter(object):
if index is not None:
exth.write(pack('>III', 0xca, 0x0c, index - 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()
trail = len(exth) % 4
pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte
@ -849,7 +859,7 @@ class MobiWriter(object):
def _write_header(self):
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)))
now = int(time.time())
nrecords = len(self._records)
@ -866,4 +876,3 @@ class MobiWriter(object):
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):
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:
return
from calibre.gui2.add import Adder
@ -795,7 +795,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
Dispatcher(self.__adder_func))
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:
self.upload_books(paths,
list(map(sanitize_file_name, names)),