@@ -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