Skip to content

Commit 3286bce

Browse files
committed
Fixed a bug in selectors and combinators tokenizer
1 parent 5b58d2e commit 3286bce

File tree

2 files changed

+23
-19
lines changed

2 files changed

+23
-19
lines changed

selectors.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package GoHtml
22

33
import (
44
"strings"
5+
6+
"golang.org/x/net/html"
57
)
68

79
type BasicSelector int
@@ -40,7 +42,7 @@ func matchNode(node *Node, basicSelectorName string, basicSelectorType BasicSele
4042
}
4143

4244
func NewSelector(selector string) Selector {
43-
selector = strings.TrimSpace(selector)
45+
selector = strings.TrimSpace(html.EscapeString(selector))
4446
selectorStruct := Selector{}
4547
if len(selector) == 0 || (selector[0] == '.' || selector[0] == '#') && len(selector) <= 1 {
4648
return selectorStruct
@@ -82,12 +84,27 @@ type CombinatorEl struct {
8284
}
8385

8486
func TokenizeSelectorsAndCombinators(selector string) []CombinatorEl {
87+
iter := func(yield func(string) bool) {
88+
currentStr := ""
89+
for _, char := range selector {
90+
switch char {
91+
case ' ', '>', '+', '~':
92+
if !yield(currentStr) || !yield(string(char)){
93+
return
94+
}
95+
currentStr = ""
96+
default:
97+
currentStr+=string(char)
98+
}
99+
}
100+
yield(currentStr)
101+
}
102+
85103
list := make([]CombinatorEl, 0, 1)
86-
slice := strings.SplitSeq(selector, " ")
87104
currentCombinator := *new(CombinatorEl)
88105
currentCombinator.Selector1 = NewSelector("")
89106
currentCombinator.Type = NoneCombinator
90-
for str := range slice {
107+
for str := range iter {
91108
if strings.TrimSpace(str) == "" {
92109
continue
93110
}
@@ -164,7 +181,7 @@ func (ce *CombinatorEl) getDirectChild(node *Node) *Node {
164181
}
165182

166183
// isNextSibling return whether the given node is of ce.Selector2 and next sibling of ce.Selector1
167-
func (ce *CombinatorEl) getNextSibling(node *Node) *Node {
184+
func (ce *CombinatorEl) getNextSibling(node *Node) *Node {
168185
if node == nil {
169186
return nil
170187
}
@@ -183,7 +200,7 @@ func (ce *CombinatorEl) getSubsequentSibling(node *Node) *Node {
183200

184201
traverser := NewTraverser(node)
185202
for traverser.GetCurrentNode() != nil {
186-
if matchNode(traverser.GetCurrentNode(), ce.Selector1.selector, ce.Selector1.selectorType){
203+
if matchNode(traverser.GetCurrentNode(), ce.Selector1.selector, ce.Selector1.selectorType) {
187204
return traverser.GetCurrentNode()
188205
}
189206
traverser.Previous()

serializer.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,13 @@ func encodeListAttributes(node *Node) string {
3030
return w.String()
3131
}
3232

33-
// Encode writes to w encoding of rootNode
33+
// Encode writes to w encoding of the node tree from rootNode.
3434
func Encode(w io.Writer, rootNode *Node) {
3535
type stackFrame struct {
3636
node *Node
3737
openedTag bool
3838
}
3939

40-
/*
41-
traverser := NewTraverser(rootNode)
42-
traverser.Walkthrough(func(node *Node) TraverseCondition {
43-
fmt.Println("+++++++++++++++++++++++++++")
44-
if node.IsTextNode() {
45-
fmt.Println(node.text)
46-
} else {
47-
fmt.Println(node.GetTagName())
48-
}
49-
return ContinueWalkthrough
50-
})
51-
*/
52-
5340
stack := linkedliststack.New()
5441
stack.Push(stackFrame{node: rootNode, openedTag: false})
5542

0 commit comments

Comments
 (0)