Skip to content

Commit 952fbb5

Browse files
committed
Preprocess: Convert CSS font-size values to pt
1 parent 2623c75 commit 952fbb5

File tree

4 files changed

+478
-275
lines changed

4 files changed

+478
-275
lines changed

commands/preprocess_cssless.py

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ def preprocess_html_merge_cssless(src_path, dst_path):
3838
convert_span_tables_to_tr_td(root)
3939
convert_inline_block_elements_to_table(root)
4040
convert_zero_td_width_to_nonzero(root)
41+
convert_font_size_property_to_pt(root, 16)
4142

4243
head = os.path.dirname(dst_path)
4344
os.makedirs(head, exist_ok=True)
@@ -47,16 +48,21 @@ def preprocess_html_merge_cssless(src_path, dst_path):
4748
encoding='utf-8')
4849
return output
4950

50-
def preprocess_html_merge_css(root, src_path):
51+
def silence_cssutils_warnings():
5152
log = logging.Logger('ignore')
5253
output = io.StringIO()
5354
handler = logging.StreamHandler(stream=output)
5455
formatter = logging.Formatter('%(levelname)s, %(message)s')
5556
handler.setFormatter(formatter)
5657
log.addHandler(handler)
58+
cssutils.log.setLog(log)
59+
60+
return output
61+
62+
def preprocess_html_merge_css(root, src_path):
5763
# cssutils_logging_handler of Premailer.__init__ is insufficient to silence
5864
# warnings to stderr in non-verbose mode
59-
cssutils.log.setLog(log)
65+
output = silence_cssutils_warnings()
6066

6167
with warnings.catch_warnings():
6268
warnings.simplefilter("ignore")
@@ -86,10 +92,17 @@ def remove_css_property(element, property_name):
8692
if len(element.get('style')) == 0:
8793
element.attrib.pop('style')
8894

89-
def has_css_property_value(el, prop_name, prop_value):
95+
96+
def get_css_property_value(el, prop_name):
9097
atrib = cssutils.parseStyle(el.get('style'))
9198
value = atrib.getPropertyCSSValue(prop_name)
92-
if value is not None and value.cssText == prop_value:
99+
if value:
100+
return value.cssText
101+
return None
102+
103+
def has_css_property_value(el, prop_name, prop_value):
104+
value = get_css_property_value(el, prop_name)
105+
if value and value == prop_value:
93106
return True
94107
return False
95108

@@ -192,3 +205,34 @@ def convert_zero_td_width_to_nonzero(root_el):
192205

193206
for el in root_el.xpath('//*[contains(@width, "0%")]'):
194207
el.attrib['width'] = "1px"
208+
209+
def apply_font_size(size, parent_size_pt):
210+
size = size.strip()
211+
212+
if size[-2:] == 'em':
213+
value_number = float(size[:-2].strip())
214+
return value_number*parent_size_pt
215+
216+
if size[-2:] in ['pt', 'px']:
217+
return float(size[:-2].strip())
218+
219+
if size[-1] == '%':
220+
value_number = float(size[:-1].strip())/100
221+
return value_number*parent_size_pt
222+
223+
return parent_size_pt
224+
225+
def convert_font_size_property_to_pt_recurse(el, parent_size_pt):
226+
size_value = get_css_property_value(el,"font-size")
227+
228+
if size_value:
229+
el_size_pt = apply_font_size(size_value, parent_size_pt)
230+
set_css_property_value(el, "font-size", "{}pt".format(el_size_pt))
231+
else:
232+
el_size_pt = parent_size_pt
233+
234+
for child in el.getchildren():
235+
convert_font_size_property_to_pt_recurse(child, el_size_pt)
236+
237+
def convert_font_size_property_to_pt(root_el, default_size):
238+
convert_font_size_property_to_pt_recurse(root_el, default_size)

0 commit comments

Comments
 (0)