diff --git a/premailer/premailer.py b/premailer/premailer.py index 16fc3e3..6720fda 100644 --- a/premailer/premailer.py +++ b/premailer/premailer.py @@ -8,7 +8,7 @@ import cssutils from lxml import etree -from lxml.cssselect import CSSSelector +from lxml.cssselect import CSSSelector, SelectorError __all__ = ['PremailerError', 'Premailer', 'transform'] @@ -86,6 +86,14 @@ def make_important(bulk): for p in bulk.split(';')) +def is_valid_selector(selector): + try: + CSSSelector(selector) + return True + except SelectorError: + return False + + _element_selector_regex = re.compile(r'(^|\s)\w') _cdata_regex = re.compile(r'\<\!\[CDATA\[(.*?)\]\]\>', re.DOTALL) _importants = re.compile('\s*!important') @@ -105,11 +113,13 @@ def __init__(self, html, base_url=None, strip_important=True, external_styles=None, method="html", - base_path=None): + base_path=None, + trust_pseudoclasses=False): self.html = html self.base_url = base_url self.preserve_internal_links = preserve_internal_links self.exclude_pseudoclasses = exclude_pseudoclasses + self.trust_pseudoclasses = trust_pseudoclasses # whether to delete the + + +
First child
+

Middle child

+
Last child
+ + """ + + expect_html = """ + + + +
First child
+

Middle child

+
Last child
+ + """ + + p = Premailer(html, trust_pseudoclasses=True) + result_html = p.transform() + + whitespace_between_tags = re.compile('>\s*<',) + + expect_html = whitespace_between_tags.sub('><', expect_html).strip() + result_html = whitespace_between_tags.sub('><', result_html).strip() + + eq_(expect_html, result_html) + +def test_trusted_pseudo_bad_selector(): + html = """ + + + + +
First child
+
Last child
+ + """ + + expect_html = """ + + + +
First child
+
Last child
+ + """ + + p = Premailer(html, trust_pseudoclasses=True) + result_html = p.transform() + + whitespace_between_tags = re.compile('>\s*<',) + + expect_html = whitespace_between_tags.sub('><', expect_html).strip() + result_html = whitespace_between_tags.sub('><', result_html).strip() + + eq_(expect_html, result_html)