2017-09-01 2 views
0

Je suis en train d'analyser du HTML avec Floki. Et recevoir le tuple suivant:Elixir/Phoenix enum à travers un tuple pour remplacer les chemins

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

Est-il possible d'énumérer tous les éléments, et pour ceux qui ont href ou src ajouter le chemin complet pour eux? Par exemple dans ce cas, remplacez-les par: http://localhost/css/app.css et http://localhost/js/app.js

+0

Oui, c'est possible. – JustMichael

Répondre

2

Voici une façon de le faire en utilisant une fonction récursive.

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' semble méchant dans le code Elixir, cela vous dérangerait-il de le changer en 2 clauses de fonction différentes? – mudasobwa

+3

Il n'y a pas besoin de la première clause 'use_full_path' autant que je peux voir. – Dogbert

+0

Hey @Gazler, merci beaucoup! Fonctionne exactement comme j'en avais besoin. Passez une bonne journée! – Ilya