Current section

86 Versions

Jump to

Compare versions

3 files changed
+23 additions
-10 deletions
  @@ -27,4 +27,4 @@
27 27 {<<"name">>,<<"mochiweb">>},
28 28 {<<"optional">>,false},
29 29 {<<"requirement">>,<<"~> 2.15">>}]]}.
30 - {<<"version">>,<<"0.17.1">>}.
30 + {<<"version">>,<<"0.17.2">>}.
  @@ -29,6 +29,7 @@ defmodule Floki.SelectorParser do
29 29 end
30 30
31 31 defp do_parse([], selector), do: {selector, []}
32 + defp do_parse([{:close_parentesis, _} | t], selector), do: {selector, t}
32 33 defp do_parse([{:comma, _}| t], selector), do: {selector, t}
33 34 defp do_parse([{:identifier, _, namespace}, {:namespace_pipe, _} | t], selector) do
34 35 do_parse(t, %{selector | namespace: to_string(namespace)})
  @@ -80,24 +81,24 @@ defmodule Floki.SelectorParser do
80 81 do_parse(t, %{selector | pseudo_classes: [%{pseudo_class | value: to_string(pattern)} | pseudo_classes]})
81 82 end
82 83 defp do_parse([{:space, _} | t], selector) do
83 - {t, combinator} = consume_combinator(t, :descendant)
84 + {remaining_tokens, combinator} = consume_combinator(t, :descendant)
84 85
85 - do_parse(t, %{selector | combinator: combinator})
86 + {%{selector | combinator: combinator}, remaining_tokens}
86 87 end
87 88 defp do_parse([{:greater, _} | t], selector) do
88 - {t, combinator} = consume_combinator(t, :child)
89 + {remaining_tokens, combinator} = consume_combinator(t, :child)
89 90
90 - do_parse(t, %{selector | combinator: combinator})
91 + {%{selector | combinator: combinator}, remaining_tokens}
91 92 end
92 93 defp do_parse([{:plus, _} | t], selector) do
93 - {t, combinator} = consume_combinator(t, :sibling)
94 + {remaining_tokens, combinator} = consume_combinator(t, :sibling)
94 95
95 - do_parse(t, %{selector | combinator: combinator})
96 + {%{selector | combinator: combinator}, remaining_tokens}
96 97 end
97 98 defp do_parse([{:tilde, _} | t], selector) do
98 - {t, combinator} = consume_combinator(t, :general_sibling)
99 + {remaining_tokens, combinator} = consume_combinator(t, :general_sibling)
99 100
100 - do_parse(t, %{selector | combinator: combinator})
101 + {%{selector | combinator: combinator}, remaining_tokens}
101 102 end
102 103 defp do_parse([{:unknown, _, unknown} | t], selector) do
103 104 Logger.warn("Unknown token #{inspect unknown}. Ignoring.")
  @@ -147,6 +148,9 @@ defmodule Floki.SelectorParser do
147 148 {remaining_tokens, %{combinator | selector: selector}}
148 149 end
149 150
151 + defp do_parse_pseudo_not([], pseudo_class) do
152 + {[], pseudo_class}
153 + end
150 154 defp do_parse_pseudo_not([{:close_parentesis, _} | t], pseudo_class) do
151 155 {t, pseudo_class}
152 156 end
  @@ -156,6 +160,10 @@ defmodule Floki.SelectorParser do
156 160 defp do_parse_pseudo_not(tokens, pseudo_class) do
157 161 do_parse_pseudo_not(tokens, %Selector{}, pseudo_class)
158 162 end
163 + defp do_parse_pseudo_not([], pseudo_not_selector, pseudo_class) do
164 + pseudo_class = update_pseudo_not_value(pseudo_class, pseudo_not_selector)
165 + {[], pseudo_class}
166 + end
159 167 defp do_parse_pseudo_not([{:close_parentesis, _} | t], pseudo_not_selector, pseudo_class) do
160 168 pseudo_class = update_pseudo_not_value(pseudo_class, pseudo_not_selector)
161 169 {t, pseudo_class}
  @@ -167,6 +175,11 @@ defmodule Floki.SelectorParser do
167 175 defp do_parse_pseudo_not([{:space, _} | t], pseudo_not_selector, pseudo_class) do
168 176 do_parse_pseudo_not(t, pseudo_not_selector, pseudo_class)
169 177 end
178 + defp do_parse_pseudo_not([{'[', _} | _t]=tokens, pseudo_not_selector, pseudo_class) do
179 + {pseudo_not_selector, remaining_tokens} = do_parse(tokens, pseudo_not_selector)
180 + pseudo_class = update_pseudo_not_value(pseudo_class, pseudo_not_selector)
181 + do_parse_pseudo_not(remaining_tokens, pseudo_class)
182 + end
170 183 defp do_parse_pseudo_not([next_token | t], pseudo_not_selector, pseudo_class) do
171 184 {pseudo_not_selector, _} = do_parse([next_token], pseudo_not_selector)
172 185 do_parse_pseudo_not(t, pseudo_not_selector, pseudo_class)
  @@ -2,7 +2,7 @@ defmodule Floki.Mixfile do
2 2 use Mix.Project
3 3
4 4 @description "Floki is a simple HTML parser that enables search for nodes using CSS selectors."
5 - @version "0.17.1"
5 + @version "0.17.2"
6 6
7 7 def project do
8 8 [app: :floki,