From 078db6e38e05b72d8b9a8ce758db4c3a84af2b68 Mon Sep 17 00:00:00 2001 From: Thelonius Kort Date: Thu, 19 Jan 2023 13:48:56 +0100 Subject: [PATCH] Update garnish and render_doc functions Now all element node attributes have to be threaded through the eph.attributes which is done by the garnish function. --- lib/outlook/internal_tree.ex | 5 +++ lib/outlook/internal_tree/internal_tree.ex | 32 +++++++------------ .../components/html_doc_component.ex | 17 ++++------ 3 files changed, 23 insertions(+), 31 deletions(-) diff --git a/lib/outlook/internal_tree.ex b/lib/outlook/internal_tree.ex index 45d9874..d3225e6 100644 --- a/lib/outlook/internal_tree.ex +++ b/lib/outlook/internal_tree.ex @@ -33,6 +33,11 @@ defmodule Outlook.InternalTree do options, fn prop, opts -> Map.put_new(opts, prop, []) end ) + options = Enum.reduce( + ~w(elements tunits)a, + options, + fn prop, opts -> Map.put_new(opts, prop, %{}) end + ) InternalTree.garnish(tree, options) end diff --git a/lib/outlook/internal_tree/internal_tree.ex b/lib/outlook/internal_tree/internal_tree.ex index a6df36b..b3e3166 100644 --- a/lib/outlook/internal_tree/internal_tree.ex +++ b/lib/outlook/internal_tree/internal_tree.ex @@ -2,23 +2,13 @@ defmodule Outlook.InternalTree.InternalTree do alias Outlook.InternalTree.{InternalNode,TranslationUnit} - def garnish([%TranslationUnit{} = node | rest], %{tunits: _} = options) do + def garnish([%TranslationUnit{} = node | rest], options) do [ set_attributes(node, options.tunits, options.tu_ids) | garnish(rest, options) ] end - def garnish([%TranslationUnit{} = node | rest], options) do - [ node | garnish(rest, options) ] - end - - def garnish([%InternalNode{type: :element} = node | rest], %{elements: _} = options) do - node = set_attributes(node, options.elements, options.el_ids, options.el_names) - [ %InternalNode{node | - content: garnish(node.content, options) - } | garnish(rest, options) ] - end - def garnish([%InternalNode{type: :element} = node | rest], options) do + node = set_attributes(node, options.elements, options.el_ids, options.el_names) [ %InternalNode{node | content: garnish(node.content, options) } | garnish(rest, options) ] @@ -56,14 +46,16 @@ defmodule Outlook.InternalTree.InternalTree do end defp set_attributes(node, atts) do - attributes = Map.get(atts, :atts, %{}) - attributes = if Map.has_key?(atts, :phx) do - # TODO: for all keys in atts.phx create a respective entry - Map.put(attributes, "phx-click",atts.phx.click) - # TODO: only convert to string if present - |> Map.put("phx-target", atts.phx.target |> to_string) - |> Map.put("phx-value-nid", node.nid) - end + node_atts = Map.get(node, :attributes, %{}) + |> Map.merge(Map.get(node.eph, :attributes, %{})) + attributes = Enum.map(atts, fn {k,v} -> + nv = case is_function(v) do + true -> v.(node) + false -> v + end + {k,nv} + end) + |> Enum.into(node_atts) %{node | eph: Map.put(node.eph, :attributes, attributes)} end end diff --git a/lib/outlook_web/components/html_doc_component.ex b/lib/outlook_web/components/html_doc_component.ex index 72b5951..c62d564 100644 --- a/lib/outlook_web/components/html_doc_component.ex +++ b/lib/outlook_web/components/html_doc_component.ex @@ -11,9 +11,7 @@ defmodule OutlookWeb.HtmlDocComponent do def render_doc(%{tunit_tag: _} = assigns) do ~H""" - <%= for node <- @tree do %> - <.dnode node={node} tunit_tag={@tunit_tag} /> - <% end %> + <.dnode :for={node <- @tree} node={node} tunit_tag={@tunit_tag} /> """ end def render_doc(assigns) do @@ -24,9 +22,8 @@ defmodule OutlookWeb.HtmlDocComponent do def dnode(%{node: %{status: status}} = assigns) do ~H""" - <.dynamic_tag name={@tunit_tag} class="tunit" nid={@node.nid} {Map.get(@node.eph, :attributes, %{})}> - <%= @node.content |> raw %> - + <.dynamic_tag name={@tunit_tag} nid={@node.nid} {Map.get(@node.eph, :attributes, %{})} + ><%= @node.content |> raw %> """ end @@ -38,11 +35,9 @@ defmodule OutlookWeb.HtmlDocComponent do def dnode(assigns) when assigns.node.type == :element do ~H""" - <.dynamic_tag name={@node.name} nid={@node.nid} {@node.attributes |> Map.merge(Map.get(@node.eph, :attributes, %{}))}> - <%= for child_node <- @node.content do %> - <.dnode node={child_node} tunit_tag={@tunit_tag} /> - <% end %> - + <.dynamic_tag name={@node.name} nid={@node.nid} {Map.get(@node.eph, :attributes, %{})} + ><.dnode :for={child_node <- @node.content} node={child_node} tunit_tag={@tunit_tag} + /> """ end