Floki.traverse_and_update
traverse_and_update
, go back to Floki module for more information.
Specs
traverse_and_update( html_tree(), (html_tag() | html_comment() | html_doctype() | html_declaration() -> html_node() | nil) ) :: html_tree()
Traverses and updates a HTML tree structure.
This function returns a new tree structure that is the result of applying the
given fun
on all nodes except text nodes.
The tree is traversed in a post-walk fashion, where the children are traversed
before the parent.
When the function fun
encounters HTML tag, it receives a tuple with
{name, attributes, children}
, and should either return a similar tuple or
nil
to delete the current node.
The function fun
can also encounter HTML doctype, comment or declaration and
will receive, and should return, different tuple for these types. See the
documentation for html_comment/0
, html_doctype/0
and
html_declaration/0
for details.
Note: this won't update text nodes, but you can transform them when working with children nodes.
Examples
iex> html = [{"div", [], ["hello"]}]
iex> Floki.traverse_and_update(html, fn
...> {"div", attrs, children} -> {"p", attrs, children}
...> other -> other
...> end)
[{"p", [], ["hello"]}]
iex> html = [{"div", [], [{:comment, "I am comment"}, {"span", [], ["hello"]}]}]
iex> Floki.traverse_and_update(html, fn
...> {"span", _attrs, _children} -> nil
...> {:comment, text} -> {"span", [], text}
...> other -> other
...> end)
[{"div", [], [{"span", [], "I am comment"}]}]
Specs
traverse_and_update( html_tree(), traverse_acc, (html_tag() | html_comment() | html_doctype() | html_declaration(), traverse_acc -> {html_node() | nil, traverse_acc}) ) :: {html_node(), traverse_acc} when traverse_acc: any()
Traverses and updates a HTML tree structure with an accumulator.
This function returns a new tree structure and the final value of accumulator
which are the result of applying the given fun
on all nodes except text nodes.
The tree is traversed in a post-walk fashion, where the children are traversed
before the parent.
When the function fun
encounters HTML tag, it receives a tuple with
{name, attributes, children}
and an accumulator. It and should return a
2-tuple like {new_node, new_acc}
, where new_node
is either a similar tuple
or nil
to delete the current node, and new_acc
is an updated value for the
accumulator.
The function fun
can also encounter HTML doctype, comment or declaration and
will receive, and should return, different tuple for these types. See the
documentation for html_comment/0
, html_doctype/0
and
html_declaration/0
for details.
Note: this won't update text nodes, but you can transform them when working with children nodes.
Examples
iex> html = [{"div", [], [{:comment, "I am a comment"}, "hello"]}, {"div", [], ["world"]}]
iex> Floki.traverse_and_update(html, 0, fn
...> {"div", attrs, children}, acc ->
...> {{"p", [{"data-count", to_string(acc)} | attrs], children}, acc + 1}
...> other, acc -> {other, acc}
...> end)
{[
{"p", [{"data-count", "0"}], [{:comment, "I am a comment"}, "hello"]},
{"p", [{"data-count", "1"}], ["world"]}
], 2}
iex> html = {"div", [], [{"span", [], ["hello"]}]}
iex> Floki.traverse_and_update(html, [deleted: 0], fn
...> {"span", _attrs, _children}, acc ->
...> {nil, Keyword.put(acc, :deleted, acc[:deleted] + 1)}
...> tag, acc ->
...> {tag, acc}
...> end)
{{"div", [], []}, [deleted: 1]}