@@ -2,6 +2,8 @@ package GoHtml
22
33import (
44 "strings"
5+
6+ "golang.org/x/net/html"
57)
68
79type BasicSelector int
@@ -40,7 +42,7 @@ func matchNode(node *Node, basicSelectorName string, basicSelectorType BasicSele
4042}
4143
4244func 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
8486func 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 ()
0 commit comments