1+ package GoHtml
2+
3+ import (
4+ "strings"
5+ "sync"
6+ )
7+
8+ type ClassList struct {
9+ classes map [string ]struct {}
10+ rwMutex * sync.Mutex
11+ }
12+
13+ // NewClassList returns a new empty ClassList.
14+ func NewClassList () ClassList {
15+ classList := ClassList {
16+ classes : make (map [string ]struct {}),
17+ rwMutex : & sync.Mutex {},
18+ }
19+
20+ return classList
21+ }
22+
23+ // AppendClass append className to classList. className that contains multiple classes is also a valid className.
24+ func (classList ClassList ) AppendClass (className string ) {
25+ classList .rwMutex .Lock ()
26+ defer classList .rwMutex .Unlock ()
27+
28+ classes := strings .SplitSeq (className , " " )
29+ for v := range classes {
30+ classList .classes [strings .TrimSpace (v )] = struct {}{}
31+ }
32+ }
33+
34+ // SetClass append classes in the node to classList.
35+ func (classList ClassList ) SetClass (node * Node ) {
36+ if node == nil {
37+ return
38+ }
39+ classes , _ := node .GetAttribute ("class" )
40+ classList .AppendClass (classes )
41+ }
42+
43+ // Contains returns whether the className exists or not.
44+ func (classList ClassList ) Contains (className string ) bool {
45+ classList .rwMutex .Lock ()
46+ defer classList .rwMutex .Unlock ()
47+
48+ classes := strings .SplitSeq (className , " " )
49+ for v := range classes {
50+ _ , ok := classList .classes [strings .TrimSpace (v )]
51+ if ! ok {
52+ return false
53+ }
54+ }
55+
56+ return true
57+ }
58+
59+ // DeleteClass deletes the specified classes in className.
60+ func (classList ClassList ) DeleteClass (className string ) {
61+ classList .rwMutex .Lock ()
62+ defer classList .rwMutex .Unlock ()
63+
64+ classes := strings .SplitSeq (className , " " )
65+ for v := range classes {
66+ delete (classList .classes , strings .TrimSpace (v ))
67+ }
68+ }
69+
70+ // Encode returns the full className.
71+ func (classList ClassList ) Encode () string {
72+ classList .rwMutex .Lock ()
73+ defer classList .rwMutex .Unlock ()
74+
75+ classes := ""
76+ for v := range classList .classes {
77+ if classes != "" {
78+ classes += " "
79+ }
80+ classes += v
81+ }
82+ return classes
83+ }
84+
85+ // EncodeTo encode className for the node.
86+ func (classList ClassList ) EncodeTo (node * Node ){
87+ if node == nil {
88+ return
89+ }
90+ node .SetAttribute ("class" , classList .Encode ())
91+ }
0 commit comments