def handle_style(book, data): verbose = DEBUG or book.verbosity >= 2 bv = book.biff_version flag_and_xfx, built_in_id, level = unpack('<HBB', data[:4]) xf_index = flag_and_xfx & 0x0fff if (data == "\0\0\0\0" and "Normal" not in book.style_name_map): # Erroneous record (doesn't have built-in bit set). # Example file supplied by Jeff Bell. built_in = 1 built_in_id = 0 xf_index = 0 name = "Normal" level = 255 elif flag_and_xfx & 0x8000: # built-in style built_in = 1 name = built_in_style_names[built_in_id] if 1 <= built_in_id <= 2: name += str(level + 1) else: # user-defined style if bv >= 80: name = unpack_unicode(data, 2, lenlen=2) else: name = unpack_string(data, 2, book.encoding, lenlen=1) if verbose and not name: print("WARNING *** A user-defined style has a zero-length name", file=book.logfile) built_in = 0 built_in_id = 0 level = 0 book.style_name_map[name] = (built_in, xf_index) if verbose: print("STYLE: built_in=%d xf_index=%d built_in_id=%d level=%d name=%r" \ % (built_in, xf_index, built_in_id, level, name), file=book.logfile)
def handle_format(self, data, rectype=XL_FORMAT): DEBUG = 0 bv = self.biff_version if rectype == XL_FORMAT2: bv = min(bv, 30) if not self.encoding: self.derive_encoding() strpos = 2 if bv >= 50: fmtkey = unpack('<H', data[0:2])[0] else: fmtkey = self.actualfmtcount if bv <= 30: strpos = 0 self.actualfmtcount += 1 if bv >= 80: unistrg = unpack_unicode(data, 2) else: unistrg = unpack_string(data, strpos, self.encoding, lenlen=1) verbose = DEBUG or self.verbosity >= 3 if verbose: fprintf(self.logfile, "FORMAT: count=%d fmtkey=0x%04x (%d) s=%r\n", self.actualfmtcount, fmtkey, fmtkey, unistrg) is_date_s = self.is_date_format_string(unistrg) ty = [FGE, FDT][is_date_s] if not (fmtkey > 163 or bv < 50): # user_defined if fmtkey > 163 # N.B. Gnumeric incorrectly starts these at 50 instead of 164 :-( # if earlier than BIFF 5, standard info is useless std_ty = std_format_code_types.get(fmtkey, FUN) # print "std ty", std_ty is_date_c = std_ty == FDT if 0 < fmtkey < 50 and (is_date_c ^ is_date_s): DEBUG = 2 fprintf( self.logfile, "WARNING *** Conflict between " "std format key %d and its format string %r\n", fmtkey, unistrg) if DEBUG == 2: fprintf(self.logfile, "ty: %d; is_date_c: %r; is_date_s: %r; fmt_strg: %r", ty, is_date_c, is_date_s, unistrg) fmtobj = Format(fmtkey, ty, unistrg) if verbose: fmtobj.dump(self.logfile, header="--- handle_format [%d] ---" % (self.actualfmtcount - 1, )) self.format_map[fmtkey] = fmtobj self.format_list.append(fmtobj)
def handle_format(self, data, rectype=XL_FORMAT): DEBUG = 0 bv = self.biff_version if rectype == XL_FORMAT2: bv = min(bv, 30) if not self.encoding: self.derive_encoding() strpos = 2 if bv >= 50: fmtkey = unpack('<H', data[0:2])[0] else: fmtkey = self.actualfmtcount if bv <= 30: strpos = 0 self.actualfmtcount += 1 if bv >= 80: unistrg = unpack_unicode(data, 2) else: unistrg = unpack_string(data, strpos, self.encoding, lenlen=1) verbose = DEBUG or self.verbosity >= 3 if verbose: fprintf(self.logfile, "FORMAT: count=%d fmtkey=0x%04x (%d) s=%r\n", self.actualfmtcount, fmtkey, fmtkey, unistrg) is_date_s = self.is_date_format_string(unistrg) ty = [FGE, FDT][is_date_s] if not(fmtkey > 163 or bv < 50): # user_defined if fmtkey > 163 # N.B. Gnumeric incorrectly starts these at 50 instead of 164 :-( # if earlier than BIFF 5, standard info is useless std_ty = std_format_code_types.get(fmtkey, FUN) # print "std ty", std_ty is_date_c = std_ty == FDT if 0 < fmtkey < 50 and (is_date_c ^ is_date_s): DEBUG = 2 fprintf(self.logfile, "WARNING *** Conflict between " "std format key %d and its format string %r\n", fmtkey, unistrg) if DEBUG == 2: fprintf(self.logfile, "ty: %d; is_date_c: %r; is_date_s: %r; fmt_strg: %r", ty, is_date_c, is_date_s, unistrg) fmtobj = Format(fmtkey, ty, unistrg) if verbose: fmtobj.dump(self.logfile, header="--- handle_format [%d] ---" % (self.actualfmtcount-1, )) self.format_map[fmtkey] = fmtobj self.format_list.append(fmtobj)
def handle_font(book, data): if not book.formatting_info: return if not book.encoding: book.derive_encoding() verbose = DEBUG or book.verbosity >= 2 bv = book.biff_version k = len(book.font_list) if k == 4: f = Font() f.name = 'Dummy Font' f.font_index = k book.font_list.append(f) k += 1 f = Font() f.font_index = k book.font_list.append(f) if bv >= 50: ( f.height, option_flags, f.colour_index, f.weight, f.escapement_type, f.underline_type, f.family, f.character_set, ) = unpack('<HHHHHBBB', data[0:13]) f.bold = option_flags & 1 f.italic = (option_flags & 2) >> 1 f.underlined = (option_flags & 4) >> 2 f.struck_out = (option_flags & 8) >> 3 f.outline = (option_flags & 16) >> 4 f.shadow = (option_flags & 32) >> 5 if bv >= 80: f.name = unpack_unicode(data, 14, lenlen=1) else: f.name = unpack_string(data, 14, book.encoding, lenlen=1) elif bv >= 30: f.height, option_flags, f.colour_index = unpack('<HHH', data[0:6]) f.bold = option_flags & 1 f.italic = (option_flags & 2) >> 1 f.underlined = (option_flags & 4) >> 2 f.struck_out = (option_flags & 8) >> 3 f.outline = (option_flags & 16) >> 4 f.shadow = (option_flags & 32) >> 5 f.name = unpack_string(data, 6, book.encoding, lenlen=1) # Now cook up the remaining attributes ... f.weight = [400, 700][f.bold] f.escapement_type = 0 # None f.underline_type = f.underlined # None or Single f.family = 0 # Unknown / don't care f.character_set = 1 # System default (0 means "ANSI Latin") else: # BIFF2 f.height, option_flags = unpack('<HH', data[0:4]) f.colour_index = 0x7FFF # "system window text colour" f.bold = option_flags & 1 f.italic = (option_flags & 2) >> 1 f.underlined = (option_flags & 4) >> 2 f.struck_out = (option_flags & 8) >> 3 f.outline = 0 f.shadow = 0 f.name = unpack_string(data, 4, book.encoding, lenlen=1) # Now cook up the remaining attributes ... f.weight = [400, 700][f.bold] f.escapement_type = 0 # None f.underline_type = f.underlined # None or Single f.family = 0 # Unknown / don't care f.character_set = 1 # System default (0 means "ANSI Latin") if verbose: f.dump( book.logfile, header="--- handle_font: font[%d] ---" % f.font_index, footer="-------------------", )