def media_allowed(media): if not media or not media.mediaText: return True return media_ok(media.mediaText)
def media_allowed(media): if not media or not media.mediaText: return True return media_ok(media.mediaText)
def resolve_styles(container, name, select=None, sheet_callback=None): root = container.parsed(name) select = select or Select(root, ignore_inappropriate_pseudo_classes=True) style_map = defaultdict(list) pseudo_style_map = defaultdict(list) rule_index_counter = count() pseudo_pat = re.compile( u':{1,2}(%s)' % ('|'.join(INAPPROPRIATE_PSEUDO_CLASSES)), re.I) def process_sheet(sheet, sheet_name): if sheet_callback is not None: sheet_callback(sheet, sheet_name) for rule, sheet_name, rule_index in iterrules( container, sheet_name, rules=sheet, rule_index_counter=rule_index_counter, rule_type='STYLE_RULE'): for selector in rule.selectorList: text = selector.selectorText try: matches = tuple(select(text)) except SelectorError as err: container.log.error( 'Ignoring CSS rule with invalid selector: %r (%s)' % (text, as_unicode(err))) continue m = pseudo_pat.search(text) style = normalize_style_declaration(rule.style, sheet_name) if m is None: for elem in matches: style_map[elem].append( StyleDeclaration(specificity(rule_index, selector), style, None)) else: for elem in matches: pseudo_style_map[elem].append( StyleDeclaration(specificity(rule_index, selector), style, m.group(1))) process_sheet(html_css_stylesheet(container), 'user-agent.css') for elem in root.iterdescendants(XHTML('style'), XHTML('link')): if elem.tag.lower().endswith('style'): if not elem.text: continue sheet = container.parse_css(elem.text) sheet_name = name else: if (elem.get('type') or 'text/css').lower() not in OEB_STYLES or \ (elem.get('rel') or 'stylesheet').lower() != 'stylesheet' or \ not media_ok(elem.get('media')): continue href = elem.get('href') if not href: continue sheet_name = container.href_to_name(href, name) if not container.has_name(sheet_name): continue sheet = container.parsed(sheet_name) if not isinstance(sheet, CSSStyleSheet): continue process_sheet(sheet, sheet_name) for elem in root.xpath('//*[@style]'): text = elem.get('style') if text: style = container.parse_css(text, is_declaration=True) style_map[elem].append( StyleDeclaration(Specificity(1, 0, 0, 0, 0), normalize_style_declaration(style, name), None)) for l in (style_map, pseudo_style_map): for x in l.itervalues(): x.sort(key=itemgetter(0), reverse=True) style_map = { elem: resolve_declarations(x) for elem, x in style_map.iteritems() } pseudo_style_map = { elem: resolve_pseudo_declarations(x) for elem, x in pseudo_style_map.iteritems() } return partial(resolve_property, style_map), partial(resolve_pseudo_property, style_map, pseudo_style_map), select
def resolve_styles(container, name, select=None, sheet_callback=None): root = container.parsed(name) select = select or Select(root, ignore_inappropriate_pseudo_classes=True) style_map = defaultdict(list) pseudo_style_map = defaultdict(list) rule_index_counter = count() pseudo_pat = re.compile(u':{1,2}(%s)' % ('|'.join(INAPPROPRIATE_PSEUDO_CLASSES)), re.I) def process_sheet(sheet, sheet_name): if sheet_callback is not None: sheet_callback(sheet, sheet_name) for rule, sheet_name, rule_index in iterrules(container, sheet_name, rules=sheet, rule_index_counter=rule_index_counter, rule_type='STYLE_RULE'): for selector in rule.selectorList: text = selector.selectorText try: matches = tuple(select(text)) except SelectorError as err: container.log.error('Ignoring CSS rule with invalid selector: %r (%s)' % (text, as_unicode(err))) continue m = pseudo_pat.search(text) style = normalize_style_declaration(rule.style, sheet_name) if m is None: for elem in matches: style_map[elem].append(StyleDeclaration(specificity(rule_index, selector), style, None)) else: for elem in matches: pseudo_style_map[elem].append(StyleDeclaration(specificity(rule_index, selector), style, m.group(1))) process_sheet(html_css_stylesheet(container), 'user-agent.css') for elem in root.iterdescendants(XHTML('style'), XHTML('link')): if elem.tag.lower().endswith('style'): if not elem.text: continue sheet = container.parse_css(elem.text) sheet_name = name else: if (elem.get('type') or 'text/css').lower() not in OEB_STYLES or \ (elem.get('rel') or 'stylesheet').lower() != 'stylesheet' or \ not media_ok(elem.get('media')): continue href = elem.get('href') if not href: continue sheet_name = container.href_to_name(href, name) if not container.has_name(sheet_name): continue sheet = container.parsed(sheet_name) if not isinstance(sheet, CSSStyleSheet): continue process_sheet(sheet, sheet_name) for elem in root.xpath('//*[@style]'): text = elem.get('style') if text: style = container.parse_css(text, is_declaration=True) style_map[elem].append(StyleDeclaration(Specificity(1, 0, 0, 0, 0), normalize_style_declaration(style, name), None)) for l in (style_map, pseudo_style_map): for x in itervalues(l): x.sort(key=itemgetter(0), reverse=True) style_map = {elem:resolve_declarations(x) for elem, x in iteritems(style_map)} pseudo_style_map = {elem:resolve_pseudo_declarations(x) for elem, x in iteritems(pseudo_style_map)} return partial(resolve_property, style_map), partial(resolve_pseudo_property, style_map, pseudo_style_map), select