Packages

phoenix_kit

1.7.54
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules publishing page_builder renderer.ex
Raw

lib/modules/publishing/page_builder/renderer.ex

defmodule PhoenixKit.Modules.Publishing.PageBuilder.Renderer do
@moduledoc """
Renders AST nodes to HTML by delegating to component modules.
"""
@doc """
Renders an AST node to HTML.
"""
def render(ast, assigns) when is_map(ast) do
case resolve_component(ast.type) do
{:ok, component_module} ->
render_component(component_module, ast, assigns)
{:error, :not_found} ->
# Fallback for unknown components
render_unknown(ast, assigns)
end
end
def render(ast, _assigns) when is_list(ast) do
{:ok,
Phoenix.HTML.raw(
Enum.map_join(ast, fn node ->
case render(node, %{}) do
{:ok, html} -> Phoenix.HTML.safe_to_string(html)
{:error, _} -> ""
end
end)
)}
end
def render(content, _assigns) when is_binary(content) do
{:ok, Phoenix.HTML.raw(content)}
end
# Resolve component type to module
defp resolve_component(:page), do: {:ok, PhoenixKit.Modules.Shared.Components.Page}
defp resolve_component(:hero), do: {:ok, PhoenixKit.Modules.Shared.Components.Hero}
defp resolve_component(:headline), do: {:ok, PhoenixKit.Modules.Shared.Components.Headline}
defp resolve_component(:subheadline),
do: {:ok, PhoenixKit.Modules.Shared.Components.Subheadline}
defp resolve_component(:cta), do: {:ok, PhoenixKit.Modules.Shared.Components.CTA}
defp resolve_component(:image), do: {:ok, PhoenixKit.Modules.Shared.Components.Image}
defp resolve_component(:video), do: {:ok, PhoenixKit.Modules.Shared.Components.Video}
defp resolve_component(:entityform),
do: {:ok, PhoenixKit.Modules.Shared.Components.EntityForm}
defp resolve_component(_), do: {:error, :not_found}
# Render using the component module
defp render_component(component_module, ast, assigns) do
component_assigns = build_component_assigns(ast, assigns)
try do
html = component_module.render(component_assigns)
{:ok, html}
rescue
e ->
{:error, {:render_error, e}}
end
end
# Build assigns map for component
defp build_component_assigns(ast, parent_assigns) do
base_assigns = %{
__changed__: nil,
variant: Map.get(ast.attributes, "variant", "default"),
attributes: ast.attributes,
content: ast[:content],
children: ast[:children] || []
}
Map.merge(parent_assigns, base_assigns)
end
# Fallback renderer for unknown components
defp render_unknown(ast, assigns) do
content =
cond do
ast[:content] ->
ast.content
ast[:children] ->
Enum.map_join(ast.children, fn child ->
case render(child, assigns) do
{:ok, html} -> Phoenix.HTML.safe_to_string(html)
_ -> ""
end
end)
true ->
""
end
{:ok, Phoenix.HTML.raw("<div class=\"unknown-component\">#{content}</div>")}
end
end