Elixir/Phoenix 通过元组枚举替换路径

Elixir/Phoenix enum through tuple to replace paths

我正在用 Floki 解析一些 HTML。并接收以下元组:

{"html", [{"lang", "en"}],
 [{"head", [],
   [{"title", [], ["My App"]},
    {"link", [{"rel", "stylesheet"}, {"href", "/css/app.css"}], []}]},
  {"body", [],
   [{"main", [{"id", "main_container"}, {"role", "main"}], []},
    {"script", [{"src", "/js/app.js"}], [""]},
    {"iframe",
     [{"src", "/phoenix/live_reload/frame"}, {"style", "display: none;"}],
     []}]}]}

是否可以枚举所有元素,并为具有 hrefsrc 的元素添加完整路径?例如,在这种情况下将它们替换为:http://localhost/css/app.csshttp://localhost/js/app.js

这是您可以使用递归函数实现的一种方法。

defmodule HTML do

  def use_full_path({el, attrs, children}) do
    {el, update_attrs(attrs), Enum.map(children, &use_full_path/1)}
  end

  def use_full_path(string) do
    string
  end


  defp update_attrs(attrs) do
    Enum.map(attrs, fn {key, val} ->
      if key in ["href", "src"] do
        {key, "http://localhost" <> val}
      else
        {key, val}
      end
    end)
  end
end

tree = {"html", [{"lang", "en"}],
 [{"head", [],
   [{"title", [], ["My App"]},
    {"link", [{"rel", "stylesheet"}, {"href", "/css/app.css"}], []}]},
  {"body", [],
   [{"main", [{"id", "main_container"}, {"role", "main"}], []},
    {"script", [{"src", "/js/app.js"}], [""]},
    {"iframe",
     [{"src", "/phoenix/live_reload/frame"}, {"style", "display: none;"}],
     []}]}]}

HTML.use_full_path(tree) |> IO.inspect