Packages
floki
0.20.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/filter_out.ex
defmodule Floki.FilterOut do
@moduledoc false
alias Floki.{HTMLTree, Finder}
# Helper functions for filtering out a specific element from the tree.
@type html_tree :: tuple | list
@type selector :: binary
@spec filter_out(html_tree, selector) :: tuple | list
def filter_out(html_tree, :comment) do
mapper(html_tree, :comment)
end
def filter_out(html_tree, selector) do
case Finder.find(html_tree, selector) do
{:empty_tree, _} ->
html_tree
{tree, results} ->
new_tree =
Enum.reduce(results, tree, fn html_node, tree ->
HTMLTree.delete_node(tree, html_node)
end)
html_as_tuples =
new_tree.root_nodes_ids
|> Enum.reverse()
|> Enum.map(fn node_id ->
root = Map.get(new_tree.nodes, node_id)
HTMLTree.to_tuple(new_tree, root)
end)
case html_tree do
tree when is_tuple(tree) ->
first_tuple(html_as_tuples)
trees when is_list(trees) ->
html_as_tuples
end
end
end
defp first_tuple([]), do: []
defp first_tuple([head | _rest]), do: head
defp filter({nodetext, _, _}, selector) when nodetext === selector, do: false
defp filter({nodetext, _}, selector) when nodetext === selector, do: false
defp filter(_, _), do: true
defp mapper(nodes, selector) when is_list(nodes) do
nodes
|> Stream.filter(&filter(&1, selector))
|> Stream.map(&mapper(&1, selector))
|> Enum.to_list()
end
defp mapper({nodetext, x, y}, selector) do
{nodetext, x, mapper(y, selector)}
end
defp mapper(nodetext, _), do: nodetext
end