def bytestring(self): buf = io.BytesIO() if isinstance(self.index, numbers.Integral): buf.write(encode_number_as_hex(self.index)) else: raw = bytearray(self.index.encode('ascii')) raw.insert(0, len(raw)) buf.write(bytes(raw)) et = self.entry_type buf.write(bytes(bytearray([et]))) if self.control_byte_count == 2: flags = 0 for attr in ('image_index', 'desc_offset', 'author_offset'): val = getattr(self, attr) if val is not None: tag = self.TAG_VALUES[attr] bm = TAGX.BITMASKS[tag] flags |= bm buf.write(bytes(bytearray([flags]))) for tag in self.tag_nums: attr = self.attr_for_tag(tag) val = getattr(self, attr) if isinstance(val, numbers.Integral): val = [val] for x in val: buf.write(encint(x)) if self.control_byte_count == 2: for attr in ('image_index', 'desc_offset', 'author_offset'): val = getattr(self, attr) if val is not None: buf.write(encint(val)) ans = buf.getvalue() return ans
def create_header(self, secondary=False): # {{{ buf = io.BytesIO() if secondary: tagx_block = TAGX().secondary else: tagx_block = (TAGX().periodical if self.is_periodical else TAGX().flat_book) header_length = 192 # Ident 0 - 4 buf.write(b'INDX') # Header length 4 - 8 buf.write(pack(b'>I', header_length)) # Unknown 8-16 buf.write(b'\0' * 8) # Index type: 0 - normal, 2 - inflection 16 - 20 buf.write(pack(b'>I', 2)) # IDXT offset 20-24 buf.write(pack(b'>I', 0)) # Filled in later # Number of index records 24-28 buf.write(pack(b'>I', 1 if secondary else len(self.records))) # Index Encoding 28-32 buf.write(pack(b'>I', 65001)) # utf-8 # Unknown 32-36 buf.write(b'\xff' * 4) # Number of index entries 36-40 indices = list( SecondaryIndexEntry.entries()) if secondary else self.indices buf.write(pack(b'>I', len(indices))) # ORDT offset 40-44 buf.write(pack(b'>I', 0)) # LIGT offset 44-48 buf.write(pack(b'>I', 0)) # Number of LIGT entries 48-52 buf.write(pack(b'>I', 0)) # Number of CNCX records 52-56 buf.write(pack(b'>I', 0 if secondary else len(self.cncx.records))) # Unknown 56-180 buf.write(b'\0' * 124) # TAGX offset 180-184 buf.write(pack(b'>I', header_length)) # Unknown 184-192 buf.write(b'\0' * 8) # TAGX block buf.write(tagx_block) num = len(indices) # The index of the last entry in the NCX idx = indices[-1].index if isinstance(idx, numbers.Integral): idx = encode_number_as_hex(idx) else: idx = idx.encode('ascii') idx = (bytes(bytearray([len(idx)]))) + idx buf.write(idx) # The number of entries in the NCX buf.write(pack(b'>H', num)) # Padding pad = (4 - (buf.tell() % 4)) % 4 if pad: buf.write(b'\0' * pad) idxt_offset = buf.tell() buf.write(b'IDXT') buf.write(pack(b'>H', header_length + len(tagx_block))) buf.write(b'\0') buf.seek(20) buf.write(pack(b'>I', idxt_offset)) return align_block(buf.getvalue())
def create_header(self, secondary=False): # {{{ buf = io.BytesIO() if secondary: tagx_block = TAGX().secondary else: tagx_block = (TAGX().periodical if self.is_periodical else TAGX().flat_book) header_length = 192 # Ident 0 - 4 buf.write(b'INDX') # Header length 4 - 8 buf.write(pack(b'>I', header_length)) # Unknown 8-16 buf.write(b'\0'*8) # Index type: 0 - normal, 2 - inflection 16 - 20 buf.write(pack(b'>I', 2)) # IDXT offset 20-24 buf.write(pack(b'>I', 0)) # Filled in later # Number of index records 24-28 buf.write(pack(b'>I', 1 if secondary else len(self.records))) # Index Encoding 28-32 buf.write(pack(b'>I', 65001)) # utf-8 # Unknown 32-36 buf.write(b'\xff'*4) # Number of index entries 36-40 indices = list(SecondaryIndexEntry.entries()) if secondary else self.indices buf.write(pack(b'>I', len(indices))) # ORDT offset 40-44 buf.write(pack(b'>I', 0)) # LIGT offset 44-48 buf.write(pack(b'>I', 0)) # Number of LIGT entries 48-52 buf.write(pack(b'>I', 0)) # Number of CNCX records 52-56 buf.write(pack(b'>I', 0 if secondary else len(self.cncx.records))) # Unknown 56-180 buf.write(b'\0'*124) # TAGX offset 180-184 buf.write(pack(b'>I', header_length)) # Unknown 184-192 buf.write(b'\0'*8) # TAGX block buf.write(tagx_block) num = len(indices) # The index of the last entry in the NCX idx = indices[-1].index if isinstance(idx, numbers.Integral): idx = encode_number_as_hex(idx) else: idx = idx.encode('ascii') idx = (bytes(bytearray([len(idx)]))) + idx buf.write(idx) # The number of entries in the NCX buf.write(pack(b'>H', num)) # Padding pad = (4 - (buf.tell()%4))%4 if pad: buf.write(b'\0'*pad) idxt_offset = buf.tell() buf.write(b'IDXT') buf.write(pack(b'>H', header_length + len(tagx_block))) buf.write(b'\0') buf.seek(20) buf.write(pack(b'>I', idxt_offset)) return align_block(buf.getvalue())