def add_toc(hd, size, data): off = 0 i = 1 while off + 6 <= size: (tag, off) = rdata(data, off, '<H') add_iter(hd, 'Stream tag %d' % i, key2txt(tag, stream_tags), off - 2, 2, '<H') (offset, off) = rdata(data, off, '<I') add_iter(hd, 'Offset to %s' % key2txt(tag, stream_tags), offset, off - 4, 4, '<I') i += 1
def parse_section(self, n): (begin, end) = self.sections[n] name = key2txt(n, wt602_section_names, 'Section %d' % n) func = key2txt(n, wt602_section_handlers, None) adder = 0 if end > begin: handler = None if func != None: (handler, adder) = func sectiter = add_pgiter(self.page, name, 'wt602', adder, self.data[begin:end], self.parent) if handler != None: handler(self.page, self.data[begin:end], sectiter, self)
def add_cell_style_def(hd, size, data, off): (style, off) = rdata(data, off, '<B') add_iter(hd, 'Style?', style, off - 1, 1, '<B') (type, off) = rdata(data, off, '<B') type_map = {0: 'user defined', 0x80: 'predefined'} add_iter(hd, 'Type?', key2txt(type, type_map), off - 1, 1, '<B') (name_length, off) = rdata(data, off, '<B') add_iter(hd, 'Name length', name_length, off - 1, 1, '<B') (name_type, off) = rdata(data, off, '<B') name_type_map = {0: 'user defined', 0xff: 'predefined'} add_iter(hd, 'Name type?', key2txt(name_type, name_type_map), off - 1, 1, '<B') if name_type != 0xff: name_length -= 1 # It seems the last byte of the name is not saved because of a bug (name, off) = rdata(data, off, '%ds' % name_length) add_iter(hd, 'Name', name, off - name_length, name_length, '<%ds' % name_length)
def add_obj_rectangle(view, data, offset): off = _add_obj_shape(view, data, offset) # TODO: It's not clear if the dims are relative to canvas or to the # shape's origin. All rectangles I've seen've had offset (0, 0). (tl_x, off) = rdata(data, off, '<i') view.add_iter('Top left corner X', tl_x, off - 4, 4, '<i') (tl_y, off) = rdata(data, off, '<i') view.add_iter('Top left corner Y', tl_y, off - 4, 4, '<i') (tr_x, off) = rdata(data, off, '<i') view.add_iter('Top right corner X', tr_x, off - 4, 4, '<i') (tr_y, off) = rdata(data, off, '<i') view.add_iter('Top right corner Y', tr_y, off - 4, 4, '<i') (br_x, off) = rdata(data, off, '<i') view.add_iter('Bottom right corner X', br_x, off - 4, 4, '<i') (br_y, off) = rdata(data, off, '<i') view.add_iter('Bottom right corner Y', br_y, off - 4, 4, '<i') (bl_x, off) = rdata(data, off, '<i') view.add_iter('Bottom left corner X', bl_x, off - 4, 4, '<i') (bl_y, off) = rdata(data, off, '<i') view.add_iter('Bottom left corner Y', bl_y, off - 4, 4, '<i') corner_types = {1: 'normal', 2: 'round', 3: 'round in', 4: 'cut'} (corner, off) = rdata(data, off, '<H') view.add_iter('Corner type', key2txt(corner, corner_types), off - 2, 2, '<H') (rounding, off) = rdata(data, off, '<H') view.add_iter('Rounding', '%.3fin' % (rounding * 0.02028), off - 2, 2, '<H') off = _add_point_list(view, data, off) return off
def add_cell_type(hd, size, data): off = add_record(hd, size, data) type_map = {0: 'default', 1: 'text'} (typ, off) = rdata(data, off, '<B') add_iter(hd, 'Type', key2txt(typ, type_map), off - 1, 1, '<B') off += 2 add_range(hd, size, data, off)
def add_paragraph(hd, size, data): fmt = { 0x2: 'Switch bold', 0x4: 'Switch italics', 0xa: 'Line break', 0xf: 'Switch wide', 0x10: 'Switch high', 0x13: 'Switch underline', 0x14: 'Switch subscript', 0x16: 'Switch superscript', 0x1a: 'End of file', 0x1d: 'Switch big', } off = 0 mark = 0 while off < len(data): (c, off) = rdata(data, off, '<B') if c < 0x20: if off - mark > 1: length = off - mark - 1 add_iter(hd, 'Text', data[mark:off - 1], mark, length, '%ds' % length) mark = off if c == 0xd and off == len(data) - 1: add_iter(hd, 'End of paragraph', data[-2:], off - 1, 2, '2s') off += 1 else: add_iter(hd, key2txt(c, fmt), '', off - 1, 1, '<B')
def add_alignment(hd, size, data): off = add_record(hd, size, data) align_map = {0: 'default', 1: 'left', 2: 'center', 3: 'right', 4: 'fill'} (align, off) = rdata(data, off, '<B') add_iter(hd, 'Alignment', key2txt(align, align_map), off - 1, 1, '<B') off += 2 add_range(hd, size, data, off)
def add_font(hd, size, data): off = add_record(hd, size, data) font_map = {0: 'normal', 1: 'italic', 2: 'bold', 3: 'high', 4: 'gray'} (font, off) = rdata(data, off, '<B') add_iter(hd, 'Font', key2txt(font, font_map), off - 1, 1, '<B') off += 2 add_range(hd, size, data, off)
def chop_tag_f533(hd, size, data): (rule, off) = rdata(data, 2, '<H') rule_map = {0x12: 'horizontal adjustable', 0x14: 'horizontal fixed', 0x21: 'vertical adjustable', 0x22: 'block adjustable', 0x41: 'vertical fixed', 0x44: 'block fixed'} rule_str = key2txt(int(rule), rule_map) add_iter(hd, 'Rule', rule_str, off - 2, 2, '<H')
def add_cell_style(hd, size, data, off): (attrs, off) = rdata(data, off, '<H') add_iter(hd, 'Text attributes', attrs, off - 2, 2, '<H') numfmt_map = { 0x0: 'Generic', 0x1: '0', 0x2: '0.00', 0x3: '#,##0', 0x4: '#,##0,00', 0x9: '0%', 0xa: '0.00%', 0xb: '0.00E+00', 0xe: 'm/d/yy', 0xf: 'd/mmm/yy', 0x10: 'd/mmm', 0x11: 'mmm/yy', 0x14: 'h:mm', 0x15: 'h:mm:ss', 0x16: 'm/d/yy h:mm', 0x2a: '"$"#,##0', 0x2c: '"$"#,##0.00', 0x30: '##0.0E+0', 0x31: 'Text', } (numfmt, off) = rdata(data, off, '<H') add_iter(hd, 'Number format', key2txt(numfmt, numfmt_map), off - 2, 2, '<H') (style, off) = rdata(data, off, '<H') type_map = {1: 'named', 5: 'anonymous'} type = style & 0xf add_iter(hd, 'Type', key2txt(type, type_map), off - 2, 1, '<B') if type == 1: add_iter(hd, 'Real style?', style >> 4, off - 2, 2, '<H') halign_map = {0: 'generic', 1: 'left', 2: 'center', 3: 'right', 4: 'repeat', 5: 'paragraph', 6: 'selection center'} valign_map = {0: 'top', 1: 'center', 2: 'bottom', 3: 'paragraph'} (align, off) = rdata(data, off, '<B') add_iter(hd, 'Vertical alignment', key2txt(align >> 4, valign_map), off - 1, 1, '<B') add_iter(hd, 'Wrap text', bool(align & 0x8), off - 1, 1, '<B') add_iter(hd, 'Horizontal alignment', key2txt(align & 0x7, valign_map), off - 1, 1, '<B') orient_map = {0x10: 'horizontal', 0x12: 'vertical 90 degrees', 0x13: 'vertical 270 degrees'} (orient, off) = rdata(data, off, '<B') add_iter(hd, 'Text orientation?', key2txt(orient, orient_map), off - 1, 1, '<B') (color, off) = rdata(data, off, '<B') # TODO: verify this add_iter(hd, 'Color index', color - 0x80, off - 1, 1, '<B') (pattern, off) = rdata(data, off, '<B') add_iter(hd, 'Fill pattern?', pattern, off - 1, 1, '<B') border_map = {0: 'none', 1: 'line', 2: 'thick line', 3: 'dashed', 4: 'dashed 2', 5: 'very thick line', 6: 'double', 7: 'dotted'} (bottom, off) = rdata(data, off, '<H') add_iter(hd, 'Bottom', border_map[(bottom >> 6) & 0x7], off - 2, 2, '<H') add_iter(hd, 'Bottom color index', bottom >> 9, off - 2, 2, '<H') (others, off) = rdata(data, off, '<I') add_iter(hd, 'Top', border_map[others & 0x7], off - 4, 4, '<I') add_iter(hd, 'Left', border_map[(others >> 3) & 0x7], off - 4, 4, '<I') add_iter(hd, 'Right', border_map[(others >> 6) & 0x7], off - 4, 4, '<I') add_iter(hd, 'Top color index', (others >> 9) & 0x7f, off - 4, 4, '<I') add_iter(hd, 'Left color index', (others >> 16) & 0x7f, off - 4, 4, '<I') add_iter(hd, 'Right color index', (others >> 23) & 0x7f, off - 4, 4, '<I')
def add_attrset_para(hd, size, data): off = 0 (alignment, off) = rdata(data, off, '<H') alignment_map = values({0: 'left', 1: 'center', 2: 'right', 3: 'justify'}) add_iter(hd, 'Alignment', alignment_map(alignment), off - 2, 2, '<H') (left, off) = rdata(data, off, '<H') add_iter(hd, 'Left indent', '%.2fcm' % to_cm(left), off - 2, 2, '<H') (right, off) = rdata(data, off, '<H') add_iter(hd, 'Right indent', '%.2fcm' % to_cm(right), off - 2, 2, '<H') (first_line, off) = rdata(data, off, '<H') add_iter(hd, 'First line indent', '%.2fcm' % to_cm(first_line), off - 2, 2, '<H') (tabs, off) = rdata(data, off, '<H') add_iter(hd, 'Tabs', tabs, off - 2, 2, '<H') (column_gap, off) = rdata(data, off, '<H') add_iter(hd, 'Column gap', '%.2fcm' % to_cm(column_gap), off - 2, 2, '<H') (columns, off) = rdata(data, off, '<H') add_iter(hd, 'Number of columns', columns, off - 2, 2, '<H') (top, off) = rdata(data, off, '<H') add_iter(hd, 'Top margin', '%.2fpt' % (top / 20.0), off - 2, 2, '<H') (bottom, off) = rdata(data, off, '<H') add_iter(hd, 'Bottom margin', '%.2fpt' % (bottom / 20.0), off - 2, 2, '<H') (shading, off) = rdata(data, off, '<H') shading_map = values({ 0: 'none', 5: 'vertical lines', 6: 'raster', 12: '100%', 16: '50%', 18: '25%', 19: '0%' }) add_iter(hd, 'Shading type', shading_map(shading), off - 2, 2, '<H') (border_line, off) = rdata(data, off, '<H') add_iter(hd, 'Border line', key2txt(border_line, line_map), off - 2, 2, '<H') (border, off) = rdata(data, off, '<H') # TODO: complete border_map = values({ 0: 'none', 1: 'all', 2: 'top', 3: 'bottom', 4: 'top + bottom', 5: 'left', 6: 'right', 7: 'left + right', 8: 'top + left' }) add_iter(hd, 'Border type', border_map(border), off - 2, 2, '<H') off += 4 (line_height, off) = rdata(data, off, '<H') add_iter(hd, 'Line height', '%d%%' % line_height, off - 2, 2, '<H') off += 4 (section_height, off) = rdata(data, off, '<H') add_iter(hd, 'Section height', '%.2fcm' % to_cm(section_height), off - 2, 2, '<H') (section_inc, off) = rdata(data, off, '<H') add_iter(hd, 'Section increment', '%.2fcm' % to_cm(section_inc), off - 2, 2, '<H') off += 4 (column_line, off) = rdata(data, off, '<H') add_iter(hd, 'Inter-column line', key2txt(column_line, line_map), off - 2, 2, '<H')
def add_offsets(hd, size, data): off = 0 i = 0 while off + 4 <= size: (offset, off) = rdata(data, off, '<I') name = key2txt(i, wt602_section_names, 'Section %d' % i) add_iter(hd, name, offset, off - 4, 4, '<I') i += 1
def add_style(view, data, offset, length): off = offset + 2 type_map = {0: 'solid', 1: 'dash', 2: 'long dash', 3: 'dash dot', 4: 'dash dot dot'} (typ, off) = rdata(data, off, '<B') view.add_iter('Type', key2txt(typ, type_map), off - 1, 1, '<B') # TODO: the list is likely the same as in ZMF2 arrow_map = {0: 'none', 1: 'circle', 2: 'line'} (start, off) = rdata(data, off, '<B') view.add_iter('Start arrow', key2txt(start, arrow_map), off - 1, 1, '<B') (end, off) = rdata(data, off, '<B') view.add_iter('End arrow', key2txt(end, arrow_map), off - 1, 1, '<B') (pen_color, off) = rdata(data, off, '<I') view.add_iter('Pen color', '#%x' % pen_color, off - 4, 4, '<I') off += 7 (fill_color, off) = rdata(data, off, '<I') view.add_iter('Fill color', '#%x' % fill_color, off - 4, 4, '<I') return offset + length
def chop_tag_f535(hd, size, data): (layout, off) = rdata(data, 2, '<H') layout_map = { 0x41: 'top-to-bottom right-to-left', 0x34: 'left-to-right top-to-bottom' } layout_str = key2txt(int(layout), layout_map) add_iter(hd, 'Layout', layout_str, off - 2, 2, '<H')
def parse(self): off = 0 while off < len(self.data): eol = self.data.find("\r\n", off) if eol > 0: end = eol + 2 else: end = len(self.data) data = self.data[off:end] off = end if data[0] == '@': add_pgiter(self.page, key2txt(data[1:3], controls, 'Control'), 't602', 'control', data, self.parent) elif data[0] == '.': (cmd, dummy) = read_command(data) add_pgiter(self.page, key2txt(cmd.upper(), commands, 'Command'), 't602', 'command', data, self.parent) else: add_pgiter(self.page, 'Paragraph', 't602', 'paragraph', data, self.parent)
def add_address(off): (row, off) = rdata(data, off, '<H') add_iter(hd, 'Row', format_row(row & 0x3fff), off - 2, 2, '<H') rel = (row >> 14) & 0x3 add_iter(hd, 'Relative', key2txt(rel, rel_map), off - 1, 1, '<B') (col, off) = rdata(data, off, '<B') add_iter(hd, 'Column', format_column(col), off - 1, 1, '<B') return off
def add_chart_type(hd, size, data, off): (typ, off) = rdata(data, off, '<B') type_map = { # 2D 0x0: 'column', 0x1: 'column - stacked', 0x2: 'column with overlap', 0x3: 'column - percent stacked', 0x4: 'column with values', 0x5: 'bar', 0x6: 'bar - stacked', 0x7: 'bar with overlap', 0x8: 'bar - percent stacked', 0x9: 'bar with values', 0xa: 'area - stacked', 0xb: 'area - percent stacked', 0xc: 'pie', 0xd: 'pie with values', 0xe: 'pie - percent', 0xf: 'XY - points only', 0x10: 'XY - points and lines', 0x11: 'line - lines only', 0x12: 'line - points and lines', 0x13: 'points', 0x14: 'joined points', 0x15: 'joined', # 3D 0x16: '3D column', 0x17: '3D column - deep', 0x18: '3D column cylinder - deep', 0x19: '3D column pyramid - deep', 0x1a: '3D bar', 0x1b: '3D bar - deep', 0x1c: '3D bar cylinder - deep', 0x1d: '3D bar pyramid - deep', 0x1e: '3D lines', 0x1f: '3D area', 0x20: '3D pie', 0x21: '3D pie with values', 0x22: '3D pie - percent', } add_iter(hd, 'Type', key2txt(typ, type_map), off - 1, 1, '<B') (two_d, off) = rdata(data, off, '<B') add_iter(hd, 'Selected 2D', key2txt(two_d, type_map), off - 1, 1, '<B') (three_d, off) = rdata(data, off, '<B') add_iter(hd, 'Selected 3D', key2txt(three_d, type_map), off - 1, 1, '<B')
def add_command(hd, size, data): (name, off) = read_command(data) add_iter(hd, 'Name', key2txt(name.upper(), commands), 1, off - 1, '%ds' % (off - 1)) if data[off] == ' ': off += 1 length = size - 2 - off (arg, off) = rdata(data, off, '%ds' % length) add_iter(hd, 'Argument', arg, off - length, length, '%ds' % length) add_iter(hd, 'End of command', data[off:], off, len(data) - off, '%ds' % (len(data) - off))
def add_3d(hd, size, data): off = 0 (desc, off) = rdata(data, off, '<B') add_iter(hd, 'Double description of values', bool(desc), off - 1, 1, '<B') (raster, off) = rdata(data, off, '<B') add_iter(hd, 'Series raster', bool(raster), off - 1, 1, '<B') depth_map = {0: 'small', 1: 'medium', 2: 'large'} (depth, off) = rdata(data, off, '<B') add_iter(hd, 'Series depth', key2txt(depth, depth_map), off - 1, 1, '<B')
def add_obj_point(view, data, offset): (x, off) = rdata(data, offset, '<i') view.add_iter('X', x, off - 4, 4, '<i') (y, off) = rdata(data, off, '<i') view.add_iter('Y', y, off - 4, 4, '<i') type_map = {1: 'Line point?', 2: 'Curve point?', 3: 'Curve control point?',} (typ, off) = rdata(data, off, '<B') view.add_iter('Type?', key2txt(typ, type_map), off - 1, 1, '<B') return off
def add_obj(view, data, offset, length): (obj, off) = rdata(data, offset, '<H') view.add_iter('Type', key2txt(obj, obj_names), off - 2, 2, '<H') if obj in obj_names: view.set_label(obj_names[obj]) if obj in obj_handlers: off = obj_handlers[obj](view, data, off) else: off = offset + length view.set_length(off - offset) return off
def chop_tag_f5d1(hd, size, data): (width, off) = rdata(data, 2, '<H') add_iter(hd, 'Width', width, off - 2, 2, '<H') (height, off) = rdata(data, off, '<H') add_iter(hd, 'Height', height, off - 2, 2, '<H') (oid, off) = rdata(data, off, '<I') add_iter(hd, 'Object ID', '0x%x' % oid, off - 4, 4, '<I') (adjustment, off) = rdata(data, off, '<H') adjustment_map = {1: 'top', 2: 'center', 3: 'baseline', 4: 'bottom'} adjustment_str = key2txt(int(adjustment), adjustment_map) add_iter(hd, 'Adjustment', adjustment_str, off - 2, 2, '<H')
def chop_tag_f57a(hd, size, data): (mode, off) = rdata(data, 2, '<H') mode_map = { 0x0: 'none', 0x10: 'solid', 0x20: 'dashed', 0x30: 'double', 0x40: 'dotted' } mode_str = key2txt(int(mode), mode_map) add_iter(hd, 'Mode', mode_str, off - 2, 2, '<H')
def add_control(hd, size, data): off = 1 (name, off) = rdata(data, off, '2s') add_iter(hd, 'Name', key2txt(name, controls), off - 2, 2, '2s') if data[-1] == '\x1a': end = len(data) - 1 else: end = len(data) - 2 off += 1 if off < end: value = data[off:end] encoding_map = {'0': 'KEYBCS2', '1': 'LATIN2', '2': 'KOI8CS'} line_height_map = {'6': '1', '4': '1.5', '3': '2'} if name == 'CT': value = key2txt(value.strip(), encoding_map) elif name == 'LH': value = key2txt(value.strip(), line_height_map) add_iter(hd, 'Value', value, off, end - off, '%ds' % (end - off)) off = end add_iter(hd, 'End of control', data[off:], off, len(data) - off, '%ds' % (len(data) - off))
def add_legend(hd, size, data): off = add_section(hd, size, data) (hide, off) = rdata(data, off, '<B') add_iter(hd, 'Hide', bool(hide), off - 1, 1, '<B') location_map = {1: 'bottom', 2: 'left', 3: 'right'} (location, off) = rdata(data, off, '<B') add_iter(hd, 'Location', key2txt(location, location_map), off - 1, 1, '<B') (rank, off) = rdata(data, off, '<B') add_iter(hd, 'Reversed rank of categories', bool(rank), off - 1, 1, '<B') (switch, off) = rdata(data, off, '<B') add_iter(hd, 'Switch series and categories', bool(switch), off - 1, 1, '<B')
def chop_tag_f548(hd, size, data): (pos, off) = rdata(data, 2, '<H') pos_map = { 1: 'bottom left', 2: 'bottom right', 3: 'top right', 4: 'top left', 5: 'base' } pos_str = key2txt(int(pos), pos_map) add_iter(hd, 'Position', pos_str, off - 2, 2, '<H')
def add_obj(view, data, offset, length): (obj, off) = rdata(data, offset, '<H') view.add_iter('Type', key2txt(obj, obj_names), off - 2, 2, '<H') if obj_names.has_key(obj): view.set_label(obj_names[obj]) if obj_handlers.has_key(obj): off = obj_handlers[obj](view, data, off) else: off = offset + length view.set_length(off - offset) return off
def add_control(hd, size, data): off = 1 (name, off) = rdata(data, off, '2s') add_iter(hd, 'Name', key2txt(name, controls), off - 2, 2, '2s') if data[-1] == '\x1a': end = len(data) - 1 else: end = len(data) - 2 off += 1 if off < end: value = data[off:end] encoding_map = {'0': 'KEYBCS2', '1': 'LATIN2', '2': 'KOI8CS'} line_height_map = {'6': '100%', '4': '150%', '3': '200%'} if name == 'CT': value = key2txt(value.strip(), encoding_map) elif name == 'LH': value = key2txt(value.strip(), line_height_map) add_iter(hd, 'Value', value, off, end - off, '%ds' % (end - off)) off = end add_iter(hd, 'End of control', data[off:], off, len(data) - off, '%ds' % (len(data) - off))
def add_text_style(view, data, offset, length): off = offset + 0x12 (font, off) = rdata(data, off, '32s') view.add_iter('Font name', font[0:font.find('\0')], off - 32, 32, '32s') (size, off) = rdata(data, off, '<f') align_map = {0: 'left', 1: 'center', 2: 'right'} view.add_iter('Font size', '%.1fpt' % size, off - 4, 4, '<f') (align, off) = rdata(data, off, '<H') view.add_iter('Alignment', key2txt(align, align_map), off - 2, 2, '<H') (spacing, off) = rdata(data, off, '<H') view.add_iter('Line spacing', '%d%%' % spacing, off - 2, 2, '<H') return offset + length
def add_section(hd, size, data): off = 0 off = add_text(hd, size, data, 0, 'Label') if off < 0x51: add_iter(hd, 'Junk', '', off, 0x51 - off, '%ds' % (0x51 - off)) off = 0x51 font_map = {1: 'Triplex', 2: 'Small', 3: 'Sans Serif'} (font, off) = rdata(data, off, '<B') add_iter(hd, 'Font', key2txt(font, font_map), off - 1, 1, '<B') (border, off) = rdata(data, off, '<B') add_iter(hd, 'Border', bool(border), off - 1, 1, '<B') return off
def add_frame_data(hd, size, data): off = 4 type_map = { 0x1: 'rectangle', 0x14: 'line', 0xba: 'compound brackets', } (typ, off) = rdata(data, off, '<H') add_iter(hd, 'Shape type', key2txt(typ, type_map), off - 2, 2, '<H') off += 6 (tagslen, off) = rdata(data, off, '<H') add_iter(hd, 'Length of tag list', tagslen, off - 2, 2, '<H') end = off + tagslen assert end <= size tag_map = { } while off < end: off += 2 (tag, off) = rdata(data, off, '<B') add_iter(hd, 'Tag', key2txt(tag, tag_map), off - 1, 1, '<B') off += 3
def chop_tag_f533(hd, size, data): (rule, off) = rdata(data, 2, '<H') rule_map = { 0x12: 'horizontal adjustable', 0x14: 'horizontal fixed', 0x21: 'vertical adjustable', 0x22: 'block adjustable', 0x41: 'vertical fixed', 0x44: 'block fixed' } rule_str = key2txt(int(rule), rule_map) add_iter(hd, 'Rule', rule_str, off - 2, 2, '<H')
def add_field(hd, size, data): (key, off) = read_var(data, 0) field_num = key >> 3 wire_type = key & 0x7 wire_type_map = {0: 'Varint', 1: '64-bit', 2: 'Length-delimited', 3: 'Start group', 4: 'End group', 5: '32-bit'} add_iter(hd, 'Field', field_num, 0, off, '%ds' % off) add_iter(hd, 'Wire type', key2txt(wire_type, wire_type_map), 0, off, '%ds' % off) if wire_type == 2: len_off = off (length, off) = read_var(data, off) add_iter(hd, 'Length', length, len_off, off - len_off, '%ds' % (off - len_off)) return off
def add_obj_point(view, data, offset): (x, off) = rdata(data, offset, '<i') view.add_iter('X', x, off - 4, 4, '<i') (y, off) = rdata(data, off, '<i') view.add_iter('Y', y, off - 4, 4, '<i') type_map = { 1: 'Line point?', 2: 'Curve point?', 3: 'Curve control point?', } (typ, off) = rdata(data, off, '<B') view.add_iter('Type?', key2txt(typ, type_map), off - 1, 1, '<B') return off
def wrapper(hd, size, data): off = 0 (sz, off) = rdata(data, off, '<h') add_iter(hd, 'Size', abs(sz), off - 2, 2, '<h') compressed = 0 if sz > 0: (typ, off) = rdata(data, off, '<H') add_iter(hd, 'Type', key2txt(typ, WLS_RECORDS, ('Unknown',))[0], off - 2, 2, '<H') else: (compressed, off) = rdata(data, off, '<H') add_iter(hd, 'Compressed bytes', compressed, off - 2, 2, '<H') if wrapped: wrapped(hd, size, data, off)
def add_tile_row(hd, size, data): # The IDs point to appropriate data lists (c.f. table model) off = 2 type_map = {0: 'empty', 2: 'number', 3: 'simple text', 5: 'date', 6: 'formula', 7: 'duration', 9: 'paragraph text'} (typ, off) = rdata(data, off, '<B') add_iter(hd, 'Cell type', key2txt(typ, type_map), off - 1, 1, '<B') off += 1 flags_set = { 0x2: 'style', 0x4: 'format', 0x8: 'formula', 0x10: 'simple text', 0x20: 'number', 0x40: 'date', 0x200: 'paragraph text', 0xc00: 'conditional format', 0x1000: 'comment', } (flags, off) = rdata(data, off, '<H') add_iter(hd, 'Flags', bflag2txt(flags, flags_set), off - 2, 2, '<H') off += 6 # NOTE: the order is rather experimental; I originally thought the items are sorted by numeric value of the flag, # but apparently that's not the case. Sigh... if flags & 0x2: (style, off) = rdata(data, off, '<I') add_iter(hd, 'Style ID', style, off - 4, 4, '<I') if flags & 0xc00: (fmt, off) = rdata(data, off, '<I') add_iter(hd, 'Conditional format ID', fmt, off - 4, 4, '<I') off += 4 if flags & 0x4: (fmt, off) = rdata(data, off, '<I') add_iter(hd, 'Format ID', fmt, off - 4, 4, '<I') if flags & 0x8: (formula, off) = rdata(data, off, '<I') add_iter(hd, 'Formula ID', formula, off - 4, 4, '<I') if flags & 0x10: (text, off) = rdata(data, off, '<I') add_iter(hd, 'Simple text ID', text, off - 4, 4, '<I') if flags & 0x1000: (comment, off) = rdata(data, off, '<I') add_iter(hd, 'Comment ID', comment, off - 4, 4, '<I') if flags & 0x20: (value, off) = rdata(data, off, '<d') value_str = value if typ == 7: value_str = '%.1f s' % value add_iter(hd, 'Value', value_str, off - 8, 8, '<d') if flags & 0x40: (date, off) = rdata(data, off, '<d') add_iter(hd, 'Date', date, off - 8, 8, '<d') if flags & 0x200: (text, off) = rdata(data, off, '<I') add_iter(hd, 'Paragraph text ID', text, off - 4, 4, '<I')
def add_style(view, data, offset, length): off = offset + 2 type_map = { 0: 'solid', 1: 'dash', 2: 'long dash', 3: 'dash dot', 4: 'dash dot dot' } (typ, off) = rdata(data, off, '<B') view.add_iter('Type', key2txt(typ, type_map), off - 1, 1, '<B') # TODO: the list is likely the same as in ZMF2 arrow_map = {0: 'none', 1: 'circle', 2: 'line'} (start, off) = rdata(data, off, '<B') view.add_iter('Start arrow', key2txt(start, arrow_map), off - 1, 1, '<B') (end, off) = rdata(data, off, '<B') view.add_iter('End arrow', key2txt(end, arrow_map), off - 1, 1, '<B') (pen_color, off) = rdata(data, off, '<I') view.add_iter('Pen color', '#%x' % pen_color, off - 4, 4, '<I') off += 7 (fill_color, off) = rdata(data, off, '<I') view.add_iter('Fill color', '#%x' % fill_color, off - 4, 4, '<I') return offset + length
def add_text_attrs(hd, size, data, off): (size, off) = rdata(data, off, '<H') add_iter(hd, 'Font size', '%d pt' % (size / 20), off - 2, 2, '<H') flags_map = {2: 'italic', 8: 'line through',} (flags, off) = rdata(data, off, '<H') add_iter(hd, 'Flags?', bflag2txt(flags, flags_map), off - 2, 2, '<H') (color, off) = rdata(data, off, '<H') if color == 0x7fff: color_str = "default" else: color_str = '%d' % color # I can see no record that'd look like a palette, though. Maybe it is implicit? add_iter(hd, 'Color index', color_str, off - 2, 2, '<H') font_weight_map = {400: 'normal', 700: 'bold'} (font_weight, off) = rdata(data, off, '<H') add_iter(hd, 'Font weight', key2txt(font_weight, font_weight_map), off - 2, 2, '<H') off += 2 (underline, off) = rdata(data, off, '<B') add_iter(hd, 'Underline', bool(underline), off - 1, 1, '<B') (line_through, off) = rdata(data, off, '<B') add_iter(hd, 'Line-through?', line_through, off - 1, 1, '<B') off += 2 add_short_string(hd, size, data, off, 'Font name')
def add_header(hd, size, data): magic = read_unistr(data, 0, 8) add_iter(hd, 'Format identifier', magic, 0, 8, 's') off = 8 (version, off) = rdata(data, 8, '<H') add_iter(hd, 'Version', version, off - 2, 2, '<H') (encKey, off) = rdata(data, off, '<H') add_iter(hd, 'Pseudo Enc. Key', encKey, off - 2, 2, '<H') (rootID, off) = rdata(data, off, '<I') add_iter(hd, 'Root Object ID', '0x%x' % rootID, off - 4, 4, '<I') (objCount, off) = rdata(data, off, '<Q') add_iter(hd, 'Number of objects', objCount, off - 8, 8, '<Q') (objIndexOffset, off) = rdata(data, off, '<Q') add_iter(hd, 'Object index offset', objIndexOffset, off - 8, 8, '<Q') off += 6 (dpi, off) = rdata(data, off, '<H') add_iter(hd, 'DPI', '%.1f' % (int(dpi) / 10), off - 2, 2, '<H') off += 2 (width, off) = rdata(data, off, '<H') add_iter(hd, 'Page width', width, off - 2, 2, '<H') (height, off) = rdata(data, off, '<H') add_iter(hd, 'Page height', height, off - 2, 2, '<H') (status, off) = rdata(data, off, '<H') add_iter(hd, 'Status bar height', status, off - 2, 2, '<H') off += 0x14 (tocID, off) = rdata(data, off, '<I') add_iter(hd, 'ToC Object Id', '0x%x' % tocID, off - 4, 4, '<I') (tocOffset, off) = rdata(data, off, '<I') add_iter(hd, 'ToC Object offset', tocOffset, off - 4, 4, '<I') (metadataLen, off) = rdata(data, off, '<H') add_iter(hd, 'Length of metadata', metadataLen, off - 2, 2, '<I') if int(version) >= 800: (thumbnailType, off) = rdata(data, off, '<H') thumbnailStr = key2txt(int(thumbnailType), lrf_thumbnail_types) add_iter(hd, 'Thumbnail type', thumbnailStr, off - 2, 2, '<I') (thumbnailLen, off) = rdata(data, off, '<H') add_iter(hd, 'Length of thumbnail', thumbnailLen, off - 2, 2, '<I')