@@ -19,9 +19,9 @@ type Selector struct {
1919}
2020
2121func matchNode (node * Node , basicSelectorName string , basicSelectorType BasicSelector ) bool {
22- if basicSelectorName == "" {
22+ if basicSelectorName == "" {
2323 return true
24- }else if node == nil {
24+ } else if node == nil {
2525 return false
2626 }
2727
@@ -86,6 +86,7 @@ func TokenizeSelectorsAndCombinators(selector string) []CombinatorEl {
8686 slice := strings .SplitSeq (selector , " " )
8787 currentCombinator := * new (CombinatorEl )
8888 currentCombinator .Selector1 = NewSelector ("" )
89+ currentCombinator .Type = NoneCombinator
8990 for str := range slice {
9091 if strings .TrimSpace (str ) == "" {
9192 continue
@@ -115,61 +116,77 @@ func TokenizeSelectorsAndCombinators(selector string) []CombinatorEl {
115116 return list
116117}
117118
118- func (ce * CombinatorEl ) IsMatchingNode (node * Node ) bool {
119+ func (ce * CombinatorEl ) getMatchingNode (node * Node ) * Node {
119120 switch ce .Type {
120121 case Descendant :
121- return ce .isDescended (node )
122+ return ce .getDescended (node )
122123 case Child :
123- return ce .isDirectChild (node )
124+ return ce .getDirectChild (node )
124125 case NextSibling :
125- return ce .isNextSibling (node )
126+ return ce .getNextSibling (node )
126127 case SubsequentSibling :
127- return ce .isSubsequentSibling (node )
128+ return ce .getSubsequentSibling (node )
128129 case NoneCombinator :
129- return matchNode (node , ce .Selector2 .selectorName , ce .Selector2 .selectorType )
130+ if matchNode (node , ce .Selector2 .selectorName , ce .Selector2 .selectorType ) {
131+ return node
132+ }
130133 }
131- return false
134+ return nil
132135}
133136
134137// isDescended returns wether the given node is a ce.Selector2 and descended of ce.Selector1.
135- func (ce * CombinatorEl ) isDescended (node * Node ) bool {
138+ func (ce * CombinatorEl ) getDescended (node * Node ) * Node {
136139 if ! matchNode (node , ce .Selector2 .selectorName , ce .Selector2 .selectorType ) {
137- return false
140+ return nil
138141 }
139142
140143 parentNode := node .GetParent ()
141- for parentNode != nil && ! matchNode (parentNode , ce .Selector1 .selectorName , ce .Selector1 .selectorType ) {
144+ for parentNode != nil {
145+ if matchNode (parentNode , ce .Selector1 .selectorName , ce .Selector1 .selectorType ) {
146+ return parentNode
147+ }
142148 parentNode = parentNode .GetParent ()
143149 }
144- return parentNode != nil
150+ return nil
145151}
146152
147153// isDirectChild returns whether the given node is a direct child of ce.Selector1 and node is of ce.Selector2
148- func (ce * CombinatorEl ) isDirectChild (node * Node ) bool {
154+ func (ce * CombinatorEl ) getDirectChild (node * Node ) * Node {
149155 if node == nil {
150- return false
156+ return nil
151157 }
152158
153- return matchNode (node , ce .Selector2 .selectorName , ce .Selector2 .selectorType ) && matchNode (node .GetParent (), ce .Selector1 .selectorName , ce .Selector1 .selectorType )
159+ if matchNode (node , ce .Selector2 .selectorName , ce .Selector2 .selectorType ) &&
160+ matchNode (node .GetParent (), ce .Selector1 .selectorName , ce .Selector1 .selectorType ) {
161+ return node .GetParent ()
162+ }
163+ return nil
154164}
155165
156166// isNextSibling return whether the given node is of ce.Selector2 and next sibling of ce.Selector1
157- func (ce * CombinatorEl ) isNextSibling (node * Node ) bool {
167+ func (ce * CombinatorEl ) getNextSibling (node * Node ) * Node {
158168 if node == nil {
159- return false
169+ return nil
160170 }
161171
162- return matchNode (node , ce .Selector2 .selectorName , ce .Selector2 .selectorType ) && matchNode (node .GetPreviousNode (), ce .Selector1 .selectorName , ce .Selector1 .selectorType )
172+ if matchNode (node , ce .Selector2 .selectorName , ce .Selector2 .selectorType ) &&
173+ matchNode (node .GetPreviousNode (), ce .Selector1 .selectorName , ce .Selector1 .selectorType ) {
174+ return node .GetPreviousNode ()
175+ }
176+ return nil
163177}
164178
165- func (ce * CombinatorEl ) isSubsequentSibling (node * Node ) bool {
166- if ! matchNode (node , ce .Selector2 .selector , ce .Selector2 .selectorType ) {
167- return false
179+ func (ce * CombinatorEl ) getSubsequentSibling (node * Node ) * Node {
180+ if node == nil || ! matchNode (node , ce .Selector2 .selector , ce .Selector2 .selectorType ) {
181+ return nil
168182 }
169183
170184 traverser := NewTraverser (node )
171- for traverser .GetCurrentNode () != nil && ! matchNode (traverser .GetCurrentNode (), ce .Selector1 .selector , ce .Selector1 .selectorType ) {
185+ for traverser .GetCurrentNode () != nil {
186+ if matchNode (traverser .GetCurrentNode (), ce .Selector1 .selector , ce .Selector1 .selectorType ){
187+ return traverser .GetCurrentNode ()
188+ }
172189 traverser .Previous ()
173190 }
174- return matchNode ( traverser . GetCurrentNode (), ce . Selector1 . selector , ce . Selector1 . selectorType )
191+ return nil
175192}
0 commit comments