Packages
floki
0.17.2
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.1
0.37.0
0.36.3
0.36.2
0.36.1
0.36.0
0.35.4
0.35.3
0.35.2
0.35.1
0.35.0
0.34.3
0.34.2
0.34.1
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.1
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.2
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.0
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Floki is a simple HTML parser that enables search for nodes using CSS selectors.
Current section
86 Versions
Jump to
Current section
86 Versions
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, |