def change_font_in_declaration(style, old_name, new_name=None): changed = False ff = style.getProperty('font-family') if ff is not None: fams = parse_font_family(ff.propertyValue.cssText) nfams = filter(None, [new_name if x == old_name else x for x in fams]) if fams != nfams: if nfams: ff.propertyValue.cssText = serialize_font_family(nfams) else: style.removeProperty(ff.name) changed = True ff = style.getProperty('font') if ff is not None: props = parse_font(ff.propertyValue.cssText) fams = props.get('font-family') or [] nfams = filter(None, [new_name if x == old_name else x for x in fams]) if fams != nfams: props['font-family'] = nfams if nfams: ff.propertyValue.cssText = serialize_font(props) else: style.removeProperty(ff.name) changed = True return changed
def change_font_in_declaration(style, old_name, new_name=None): changed = False ff = style.getProperty('font-family') if ff is not None: fams = parse_font_family(css_text(ff.propertyValue)) nfams = list( filter(None, [new_name if x == old_name else x for x in fams])) if fams != nfams: if nfams: ff.propertyValue.cssText = serialize_font_family(nfams) else: style.removeProperty(ff.name) changed = True ff = style.getProperty('font') if ff is not None: props = parse_font(css_text(ff.propertyValue)) fams = props.get('font-family') or [] nfams = list( filter(None, [new_name if x == old_name else x for x in fams])) if fams != nfams: props['font-family'] = nfams if nfams: ff.propertyValue.cssText = serialize_font(props) else: style.removeProperty(ff.name) changed = True return changed
def normalize_style_declaration(decl, sheet_name): ans = {} for prop in iterdeclaration(decl): if prop.name == 'font-family': # Needed because of https://bitbucket.org/cthedot/cssutils/issues/66/incorrect-handling-of-spaces-in-font prop.propertyValue.cssText = serialize_font_family(parse_font_family(css_text(prop.propertyValue))) ans[prop.name] = Values(prop.propertyValue, sheet_name, prop.priority) return ans
def process_fonts(self): ''' Make sure all fonts are embeddable. Also remove some fonts that cause problems. ''' from calibre.ebooks.oeb.base import urlnormalize from calibre.utils.fonts.utils import remove_embed_restriction processed = set() for item in list(self.oeb.manifest): if not hasattr(item.data, 'cssRules'): continue for i, rule in enumerate(item.data.cssRules): if rule.type == rule.FONT_FACE_RULE: try: s = rule.style src = s.getProperty('src').propertyValue[0].uri except: continue path = item.abshref(src) ff = self.oeb.manifest.hrefs.get(urlnormalize(path), None) if ff is None: continue raw = nraw = ff.data if path not in processed: processed.add(path) try: nraw = remove_embed_restriction(raw) except: continue if nraw != raw: ff.data = nraw self.oeb.container.write(path, nraw) elif iswindows and rule.type == rule.STYLE_RULE: from tinycss.fonts3 import parse_font_family, serialize_font_family s = rule.style f = s.getProperty(u'font-family') if f is not None: font_families = parse_font_family( f.propertyValue.cssText) ff = [ x for x in font_families if x.lower() != u'courier' ] if len(ff) != len(font_families): if 'courier' not in self.filtered_font_warnings: # See https://bugs.launchpad.net/bugs/1665835 self.filtered_font_warnings.add(u'courier') self.log.warn( u'Removing courier font family as it does not render on windows' ) f.propertyValue.cssText = serialize_font_family( ff or [u'monospace'])
def normalize_font(cssvalue, font_family_as_list=False): # See https://developer.mozilla.org/en-US/docs/Web/CSS/font composition = font_composition val = cssvalue.cssText if val == 'inherit': ans = {k:'inherit' for k in composition} elif val in {'caption', 'icon', 'menu', 'message-box', 'small-caption', 'status-bar'}: ans = {k:DEFAULTS[k] for k in composition} else: ans = {k:DEFAULTS[k] for k in composition} ans.update(parse_font(val)) if font_family_as_list: if isinstance(ans['font-family'], basestring): ans['font-family'] = [x.strip() for x in ans['font-family'].split(',')] else: if not isinstance(ans['font-family'], basestring): ans['font-family'] = serialize_font_family(ans['font-family']) return ans
def normalize_font(cssvalue, font_family_as_list=False): # See https://developer.mozilla.org/en-US/docs/Web/CSS/font composition = font_composition val = cssvalue.cssText if val == 'inherit': ans = {k:'inherit' for k in composition} elif val in {'caption', 'icon', 'menu', 'message-box', 'small-caption', 'status-bar'}: ans = {k:DEFAULTS[k] for k in composition} else: ans = {k:DEFAULTS[k] for k in composition} ans.update(parse_font(val)) if font_family_as_list: if isinstance(ans['font-family'], string_or_bytes): ans['font-family'] = [x.strip() for x in ans['font-family'].split(',')] else: if not isinstance(ans['font-family'], string_or_bytes): ans['font-family'] = serialize_font_family(ans['font-family']) return ans
def process_fonts(self): ''' Make sure all fonts are embeddable. Also remove some fonts that causes problems. ''' from calibre.ebooks.oeb.base import urlnormalize from calibre.utils.fonts.utils import remove_embed_restriction processed = set() for item in list(self.oeb.manifest): if not hasattr(item.data, 'cssRules'): continue for i, rule in enumerate(item.data.cssRules): if rule.type == rule.FONT_FACE_RULE: try: s = rule.style src = s.getProperty('src').propertyValue[0].uri except: continue path = item.abshref(src) ff = self.oeb.manifest.hrefs.get(urlnormalize(path), None) if ff is None: continue raw = nraw = ff.data if path not in processed: processed.add(path) try: nraw = remove_embed_restriction(raw) except: continue if nraw != raw: ff.data = nraw self.oeb.container.write(path, nraw) elif iswindows and rule.type == rule.STYLE_RULE: from tinycss.fonts3 import parse_font_family, serialize_font_family s = rule.style f = s.getProperty(u'font-family') if f is not None: font_families = parse_font_family(f.propertyValue.cssText) ff = [x for x in font_families if x.lower() != u'courier'] if len(ff) != len(font_families): if 'courier' not in self.filtered_font_warnings: # See https://bugs.launchpad.net/bugs/1665835 self.filtered_font_warnings.add(u'courier') self.log.warn(u'Removing courier font family as it does not render on windows') f.propertyValue.cssText = serialize_font_family(ff or [u'monospace'])