Packages
moon
2.81.0
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon/convert.ex
defmodule Moon.Convert do
@moduledoc false
alias Surface.Compiler.Parser
def surface_to_liveview(c = %{module: module}) do
import __MODULE__.{Ast, Module}
ast = module |> module_ast()
c = Map.put(c, :aliases, ast |> ast_aliases(c))
ast
|> Macro.prewalk(nil, fn
result = {:def, _, [{:render, _, _} | _]}, acc ->
{translate_render(c, result), acc}
result = {:sigil_F, _, _}, acc ->
{translate_sigil(c, result), acc}
result = {:prop, _meta, _options}, acc ->
{translate_prop(c, result, acc), nil}
result = {:data, _meta, _options}, acc ->
{translate_prop(c, result, acc), nil}
result = {:slot, _meta, _options}, acc ->
{translate_slot(c, result, acc), nil}
result = {:@, _, [{:moduledoc, _, [_text]}]}, acc ->
{translate_moduledoc(c, result), acc}
result = {:@, _, [{:doc, _, [_text]}]}, _acc ->
{:skip, translate_doc(c, result)}
result = {:use, _, [{:__aliases__, _, _alias} | _]}, acc ->
{translate_use_defmodule(c, result), acc}
result = {:defmodule, _, [{:__aliases__, _, _alias} | _]}, acc ->
{translate_use_defmodule(c, result), acc}
other, acc ->
{other, acc}
end)
|> Tuple.to_list()
|> hd()
end
defp translate_sigil(context, {:sigil_F, m1, [{:<<>>, meta, [string]}, opts]}) do
import __MODULE__.{Tokens, Template}
# "copy of Surface.sigil_F macro & Surface.Compiler.compile"
result =
string
|> Parser.parse!(
# file: module.__info__(:compile)[:source] |> to_string(),
# line: meta[:line] + if(Keyword.has_key?(meta, :indentation), do: 1, else: 0),
# caller: %{module: module, function: :render},
# checks: opts[:checks] || [],
# warnings: opts[:warnings] || [],
# column: Keyword.get(opts, :column, 1),
# indentation: Keyword.get(opts, :indentation, 0)
)
|> prewalk(context, fn
# :text, text, context ->
# {text, context}
_node_type, node, context ->
{translate_node(node, context), context}
end)
|> Tuple.to_list()
|> hd()
|> to_text()
{:sigil_H, m1, [{:<<>>, meta, [result]}, opts]}
end
end