Skip to content

Commit 37ba464

Browse files
Address PR feedback: Move !important preservation logic to CssElementStyleResolver
Co-Authored-By: m@martinnormark.com <m@martinnormark.com>
1 parent b4f4e1c commit 37ba464

2 files changed

Lines changed: 32 additions & 33 deletions

File tree

PreMailer.Net/PreMailer.Net/CssElementStyleResolver.cs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,44 @@ public static class CssElementStyleResolver
88
{
99
private const string premailerAttributePrefix = "-premailer-";
1010

11-
public static IEnumerable<AttributeToCss> GetAllStyles(IElement domElement, StyleClass styleClass)
12-
{
13-
var attributeCssList = new List<AttributeToCss>();
11+
public static IEnumerable<AttributeToCss> GetAllStyles(IElement domElement, StyleClass styleClass)
12+
{
13+
var attributeCssList = new List<AttributeToCss>();
14+
var originalStyleAttr = domElement.Attributes["style"];
15+
var hasImportantInOriginalStyle = originalStyleAttr != null && originalStyleAttr.Value.Contains("!important");
1416

15-
AddSpecialPremailerAttributes(attributeCssList, styleClass);
17+
AddSpecialPremailerAttributes(attributeCssList, styleClass);
1618

17-
if (styleClass.Attributes.Count > 0)
18-
attributeCssList.Add(new AttributeToCss { AttributeName = "style", CssValue = styleClass.ToString(emitImportant: true) });
19+
if (styleClass.Attributes.Count > 0)
20+
attributeCssList.Add(new AttributeToCss { AttributeName = "style", CssValue = styleClass.ToString(emitImportant: true) });
1921

20-
attributeCssList.AddRange(CssStyleEquivalence.FindEquivalent(domElement, styleClass));
22+
attributeCssList.AddRange(CssStyleEquivalence.FindEquivalent(domElement, styleClass));
2123

22-
return attributeCssList;
24+
if (hasImportantInOriginalStyle)
25+
{
26+
var styleAttr = attributeCssList.FirstOrDefault(a => a.AttributeName == "style");
27+
if (styleAttr != null && !styleAttr.CssValue.Contains("!important"))
28+
{
29+
var parser = new CssParser();
30+
var originalStyleClass = parser.ParseStyleClass("inline", originalStyleAttr.Value);
31+
32+
var currentStyleClass = parser.ParseStyleClass("inline", styleAttr.CssValue);
33+
34+
foreach (var attr in originalStyleClass.Attributes)
35+
{
36+
if (attr.Important && !currentStyleClass.Attributes.ContainsKey(attr.Style))
37+
{
38+
currentStyleClass.Attributes.Merge(attr);
39+
}
40+
}
41+
42+
styleAttr.CssValue = currentStyleClass.ToString(emitImportant: true);
43+
}
2344
}
2445

46+
return attributeCssList;
47+
}
48+
2549
private static void AddSpecialPremailerAttributes(List<AttributeToCss> attributeCssList, StyleClass styleClass)
2650
{
2751
while (true)

PreMailer.Net/PreMailer.Net/StyleClassApplier.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,13 @@ public static Dictionary<IElement, StyleClass> ApplyAllStyles(Dictionary<IElemen
1717

1818
private static IElement ApplyStyles(IElement domElement, StyleClass clazz)
1919
{
20-
var originalStyleAttr = domElement.Attributes["style"];
21-
var hasImportantInOriginalStyle = originalStyleAttr != null && originalStyleAttr.Value.Contains("!important");
22-
2320
var styles = CssElementStyleResolver.GetAllStyles(domElement, clazz);
2421

2522
foreach (var attributeToCss in styles)
2623
{
2724
SetAttribute(domElement, attributeToCss);
2825
}
2926

30-
if (hasImportantInOriginalStyle)
31-
{
32-
var currentStyleAttr = domElement.Attributes["style"];
33-
if (currentStyleAttr != null && !currentStyleAttr.Value.Contains("!important"))
34-
{
35-
var parser = new CssParser();
36-
var originalStyleClass = parser.ParseStyleClass("inline", originalStyleAttr.Value);
37-
38-
var currentStyleClass = parser.ParseStyleClass("inline", currentStyleAttr.Value);
39-
40-
foreach (var attr in originalStyleClass.Attributes)
41-
{
42-
if (attr.Important && !currentStyleClass.Attributes.ContainsKey(attr.Style))
43-
{
44-
currentStyleClass.Attributes.Merge(attr);
45-
}
46-
}
47-
48-
domElement.SetAttribute("style", currentStyleClass.ToString(emitImportant: true));
49-
}
50-
}
51-
5227
var styleAttr = domElement.Attributes["style"];
5328
if (styleAttr == null || string.IsNullOrEmpty(styleAttr.Value))
5429
{

0 commit comments

Comments
 (0)