-
Notifications
You must be signed in to change notification settings - Fork 8
/
element.go
82 lines (75 loc) · 1.83 KB
/
element.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package htmlutil
import (
"html"
"strings"
"github.com/grokify/mogo/type/stringsutil"
)
const (
TagDiv = "div"
AttributeClass = "class"
AttributeOnclick = "onclick"
DelimitSemicolon = ";"
DelimitSpace = " "
)
type Element struct {
TagName string
Attrs map[string][]string
InnerHTML []stringsutil.Stringable
}
func NewElement() Element {
return Element{
Attrs: map[string][]string{},
InnerHTML: []stringsutil.Stringable{}}
}
func (el Element) Add(key string, values ...string) {
key = strings.ToLower(strings.TrimSpace(key))
if len(key) == 0 {
return
}
if len(values) == 0 {
if _, ok := el.Attrs[key]; !ok {
el.Attrs[key] = []string{}
}
return
}
el.Attrs[key] = append(el.Attrs[key], values...)
}
func (el Element) String() string {
el.TagName = strings.ToLower(strings.TrimSpace(el.TagName))
if len(el.TagName) == 0 {
el.TagName = TagDiv
}
attrs := []string{}
for key, vals := range el.Attrs {
if len(vals) == 0 {
attrs = append(attrs, key)
} else if key == AttributeClass {
escaped := []string{}
for _, val := range vals {
escaped = append(escaped, html.EscapeString(val))
}
attrs = append(attrs, key+"=\""+strings.Join(escaped, DelimitSpace)+"\"")
} else if key == AttributeOnclick {
attrs = append(attrs, key+"=\""+strings.Join(vals, DelimitSemicolon)+"\"")
} else {
escaped := []string{}
for _, val := range vals {
escaped = append(escaped, html.EscapeString(val))
}
attrs = append(attrs, key+"=\""+strings.Join(escaped, DelimitSemicolon)+"\"")
}
}
elString := "<" + el.TagName
if len(attrs) > 0 {
elString += " " + strings.Join(attrs, " ") + ">"
} else {
elString += ">"
}
if len(el.InnerHTML) > 0 {
for _, child := range el.InnerHTML {
elString += child.String()
}
elString += "</" + el.TagName + ">"
}
return elString
}