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