This commit is contained in:
Kovid Goyal 2011-07-17 16:58:12 -06:00
parent dd2718abcd
commit 2b379f7ab8
2 changed files with 15 additions and 8 deletions

View File

@ -276,6 +276,7 @@ class MOBIHeader(object): # {{{
self.drm_flags = bin(struct.unpack(b'>I', self.raw[176:180])[0])
self.has_extra_data_flags = self.length >= 232 and len(self.raw) >= 232+16
self.has_fcis_flis = False
self.has_multibytes = self.has_indexing_bytes = self.has_uncrossable_breaks = False
if self.has_extra_data_flags:
self.unknown4 = self.raw[180:192]
self.first_content_record, self.last_content_record = \
@ -285,8 +286,11 @@ class MOBIHeader(object): # {{{
self.flis_count) = struct.unpack(b'>IIII',
self.raw[200:216])
self.unknown6 = self.raw[216:240]
self.extra_data_flags = bin(struct.unpack(b'>I',
self.raw[240:244])[0])
self.extra_data_flags = struct.unpack(b'>I',
self.raw[240:244])[0]
self.has_multibytes = bool(self.extra_data_flags & 0b1)
self.has_indexing_bytes = bool(self.extra_data_flags & 0b10)
self.has_uncrossable_breaks = bool(self.extra_data_flags & 0b100)
self.primary_index_record, = struct.unpack(b'>I',
self.raw[244:248])
@ -347,7 +351,10 @@ class MOBIHeader(object): # {{{
ans.append('FLIS number: %d'% self.flis_number)
ans.append('FLIS count: %d'% self.flis_count)
ans.append('Unknown6: %r'% self.unknown6)
ans.append('Extra data flags: %r'%self.extra_data_flags)
ans.append(('Extra data flags: %s (has multibyte: %s) '
'(has indexing: %s) (has uncrossable breaks: %s)')%(
bin(self.extra_data_flags), self.has_multibytes,
self.has_indexing_bytes, self.has_uncrossable_breaks ))
ans.append('Primary index record (null value: %d): %d'%(0xffffffff,
self.primary_index_record))
@ -489,11 +496,12 @@ class IndexHeader(object): # {{{
return '\n'.join(ans)
# }}}
class IndexEntry(object):
class IndexEntry(object): # {{{
def __init__(self, ident, entry_type, raw):
self.id = ident
self.entry_type = entry_type
# }}}
class IndexRecord(object): # {{{

View File

@ -18,8 +18,7 @@ from calibre.ebooks.compression.palmdoc import compress_doc
from calibre.ebooks.mobi.langcodes import iana2mobi
from calibre.utils.filenames import ascii_filename
from calibre.ebooks.mobi.writer2 import PALMDOC, UNCOMPRESSED
from calibre.ebooks.mobi.writer2.utils import (rescale_image, decint,
DECINT_FORWARD, DECINT_BACKWARD)
from calibre.ebooks.mobi.writer2.utils import (rescale_image, encint)
EXTH_CODES = {
'creator': 100,
@ -167,13 +166,13 @@ class MobiWriter(object):
# the next record.
while breaks and (breaks[0] - offset) < RECORD_SIZE:
pbreak = (breaks.pop(0) - running) >> 3
encoded = decint(pbreak, DECINT_FORWARD)
encoded = encint(pbreak)
record.write(encoded)
running += pbreak << 3
nextra += len(encoded)
lsize = 1
while True:
size = decint(nextra + lsize, DECINT_BACKWARD)
size = encint(nextra + lsize, forward=False)
if len(size) == lsize:
break
lsize += 1