mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-11 09:13:57 -04:00
More MOBI indexing fixes
This commit is contained in:
commit
f77c8345b9
@ -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)
|
||||
|
@ -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,7 +671,8 @@ class MobiWriter(object):
|
||||
metadata = self._oeb.metadata
|
||||
exth = self._build_exth()
|
||||
last_content_record = len(self._records) - 1
|
||||
self._generate_end_records()
|
||||
if INDEXING:
|
||||
self._generate_end_records()
|
||||
record0 = StringIO()
|
||||
# The PalmDOC Header
|
||||
record0.write(pack('>HHIHHHH', self._compression, 0,
|
||||
@ -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)
|
||||
|
||||
|
||||
|
||||
|
@ -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)),
|
||||
|
Loading…
x
Reference in New Issue
Block a user