From 01f9967e85626574a0febf8a471aba04cf4a3fda Mon Sep 17 00:00:00 2001 From: machinewu Date: Fri, 22 Jan 2016 23:26:12 +0800 Subject: [PATCH] When merge style, don't change the style items' order --- premailer/merge_style.py | 15 ++++++++++----- premailer/tests/test_premailer.py | 12 ++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/premailer/merge_style.py b/premailer/merge_style.py index 4073171..352b021 100644 --- a/premailer/merge_style.py +++ b/premailer/merge_style.py @@ -1,6 +1,11 @@ import cssutils import threading from operator import itemgetter +try: + from collections import OrderedDict +except ImportError: # pragma: no cover + # some old python 2.6 thing then, eh? + from ordereddict import OrderedDict def csstext_to_pairs(csstext): @@ -49,9 +54,9 @@ def merge_styles( str: the final style """ # building classes - styles = {'': {}} + styles = OrderedDict([('', OrderedDict())]) for pc in set(classes): - styles[pc] = {} + styles[pc] = OrderedDict() for i, style in enumerate(new_styles): for k, v in style: @@ -71,7 +76,7 @@ def merge_styles( # Remove rules that we were going to have value 'unset' because # they effectively are the same as not saying anything about the # property when inlined - kv = dict( + kv = OrderedDict( (k, v) for (k, v) in kv.items() if not v.lower() == 'unset' ) if not kv: @@ -80,12 +85,12 @@ def merge_styles( pseudo_styles.append( '%s{%s}' % ( pseudoclass, - '; '.join('%s:%s' % (k, v) for k, v in sorted(kv.items())) + '; '.join('%s:%s' % (k, v) for k, v in kv.items()) ) ) else: normal_styles.append('; '.join( - '%s:%s' % (k, v) for k, v in sorted(kv.items()) + '%s:%s' % (k, v) for k, v in kv.items() )) if pseudo_styles: diff --git a/premailer/tests/test_premailer.py b/premailer/tests/test_premailer.py index a7e7442..271b5bc 100644 --- a/premailer/tests/test_premailer.py +++ b/premailer/tests/test_premailer.py @@ -102,7 +102,7 @@ class Tests(unittest.TestCase): def test_merge_styles_basic(self): inline_style = 'font-size:1px; color: red' new = 'font-size:2px; font-weight: bold' - expect = 'color:red;', 'font-size:1px;', 'font-weight:bold' + expect = 'font-size:1px;', 'font-weight:bold;', 'color:red' result = merge_styles(inline_style, [csstext_to_pairs(new)], ['']) for each in expect: ok_(each in result) @@ -146,7 +146,7 @@ class Tests(unittest.TestCase): def test_merge_styles_with_unset(self): inline_style = 'color: red' new = 'font-size: 10px; font-size: unset; font-weight: bold' - expect = 'color:red;', 'font-weight:bold' + expect = 'font-weight:bold;', 'color:red' css_new = csstext_to_pairs(new) result = merge_styles( inline_style, @@ -632,11 +632,11 @@ ple.com/bg.png); color:#123; font-family:Omerta"> 'Paragraph

' self.fragment_in_html(e, result_html, True) - e = 'style="{border:1px solid green; color:red}' + e = 'style="{color:red; border:1px solid green}' self.fragment_in_html(e, result_html) e = ' :visited{border:1px solid green}' self.fragment_in_html(e, result_html) - e = ' :hover{border:1px solid green; text-decoration:none}' + e = ' :hover{text-decoration:none; border:1px solid green}' self.fragment_in_html(e, result_html) def test_css_with_pseudoclasses_excluded(self): @@ -666,7 +666,7 @@ a:visited {border:1px solid green}p::first-letter {float:left;font-size:300%} -Page +Page

Paragraph

""" @@ -1196,7 +1196,7 @@ ical-align:middle" bgcolor="red" valign="middle">Cell 2 -
+
"""