Packages
floki
0.3.3
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
Files
Jump to
Current section
Files
lib/floki/matchers.ex
defmodule Floki.Matchers do
@moduledoc false
def attr_matcher({attr, value}, node, acc) do
{_, attributes, _} = node
{:ok, acc_nodes} = acc
if attribute_match?(attributes, attr, value) do
acc = {:ok, [node|acc_nodes]}
end
acc
end
def attr_matcher({tag_name, attr, value}, node, acc) do
{tag, attributes, _} = node
{:ok, acc_nodes} = acc
if tag == tag_name and attribute_match?(attributes, attr, value) do
acc = {:ok, [node|acc_nodes]}
end
acc
end
def class_matcher(class_name, node, acc) do
{_, attributes, _} = node
{:ok, acc_nodes} = acc
if attribute_match?(attributes, "class", class_name) do
acc = {:ok, [node|acc_nodes]}
end
acc
end
def tag_matcher(tag_name, node, acc) do
{tag, _, _} = node
{:ok, acc_nodes} = acc
if tag == tag_name do
acc = {:ok, [node|acc_nodes]}
end
acc
end
def id_matcher(id, node, acc) do
{_, attributes, _} = node
{:ok, acc_nodes} = acc
if attribute_match?(attributes, "id", id) do
acc = {:done, [node|acc_nodes]}
end
acc
end
def value_match?(attribute_value, selector_value) do
attribute_value
|> String.split
|> Enum.any?(fn(x) -> x == selector_value end)
end
def attribute_match?(attributes, attribute_name) do
Enum.find attributes, fn({attr_name, _}) ->
attr_name == attribute_name
end
end
def attribute_match?(attributes, attribute_name, selector_value) do
Enum.find attributes, fn(attribute) ->
{attr_name, attr_value} = attribute
attr_name == attribute_name && value_match?(attr_value, selector_value)
end
end
end