@@ -56,7 +56,17 @@ defmodule Floki.Finder do
56
56
# - single selector
57
57
# - no composite selector
58
58
# - no pseudo classes
59
- defp traverse_html_tuples? ( [ % Selector { combinator: nil , pseudo_classes: [ ] } ] ) , do: true
59
+ defp traverse_html_tuples? ( [ selector ] ) , do: traverse_html_tuples? ( selector )
60
+ defp traverse_html_tuples? ( selectors ) when is_list ( selectors ) , do: false
61
+ defp traverse_html_tuples? ( % Selector { pseudo_classes: [ _ | _ ] } ) , do: false
62
+ defp traverse_html_tuples? ( % Selector { combinator: nil } ) , do: true
63
+
64
+ defp traverse_html_tuples? ( % Selector { combinator: combinator } ) ,
65
+ do: traverse_html_tuples? ( combinator )
66
+
67
+ defp traverse_html_tuples? ( % Selector.Combinator { match_type: :descendant , selector: selector } ) ,
68
+ do: traverse_html_tuples? ( selector )
69
+
60
70
defp traverse_html_tuples? ( _ ) , do: false
61
71
62
72
# The stack serves as accumulator when there is another combinator to traverse.
@@ -131,7 +141,34 @@ defmodule Floki.Finder do
131
141
defp traverse_html_tuples (
132
142
[
133
143
{
134
- % Selector { combinator: nil } = selector ,
144
+ % Selector {
145
+ combinator: % Selector.Combinator {
146
+ match_type: :descendant ,
147
+ selector: combinator_selector
148
+ }
149
+ } = selector ,
150
+ [ { _type , _attributes , children } = html_tuple | selector_rest ]
151
+ }
152
+ | stack
153
+ ] ,
154
+ acc
155
+ ) do
156
+ stack = [ { selector , selector_rest } | stack ]
157
+
158
+ stack =
159
+ if Selector . match? ( html_tuple , selector , nil ) do
160
+ [ { combinator_selector , children } | stack ]
161
+ else
162
+ [ { selector , children } | stack ]
163
+ end
164
+
165
+ traverse_html_tuples ( stack , acc )
166
+ end
167
+
168
+ defp traverse_html_tuples (
169
+ [
170
+ {
171
+ selector ,
135
172
[ _ | selector_rest ]
136
173
}
137
174
| stack
0 commit comments