Skip to content

Commit 0840a05

Browse files
authored
Find with descendant selector without html tree (#537)
1 parent 5e7ec16 commit 0840a05

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

lib/floki/finder.ex

+39-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,17 @@ defmodule Floki.Finder do
5656
# - single selector
5757
# - no composite selector
5858
# - 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+
6070
defp traverse_html_tuples?(_), do: false
6171

6272
# The stack serves as accumulator when there is another combinator to traverse.
@@ -131,7 +141,34 @@ defmodule Floki.Finder do
131141
defp traverse_html_tuples(
132142
[
133143
{
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,
135172
[_ | selector_rest]
136173
}
137174
| stack

0 commit comments

Comments
 (0)