2017-09-01 6 views
0

私は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;"}], 
    []}]}]} 

それはすべての要素を列挙し、hrefまたはsrcを持っているもののためにそれらへの完全なパスを追加することが可能である:そして、次のタプルを受け取りますか?たとえば、この場合は次のように置き換えます。http://localhost/css/app.csshttp://localhost/js/app.js

+0

ええ、可能です。 – JustMichael

答えて

2

ここでは、再帰関数を使用する方法の1つです。

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 
+0

'if'がエリクシールコードで厄介に見えますが、2つの異なる関数節に変更してもよろしいですか? – mudasobwa

+3

私が見る限り、最初の 'use_full_path'節は必要ありません。 – Dogbert

+0

ちょっと@Gazler、ありがとう!私が必要としていたのとまったく同じです。すてきな一日を! – Ilya

関連する問題