|
21 | 21 | from lxml import etree |
22 | 22 | from io import StringIO |
23 | 23 | from lxml.etree import strip_elements |
| 24 | +import copy |
| 25 | +import functools |
| 26 | +import io |
24 | 27 | import logging |
25 | 28 | import os |
26 | 29 | import warnings |
27 | | -import io |
28 | 30 |
|
29 | 31 | def preprocess_html_merge_cssless(src_path, dst_path): |
30 | 32 | with open(src_path, 'r') as a_file: |
@@ -86,28 +88,49 @@ def needs_td_wrapper(element): |
86 | 88 | return False |
87 | 89 | return True |
88 | 90 |
|
89 | | -def remove_css_property(element, property_name): |
90 | | - atrib = cssutils.parseStyle(element.get('style')) |
91 | | - atrib.removeProperty(property_name) |
92 | | - element.set('style', atrib.getCssText(separator='')) |
93 | | - if len(element.get('style')) == 0: |
94 | | - element.attrib.pop('style') |
| 91 | +@functools.lru_cache(maxsize=None) |
| 92 | +def cssutils_parse_style_cached_nocopy(style): |
| 93 | + return cssutils.parseStyle(style) |
95 | 94 |
|
96 | | -def get_css_property_value(el, prop_name): |
97 | | - atrib = cssutils.parseStyle(el.get('style')) |
| 95 | +def cssutils_parse_style_cached(style): |
| 96 | + return copy.deepcopy(cssutils_parse_style_cached_nocopy(style)) |
| 97 | + |
| 98 | +@functools.lru_cache(maxsize=None) |
| 99 | +def get_css_style_property_value(style, prop_name): |
| 100 | + atrib = cssutils_parse_style_cached_nocopy(style) |
98 | 101 | value = atrib.getPropertyCSSValue(prop_name) |
99 | 102 | if value: |
100 | 103 | return value.cssText |
101 | 104 | return None |
102 | 105 |
|
103 | | -def has_css_property_value(el, prop_name, prop_value): |
104 | | - value = get_css_property_value(el, prop_name) |
| 106 | +@functools.lru_cache(maxsize=None) |
| 107 | +def has_css_style_property_value(style, prop_name, prop_value): |
| 108 | + value = get_css_style_property_value(style, prop_name) |
105 | 109 | if value and value == prop_value: |
106 | 110 | return True |
107 | 111 | return False |
108 | 112 |
|
| 113 | +@functools.lru_cache(maxsize=None) |
| 114 | +def remove_css_style_property(style, property_name): |
| 115 | + atrib = cssutils_parse_style_cached(style) |
| 116 | + atrib.removeProperty(property_name) |
| 117 | + return atrib.getCssText(separator='') |
| 118 | + |
| 119 | +def remove_css_property(element, property_name): |
| 120 | + new_style = remove_css_style_property(element.get('style'), property_name) |
| 121 | + if len(new_style) > 0: |
| 122 | + element.set('style', new_style) |
| 123 | + elif 'style' in element.attrib: |
| 124 | + element.attrib.pop('style') |
| 125 | + |
| 126 | +def get_css_property_value(el, prop_name): |
| 127 | + return get_css_style_property_value(el.get('style'), prop_name) |
| 128 | + |
| 129 | +def has_css_property_value(el, prop_name, prop_value): |
| 130 | + return has_css_style_property_value(el.get('style'), prop_name, prop_value) |
| 131 | + |
109 | 132 | def set_css_property_value(el, prop_name, prop_value): |
110 | | - atrib = cssutils.parseStyle(el.get('style')) |
| 133 | + atrib = cssutils_parse_style_cached(el.get('style')) |
111 | 134 | atrib.setProperty(prop_name, prop_value) |
112 | 135 | el.set('style', atrib.getCssText(separator='')) |
113 | 136 |
|
|
0 commit comments