Packages
floki
0.13.0
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/selector/pseudo_class.ex
defmodule Floki.Selector.PseudoClass do
@moduledoc false
require Logger
# Represents a pseudo-class selector
defstruct name: "", value: nil
alias Floki.HTMLTree.HTMLNode
def match_nth_child?(_, %HTMLNode{parent_node_id: nil}, _), do: false
def match_nth_child?(tree, html_node, %__MODULE__{value: position}) when is_integer(position) do
node_position(tree, html_node) == position
end
def match_nth_child?(tree, html_node, %__MODULE__{value: "even"}) do
position = node_position(tree, html_node)
rem(position, 2) == 0
end
def match_nth_child?(tree, html_node, %__MODULE__{value: "odd"}) do
position = node_position(tree, html_node)
rem(position, 2) == 1
end
def match_nth_child?(_, _, %__MODULE__{value: expression}) do
Logger.warn("Pseudo-class nth-child with expressions like #{inspect expression} are not supported yet. Ignoring.")
false
end
defp node_position(tree, html_node) do
parent_node = Map.get(tree.nodes, html_node.parent_node_id)
children_nodes_ids = parent_node.children_nodes_ids
|> Enum.reverse
|> filter_only_html_nodes(tree.nodes)
|> Enum.with_index(1)
{_node_id, position} = Enum.find(children_nodes_ids, fn({id, _}) -> id == html_node.node_id end)
position
end
defp filter_only_html_nodes(ids, nodes) do
Enum.filter(ids, fn(id) ->
case Map.get(nodes, id) do
%HTMLNode{} -> true
_ -> false
end
end)
end
end