70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
package premailer
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/PuerkitoBio/goquery"
|
|
"github.com/vanng822/css"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
type elementRules struct {
|
|
element *goquery.Selection
|
|
rules []*styleRule
|
|
cssToAttributes bool
|
|
}
|
|
|
|
func (er *elementRules) inline() {
|
|
inline, _ := er.element.Attr("style")
|
|
|
|
var inlineStyles map[string]*css.CSSStyleDeclaration
|
|
if inline != "" {
|
|
inlineStyles = css.ParseBlock(inline)
|
|
}
|
|
|
|
styles := make(map[string]string)
|
|
for _, rule := range er.rules {
|
|
for prop, s := range rule.styles {
|
|
styles[prop] = s.Value
|
|
}
|
|
}
|
|
|
|
if len(inlineStyles) > 0 {
|
|
for prop, s := range inlineStyles {
|
|
styles[prop] = s.Value
|
|
}
|
|
}
|
|
|
|
final := make([]string, 0, len(styles))
|
|
for p, v := range styles {
|
|
final = append(final, fmt.Sprintf("%s:%s", p, v))
|
|
if er.cssToAttributes {
|
|
er.style_to_basic_html_attribute(p, v)
|
|
}
|
|
}
|
|
|
|
sort.Strings(final)
|
|
style := strings.Join(final, ";")
|
|
if style != "" {
|
|
er.element.SetAttr("style", style)
|
|
}
|
|
|
|
}
|
|
|
|
func (er *elementRules) style_to_basic_html_attribute(prop, value string) {
|
|
switch prop {
|
|
case "text-align":
|
|
er.element.SetAttr("align", value)
|
|
case "vertical-align":
|
|
er.element.SetAttr("valign", value)
|
|
case "background-color":
|
|
er.element.SetAttr("bgcolor", value)
|
|
case "width":
|
|
fallthrough
|
|
case "height":
|
|
if strings.HasSuffix(value, "px") {
|
|
value = value[:len(value)-2]
|
|
}
|
|
er.element.SetAttr(prop, value)
|
|
}
|
|
}
|