package mailhtml
import (
"regexp"
"strings"
"golang.org/x/net/html"
"golang.org/x/net/html/atom"
)
var (
styleOpen = regexp.MustCompile(`(?i)") {
found = i
}
i += 2 + len(name)
default:
i++
}
}
return found
}
func skipRawText(body string, i int, closer string) int {
for j := i; j <= len(body)-len(closer); j++ {
if hasPrefixFold(body[j:], closer) {
return j + len(closer)
}
}
return len(body)
}
// hasPrefixFold is strings.HasPrefix with ASCII case folding. Tag names are
// ASCII, so nothing else needs folding, and doing it per byte keeps every
// offset an offset into the caller's own string.
func hasPrefixFold(s, prefix string) bool {
if len(s) < len(prefix) {
return false
}
for i := 0; i < len(prefix); i++ {
if lowerASCII(s[i]) != lowerASCII(prefix[i]) {
return false
}
}
return true
}
func lowerASCII(b byte) byte {
if 'A' <= b && b <= 'Z' {
return b + ('a' - 'A')
}
return b
}
func attrOf(n *html.Node, key string) string {
for _, a := range n.Attr {
if a.Key == key {
return a.Val
}
}
return ""
}
func setAttr(n *html.Node, key, val string) {
for i := range n.Attr {
if n.Attr[i].Key == key {
if val == "" {
n.Attr = append(n.Attr[:i], n.Attr[i+1:]...)
return
}
n.Attr[i].Val = val
return
}
}
if val != "" {
n.Attr = append(n.Attr, html.Attribute{Key: key, Val: val})
}
}
// mediaAttr reports a