def __init__(self, css): self.font_family = css_font_family_to_docx(css['font-family']) try: self.font_size = max(0, int(float(css['font-size']) * 2)) # stylizer normalizes all font sizes into pts except (ValueError, TypeError, AttributeError): self.font_size = None fw = css['font-weight'] self.bold = fw.lower() in {'bold', 'bolder'} or int_or_zero(fw) >= 700 self.italic = css['font-style'].lower() in {'italic', 'oblique'} self.color = convert_color(css['color']) self.background_color = convert_color(css.backgroundColor) td = set((css.effective_text_decoration or '').split()) self.underline = 'underline' in td self.dstrike = 'line-through' in td and 'overline' in td self.strike = not self.dstrike and 'line-through' in td self.text_transform = css['text-transform'] # TODO: If lowercase or capitalize, transform the actual text self.caps = self.text_transform == 'uppercase' self.small_caps = css['font-variant'].lower() in {'small-caps', 'smallcaps'} self.shadow = css['text-shadow'] not in {'none', None} try: self.spacing = int(float(css['letter-spacing']) * 20) except (ValueError, TypeError, AttributeError): self.spacing = None self.vertical_align = css['vertical-align'] for edge in border_edges: # In DOCX padding can only be a positive integer setattr(self, 'padding_' + edge, max(0, int(css['padding-' + edge]))) val = min(96, max(2, int({'thin':0.2, 'medium':1, 'thick':2}.get(css['border-%s-width' % edge], 0) * 8))) setattr(self, 'border_%s_width' % edge, val) setattr(self, 'border_%s_color' % edge, convert_color(css['border-%s-color' % edge])) setattr(self, 'border_%s_style' % edge, LINE_STYLES.get(css['border-%s-style' % edge].lower(), 'none')) DOCXStyle.__init__(self)
def __init__(self, namespace, css, is_parent_style=False): self.font_family = css_font_family_to_docx(css['font-family']) try: self.font_size = max(0, int(float(css['font-size']) * 2)) # stylizer normalizes all font sizes into pts except (ValueError, TypeError, AttributeError): self.font_size = None fw = css['font-weight'] self.bold = fw.lower() in {'bold', 'bolder'} or int_or_zero(fw) >= 700 self.italic = css['font-style'].lower() in {'italic', 'oblique'} self.color = convert_color(css['color']) self.background_color = None if is_parent_style else convert_color(css.backgroundColor) td = set((css.effective_text_decoration or '').split()) self.underline = 'underline' in td self.dstrike = 'line-through' in td and 'overline' in td self.strike = not self.dstrike and 'line-through' in td self.text_transform = css['text-transform'] # TODO: If lowercase or capitalize, transform the actual text self.caps = self.text_transform == 'uppercase' self.small_caps = css['font-variant'].lower() in {'small-caps', 'smallcaps'} self.shadow = css['text-shadow'] not in {'none', None} try: self.spacing = int(float(css['letter-spacing']) * 20) except (ValueError, TypeError, AttributeError): self.spacing = None self.vertical_align = css['vertical-align'] self.padding = self.border_color = self.border_width = self.border_style = None if not is_parent_style: # DOCX does not support individual borders/padding for inline content for edge in border_edges: # In DOCX padding can only be a positive integer try: padding = max(0, int(css['padding-' + edge])) except ValueError: padding = 0 if self.padding is None: self.padding = padding elif self.padding != padding: self.padding = ignore val = css['border-%s-width' % edge] if not isinstance(val, (float, int, long)): val = {'thin':0.2, 'medium':1, 'thick':2}.get(val, 0) val = min(96, max(2, int(val * 8))) if self.border_width is None: self.border_width = val elif self.border_width != val: self.border_width = ignore color = convert_color(css['border-%s-color' % edge]) if self.border_color is None: self.border_color = color elif self.border_color != color: self.border_color = ignore style = LINE_STYLES.get(css['border-%s-style' % edge].lower(), 'none') if self.border_style is None: self.border_style = style elif self.border_style != style: self.border_style = ignore DOCXStyle.__init__(self, namespace)
def __init__(self, namespace, css, is_parent_style=False): self.font_family = css_font_family_to_docx(css["font-family"]) try: self.font_size = max(0, int(float(css["font-size"]) * 2)) # stylizer normalizes all font sizes into pts except (ValueError, TypeError, AttributeError): self.font_size = None fw = css["font-weight"] self.bold = (fw.lower() if hasattr(fw, "lower") else fw) in {"bold", "bolder"} or int_or_zero(fw) >= 700 self.italic = css["font-style"].lower() in {"italic", "oblique"} self.color = convert_color(css["color"]) self.background_color = None if is_parent_style else convert_color(css.backgroundColor) td = set((css.effective_text_decoration or "").split()) self.underline = "underline" in td self.dstrike = "line-through" in td and "overline" in td self.strike = not self.dstrike and "line-through" in td self.text_transform = css["text-transform"] # TODO: If lowercase or capitalize, transform the actual text self.caps = self.text_transform == "uppercase" self.small_caps = css["font-variant"].lower() in {"small-caps", "smallcaps"} self.shadow = css["text-shadow"] not in {"none", None} try: self.spacing = int(float(css["letter-spacing"]) * 20) except (ValueError, TypeError, AttributeError): self.spacing = None va = css.first_vertical_align if isinstance(va, (int, float)): self.vertical_align = str(int(va * 2)) else: val = { "top": "superscript", "text-top": "superscript", "sup": "superscript", "super": "superscript", "bottom": "subscript", "text-bottom": "subscript", "sub": "subscript", }.get(va) self.vertical_align = val or "baseline" self.padding = self.border_color = self.border_width = self.border_style = None if not is_parent_style: # DOCX does not support individual borders/padding for inline content for edge in border_edges: # In DOCX padding can only be a positive integer try: padding = max(0, int(css["padding-" + edge])) except ValueError: padding = 0 if self.padding is None: self.padding = padding elif self.padding != padding: self.padding = ignore val = css["border-%s-width" % edge] if not isinstance(val, (float, int, long)): val = {"thin": 0.2, "medium": 1, "thick": 2}.get(val, 0) val = min(96, max(2, int(val * 8))) if self.border_width is None: self.border_width = val elif self.border_width != val: self.border_width = ignore color = convert_color(css["border-%s-color" % edge]) if self.border_color is None: self.border_color = color elif self.border_color != color: self.border_color = ignore style = LINE_STYLES.get(css["border-%s-style" % edge].lower(), "none") if self.border_style is None: self.border_style = style elif self.border_style != style: self.border_style = ignore if self.padding in (None, ignore): self.padding = 0 if self.border_width in (None, ignore): self.border_width = 0 if self.border_style in (None, ignore): self.border_style = "none" if self.border_color in (None, ignore): self.border_color = "auto" if self.border_style == "none": self.border_width, self.border_color = 0, "auto" DOCXStyle.__init__(self, namespace)