Packages
mdex
0.8.5
0.13.3
0.13.2
0.13.1
0.13.0
0.12.5
retired
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Fast and extensible Markdown for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/mdex/document/traversal.ex
defmodule MDEx.Document.Traversal do
@moduledoc false
# traverse_and_update/{2,3} based on https://github.com/philss/floki/blob/96955f925d62989b6f0bfaf09ce6505e67e04fbb/lib/floki/traversal.ex
def traverse_and_update(%{nodes: nodes} = doc, fun) do
fun.(%{doc | nodes: do_traverse_and_update(nodes, fun)})
end
def traverse_and_update(doc, fun) do
fun.(doc)
end
defp do_traverse_and_update([], _fun), do: []
defp do_traverse_and_update([node | rest], fun) do
case do_traverse_and_update(node, fun) do
:pop ->
do_traverse_and_update(rest, fun)
nil ->
do_traverse_and_update(rest, fun)
mapped_node ->
[mapped_node | do_traverse_and_update(rest, fun)]
end
end
defp do_traverse_and_update(%{nodes: nodes} = node, fun) do
fun.(%{node | nodes: do_traverse_and_update(nodes, fun)})
end
defp do_traverse_and_update(%{} = node, fun) do
fun.(node)
end
def traverse_and_update(%{nodes: nodes} = doc, acc, fun) do
{mapped_nodes, new_acc} = do_traverse_and_update(nodes, acc, fun)
fun.(%{doc | nodes: mapped_nodes}, new_acc)
end
def traverse_and_update(doc, acc, fun) do
{node, new_acc} = do_traverse_and_update(doc, acc, fun)
fun.(node, new_acc)
end
defp do_traverse_and_update([], acc, _fun), do: {[], acc}
defp do_traverse_and_update([node | rest], acc, fun) do
case do_traverse_and_update(node, acc, fun) do
{:pop, new_acc} ->
do_traverse_and_update(rest, new_acc, fun)
{nil, new_acc} ->
do_traverse_and_update(rest, new_acc, fun)
{mapped_node, new_acc} ->
{mapped_rest, new_acc_rest} = do_traverse_and_update(rest, new_acc, fun)
{[mapped_node | mapped_rest], new_acc_rest}
end
end
defp do_traverse_and_update(%{nodes: nodes} = node, acc, fun) do
{mapped_nodes, new_acc} = do_traverse_and_update(nodes, acc, fun)
fun.(%{node | nodes: mapped_nodes}, new_acc)
end
defp do_traverse_and_update(%{} = node, acc, fun) do
fun.(node, acc)
end
end