defmodule OutlookWeb.HtmlDocComponent do use Phoenix.Component # use OutlookWeb, :html import OutlookWeb.CoreComponents import Phoenix.HTML alias Phoenix.LiveView.JS attr :tree, :list, required: true def render_doc(%{tunit_tag: _} = assigns) do ~H""" <%= for node <- @tree do %> <.dnode node={node} tunit_tag={@tunit_tag} /> <% end %> """ end def render_doc(assigns) do assigns |> assign(:tunit_tag, "span") |> render_doc() end 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 %> """ end 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 %> """ end def dnode(assigns) when assigns.node.type == :text do ~H"<%= @node.content %>" end def dnode(assigns) when assigns.node.type == :comment do ~H"" end end