mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
...
This commit is contained in:
parent
dd2718abcd
commit
2b379f7ab8
@ -276,6 +276,7 @@ class MOBIHeader(object): # {{{
|
|||||||
self.drm_flags = bin(struct.unpack(b'>I', self.raw[176:180])[0])
|
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_extra_data_flags = self.length >= 232 and len(self.raw) >= 232+16
|
||||||
self.has_fcis_flis = False
|
self.has_fcis_flis = False
|
||||||
|
self.has_multibytes = self.has_indexing_bytes = self.has_uncrossable_breaks = False
|
||||||
if self.has_extra_data_flags:
|
if self.has_extra_data_flags:
|
||||||
self.unknown4 = self.raw[180:192]
|
self.unknown4 = self.raw[180:192]
|
||||||
self.first_content_record, self.last_content_record = \
|
self.first_content_record, self.last_content_record = \
|
||||||
@ -285,8 +286,11 @@ class MOBIHeader(object): # {{{
|
|||||||
self.flis_count) = struct.unpack(b'>IIII',
|
self.flis_count) = struct.unpack(b'>IIII',
|
||||||
self.raw[200:216])
|
self.raw[200:216])
|
||||||
self.unknown6 = self.raw[216:240]
|
self.unknown6 = self.raw[216:240]
|
||||||
self.extra_data_flags = bin(struct.unpack(b'>I',
|
self.extra_data_flags = struct.unpack(b'>I',
|
||||||
self.raw[240:244])[0])
|
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.primary_index_record, = struct.unpack(b'>I',
|
||||||
self.raw[244:248])
|
self.raw[244:248])
|
||||||
|
|
||||||
@ -347,7 +351,10 @@ class MOBIHeader(object): # {{{
|
|||||||
ans.append('FLIS number: %d'% self.flis_number)
|
ans.append('FLIS number: %d'% self.flis_number)
|
||||||
ans.append('FLIS count: %d'% self.flis_count)
|
ans.append('FLIS count: %d'% self.flis_count)
|
||||||
ans.append('Unknown6: %r'% self.unknown6)
|
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,
|
ans.append('Primary index record (null value: %d): %d'%(0xffffffff,
|
||||||
self.primary_index_record))
|
self.primary_index_record))
|
||||||
|
|
||||||
@ -489,11 +496,12 @@ class IndexHeader(object): # {{{
|
|||||||
return '\n'.join(ans)
|
return '\n'.join(ans)
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
class IndexEntry(object):
|
class IndexEntry(object): # {{{
|
||||||
|
|
||||||
def __init__(self, ident, entry_type, raw):
|
def __init__(self, ident, entry_type, raw):
|
||||||
self.id = ident
|
self.id = ident
|
||||||
self.entry_type = entry_type
|
self.entry_type = entry_type
|
||||||
|
# }}}
|
||||||
|
|
||||||
class IndexRecord(object): # {{{
|
class IndexRecord(object): # {{{
|
||||||
|
|
||||||
|
@ -18,8 +18,7 @@ from calibre.ebooks.compression.palmdoc import compress_doc
|
|||||||
from calibre.ebooks.mobi.langcodes import iana2mobi
|
from calibre.ebooks.mobi.langcodes import iana2mobi
|
||||||
from calibre.utils.filenames import ascii_filename
|
from calibre.utils.filenames import ascii_filename
|
||||||
from calibre.ebooks.mobi.writer2 import PALMDOC, UNCOMPRESSED
|
from calibre.ebooks.mobi.writer2 import PALMDOC, UNCOMPRESSED
|
||||||
from calibre.ebooks.mobi.writer2.utils import (rescale_image, decint,
|
from calibre.ebooks.mobi.writer2.utils import (rescale_image, encint)
|
||||||
DECINT_FORWARD, DECINT_BACKWARD)
|
|
||||||
|
|
||||||
EXTH_CODES = {
|
EXTH_CODES = {
|
||||||
'creator': 100,
|
'creator': 100,
|
||||||
@ -167,13 +166,13 @@ class MobiWriter(object):
|
|||||||
# the next record.
|
# the next record.
|
||||||
while breaks and (breaks[0] - offset) < RECORD_SIZE:
|
while breaks and (breaks[0] - offset) < RECORD_SIZE:
|
||||||
pbreak = (breaks.pop(0) - running) >> 3
|
pbreak = (breaks.pop(0) - running) >> 3
|
||||||
encoded = decint(pbreak, DECINT_FORWARD)
|
encoded = encint(pbreak)
|
||||||
record.write(encoded)
|
record.write(encoded)
|
||||||
running += pbreak << 3
|
running += pbreak << 3
|
||||||
nextra += len(encoded)
|
nextra += len(encoded)
|
||||||
lsize = 1
|
lsize = 1
|
||||||
while True:
|
while True:
|
||||||
size = decint(nextra + lsize, DECINT_BACKWARD)
|
size = encint(nextra + lsize, forward=False)
|
||||||
if len(size) == lsize:
|
if len(size) == lsize:
|
||||||
break
|
break
|
||||||
lsize += 1
|
lsize += 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user