mirror of
https://github.com/woutdp/live_svelte
synced 2026-05-24 09:28:21 +00:00
67 lines
1.3 KiB
Elixir
67 lines
1.3 KiB
Elixir
defmodule LiveSvelte.Slots do
|
|
@moduledoc false
|
|
|
|
import Phoenix.Component
|
|
|
|
@doc false
|
|
def rendered_slot_map(assigns) do
|
|
assigns
|
|
|> filter_slots_from_assigns()
|
|
|> render_slots()
|
|
end
|
|
|
|
@doc false
|
|
def js_process(assigns) do
|
|
assigns
|
|
|> Enum.map(fn
|
|
{:inner_block, value} -> {:default, value}
|
|
key_value -> key_value
|
|
end)
|
|
|> Enum.into(%{})
|
|
end
|
|
|
|
@doc false
|
|
def base_encode_64(assigns) do
|
|
assigns
|
|
|> Enum.map(fn {key, value} -> {key, Base.encode64(value)} end)
|
|
|> Enum.into(%{})
|
|
end
|
|
|
|
@doc """
|
|
Filters assigns to return only slot entries.
|
|
Slots are identified by having a list value containing maps with `__slot__` key.
|
|
"""
|
|
def filter_slots_from_assigns(assigns) do
|
|
assigns
|
|
|> Enum.filter(fn
|
|
{_key, value} when is_list(value) ->
|
|
Enum.any?(value, fn
|
|
%{__slot__: _} -> true
|
|
_ -> false
|
|
end)
|
|
|
|
_ ->
|
|
false
|
|
end)
|
|
|> Enum.into(%{})
|
|
end
|
|
|
|
@doc false
|
|
defp render_slots(assigns) do
|
|
Enum.reduce(assigns, %{}, fn
|
|
{key, value}, acc -> Map.put(acc, key, render(%{slot: value}))
|
|
end)
|
|
end
|
|
|
|
@doc false
|
|
defp render(assigns) do
|
|
~H"""
|
|
<%= if assigns[:slot] do %>
|
|
{render_slot(@slot)}
|
|
<% end %>
|
|
"""
|
|
|> Phoenix.HTML.Safe.to_iodata()
|
|
|> List.to_string()
|
|
|> String.trim()
|
|
end
|
|
end
|