Packages
floki
0.10.1
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
4
files changed
+34
additions
-35
deletions
| @@ -100,7 +100,7 @@ Add Floki in your `mix.exs`, as a dependency: | |
| 100 100 | ```elixir |
| 101 101 | defp deps do |
| 102 102 | [ |
| 103 | - {:floki, "~> 0.9.0"} |
| 103 | + {:floki, "~> 0.10.1"} |
| 104 104 | ] |
| 105 105 | end |
| 106 106 | ``` |
| @@ -22,4 +22,4 @@ | |
| 22 22 | {<<"name">>,<<"mochiweb_html">>}, |
| 23 23 | {<<"optional">>,false}, |
| 24 24 | {<<"requirement">>,<<"~> 2.15">>}]]}. |
| 25 | - {<<"version">>,<<"0.10.0">>}. |
| 25 | + {<<"version">>,<<"0.10.1">>}. |
| @@ -62,19 +62,18 @@ defmodule Floki.Finder do | |
| 62 62 | traverse(html_node, sibling_nodes, tail_selectors, acc) |
| 63 63 | end |
| 64 64 | defp traverse({_, _, children_nodes} = html_node, sibling_nodes, selector, acc) do |
| 65 | - acc = |
| 66 | - if Selector.match?(html_node, selector) do |
| 67 | - combinator = selector.combinator |
| 68 | - case combinator do |
| 69 | - nil -> [html_node|acc] |
| 70 | - _ -> |
| 71 | - traverse_using(combinator, children_nodes, sibling_nodes, acc) |
| 72 | - end |
| 73 | - else |
| 74 | - acc |
| 75 | - end |
| 65 | + if Selector.match?(html_node, selector) do |
| 66 | + combinator = selector.combinator |
| 76 67 | |
| 77 | - traverse(children_nodes, sibling_nodes, selector, acc) |
| 68 | + case combinator do |
| 69 | + nil -> |
| 70 | + traverse(children_nodes, sibling_nodes, selector, [html_node|acc]) |
| 71 | + _ -> |
| 72 | + traverse_using(combinator, children_nodes, sibling_nodes, acc) |
| 73 | + end |
| 74 | + else |
| 75 | + traverse(children_nodes, sibling_nodes, selector, acc) |
| 76 | + end |
| 78 77 | end |
| 79 78 | |
| 80 79 | defp traverse_using(combinator, children_nodes, sibling_nodes, acc) do |
| @@ -82,36 +81,36 @@ defmodule Floki.Finder do | |
| 82 81 | |
| 83 82 | case combinator.match_type do |
| 84 83 | :descendant -> |
| 85 | - traverse(children_nodes, sibling_nodes, selector, acc) |
| 84 | + traverse(children_nodes, [], selector, acc) |
| 86 85 | :child -> |
| 87 | - traverse_child(children_nodes, sibling_nodes, selector, acc) |
| 86 | + traverse_child(children_nodes, selector, acc) |
| 88 87 | :sibling -> |
| 89 | - traverse_sibling(children_nodes, sibling_nodes, selector, acc) |
| 88 | + traverse_sibling(sibling_nodes, selector, acc) |
| 90 89 | :general_sibling -> |
| 91 | - traverse_general_sibling(children_nodes, sibling_nodes, selector, acc) |
| 90 | + traverse_general_sibling(sibling_nodes, selector, acc) |
| 92 91 | other -> |
| 93 92 | raise "Combinator of type \"#{other}\" not implemented" |
| 94 93 | end |
| 95 94 | end |
| 96 95 | |
| 97 | - defp traverse_child(nodes, sibling_nodes, selector, acc) do |
| 98 | - Enum.reduce(nodes, acc, fn(n, res_acc) -> |
| 99 | - if Selector.match?(n, selector) do |
| 100 | - combinator = selector.combinator |
| 96 | + defp traverse_child([], _selector, acc), do: acc |
| 97 | + defp traverse_child([n|sibling_nodes], selector, acc) do |
| 98 | + if Selector.match?(n, selector) do |
| 99 | + combinator = selector.combinator |
| 101 100 | |
| 102 | - case combinator do |
| 103 | - nil -> [n|res_acc] |
| 104 | - _ -> |
| 105 | - {_, _, children_nodes} = n |
| 106 | - traverse_using(combinator, children_nodes, sibling_nodes, res_acc) |
| 107 | - end |
| 108 | - else |
| 109 | - res_acc |
| 101 | + case combinator do |
| 102 | + nil -> |
| 103 | + traverse_child(sibling_nodes, selector, [n|acc]) |
| 104 | + _ -> |
| 105 | + {_, _, children_nodes} = n |
| 106 | + traverse_using(combinator, children_nodes, sibling_nodes, acc) |
| 110 107 | end |
| 111 | - end) |
| 108 | + else |
| 109 | + traverse_child(sibling_nodes, selector, acc) |
| 110 | + end |
| 112 111 | end |
| 113 112 | |
| 114 | - defp traverse_sibling(_nodes, sibling_nodes, selector, acc) do |
| 113 | + defp traverse_sibling(sibling_nodes, selector, acc) do |
| 115 114 | sibling_nodes = Enum.drop_while(sibling_nodes, &ignore_node?/1) |
| 116 115 | |
| 117 116 | sibling_node = case sibling_nodes do |
| @@ -131,7 +130,7 @@ defmodule Floki.Finder do | |
| 131 130 | end |
| 132 131 | end |
| 133 132 | |
| 134 | - defp traverse_general_sibling(_nodes, sibling_nodes, selector, acc) do |
| 133 | + defp traverse_general_sibling(sibling_nodes, selector, acc) do |
| 135 134 | sibling_nodes = Enum.drop_while(sibling_nodes, &ignore_node?/1) |
| 136 135 | |
| 137 136 | Enum.reduce(sibling_nodes, acc, fn(sibling_node, res_acc) -> |
| @@ -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.10.0" |
| 5 | + @version "0.10.1" |
| 6 6 | |
| 7 7 | def project do |
| 8 8 | [app: :floki, |
| @@ -33,7 +33,7 @@ defmodule Floki.Mixfile do | |
| 33 33 | %{ |
| 34 34 | maintainers: ["Philip Sampaio Silva"], |
| 35 35 | licenses: ["MIT"], |
| 36 | - files: ["lib", "priv", "src/*.xrl", "mix.exs", "README.md", "LICENSE"], |
| 36 | + files: ["lib", "src/*.xrl", "mix.exs", "README.md", "LICENSE"], |
| 37 37 | links: %{ |
| 38 38 | "GitHub" => "https://github.com/philss/floki", |
| 39 39 | "Docs" => "http://hexdocs.pm/floki" |