Skip to content
This repository was archived by the owner on May 25, 2026. It is now read-only.

Commit f0b5cc3

Browse files
committed
completed classList
1 parent e37466c commit f0b5cc3

4 files changed

Lines changed: 135 additions & 0 deletions

File tree

classList.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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+
}

classList_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package GoHtml_test
2+
3+
import(
4+
"testing"
5+
"github.com/udan-jayanith/GoHTML"
6+
)
7+
8+
func TestClasses(t *testing.T){
9+
node := GoHtml.CreateNode("div")
10+
node.SetAttribute("class", "div-container main")
11+
12+
classList := GoHtml.NewClassList()
13+
classList.SetClass(node)
14+
if !classList.Contains("main"){
15+
t.Fatal("")
16+
return
17+
}
18+
classList.DeleteClass("main")
19+
if classList.Contains("main"){
20+
t.Fatal("")
21+
return
22+
}
23+
24+
classList.AppendClass("main-div")
25+
if !classList.Contains("main-div"){
26+
t.Fatal("")
27+
return
28+
}
29+
30+
classList.EncodeTo(node)
31+
32+
className, _ := node.GetAttribute("class")
33+
if className != classList.Encode(){
34+
t.Fatal("")
35+
return
36+
}
37+
}

main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ func DeepCloneNode(node *Node) *Node{
3737
attributes := node.attributes
3838
node.rwMutex.Unlock()
3939

40+
if node == nil {
41+
return node
42+
}
43+
4044
newNode := Node{
4145
childNode: node.GetChildNode(),
4246
tagName: node.GetTagName(),

node-tree_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,7 @@ func TestRemoveNode(t *testing.T){
109109
}else if p.GetParent() != article {
110110
t.Fatal("Unexpected parent.")
111111
}
112+
113+
//p.RemoveNode()
114+
//t.Log(GoHtml.NodeTreeToHTML(article))
112115
}

0 commit comments

Comments
 (0)