diff --git a/lib/dsl/html.ex b/lib/dsl/html.ex index 2e3c5a9..6a44945 100644 --- a/lib/dsl/html.ex +++ b/lib/dsl/html.ex @@ -1,5 +1,6 @@ defmodule Dsl.Html do alias Phoenix.HTML + alias Dsl.Utils @nonvoid_elements ~w[ html @@ -55,13 +56,13 @@ defmodule Dsl.Html do import Kernel, except: [div: 2] import HTML.Link, except: [link: 1, link: 2] - {:ok, var!(buff, Dsl.Html)} = start_buffer([]) + {:ok, var!(buff, Dsl.Html)} = Utils.start_buffer([]) unquote(block) - markup = get_buffer(var!(buff, Dsl.Html)) + markup = Utils.get_buffer(var!(buff, Dsl.Html)) - :ok = stop_buffer(var!(buff, Dsl.Html)) + :ok = Utils.stop_buffer(var!(buff, Dsl.Html)) markup |> Enum.reverse() |> Enum.join("") |> HTML.raw() end @@ -75,8 +76,8 @@ defmodule Dsl.Html do el = unquote(el) quote do - put_open_tag(var!(buff, Dsl.Html), unquote(el), []) - put_close_tag(var!(buff, Dsl.Html), unquote(el)) + Utils.put_open_tag(var!(buff, Dsl.Html), unquote(el), []) + Utils.put_close_tag(var!(buff, Dsl.Html), unquote(el)) end end @@ -85,9 +86,9 @@ defmodule Dsl.Html do el = unquote(el) quote do - put_open_tag(var!(buff, Dsl.Html), unquote(el), []) + Utils.put_open_tag(var!(buff, Dsl.Html), unquote(el), []) _ = unquote(inner) - put_close_tag(var!(buff, Dsl.Html), unquote(el)) + Utils.put_close_tag(var!(buff, Dsl.Html), unquote(el)) end end @@ -95,8 +96,8 @@ defmodule Dsl.Html do el = unquote(el) quote do - put_open_tag(var!(buff, Dsl.Html), unquote(el), unquote(attrs_or_content_or_block)) - put_close_tag(var!(buff, Dsl.Html), unquote(el)) + Utils.put_open_tag(var!(buff, Dsl.Html), unquote(el), unquote(attrs_or_content_or_block)) + Utils.put_close_tag(var!(buff, Dsl.Html), unquote(el)) end end @@ -106,9 +107,9 @@ defmodule Dsl.Html do quote do attrs = unquote(attrs) - put_open_tag(var!(buff, Dsl.Html), unquote(el), attrs) + Utils.put_open_tag(var!(buff, Dsl.Html), unquote(el), attrs) _ = unquote(inner) - put_close_tag(var!(buff, Dsl.Html), unquote(el)) + Utils.put_close_tag(var!(buff, Dsl.Html), unquote(el)) end end @@ -117,26 +118,13 @@ defmodule Dsl.Html do quote do attrs = unquote(attrs) - put_open_tag(var!(buff, Dsl.Html), unquote(el), attrs) + Utils.put_open_tag(var!(buff, Dsl.Html), unquote(el), attrs) text unquote(content) - put_close_tag(var!(buff, Dsl.Html), unquote(el)) + Utils.put_close_tag(var!(buff, Dsl.Html), unquote(el)) end end end - def put_open_tag(buff, el, attrs) when is_list(attrs) do - put_buffer(buff, "<#{el}#{compile_attrs(attrs)}>") - end - - def put_open_tag(buff, el, content) when is_binary(content) do - put_buffer(buff, "<#{el}>") - put_buffer(buff, content) - end - - def put_close_tag(buff, el) do - put_buffer(buff, "") - end - for el <- @void_elements do @doc """ #{File.read!("./tmp/docs/#{el}.txt")} @@ -148,9 +136,9 @@ defmodule Dsl.Html do quote do attrs = unquote(attrs) - put_buffer( + Utils.put_buffer( var!(buff, Dsl.Html), - "<#{unquote(el)}#{compile_attrs(attrs)}>" + "<#{unquote(el)}#{Utils.compile_attrs(attrs)}>" ) end end @@ -158,7 +146,7 @@ defmodule Dsl.Html do defmacro text(text) do quote do - put_buffer( + Utils.put_buffer( var!(buff, Dsl.Html), unquote(text) |> to_string |> HTML.html_escape() |> HTML.safe_to_string() ) @@ -167,7 +155,7 @@ defmodule Dsl.Html do defmacro javascript(code) do quote do - put_buffer( + Utils.put_buffer( var!(buff, Dsl.Html), unquote(code) |> to_string ) @@ -176,21 +164,13 @@ defmodule Dsl.Html do defmacro partial(partial) do quote do - put_buffer( + Utils.put_buffer( var!(buff, Dsl.Html), - unquote(partial) |> from_safe() + unquote(partial) |> Utils.from_safe() ) end end - def from_safe({:safe, partial}) do - partial - end - - def from_safe(partial) do - partial |> HTML.html_escape() |> HTML.safe_to_string() - end - defmacro defcomponent(name, do: block) do quote do defmacro unquote(name)(props \\ []) do @@ -209,7 +189,7 @@ defmodule Dsl.Html do outer = unquote(Macro.escape(block)) - |> Macro.prewalk(&insert_props(&1, [{:children, inner} | props])) + |> Macro.prewalk(&Utils.insert_props(&1, [{:children, inner} | props])) name = unquote(name) @@ -220,24 +200,12 @@ defmodule Dsl.Html do end end - def insert_props({:@, _, [{name, _, _}]}, props) when is_atom(name) do - props[name] end - def insert_props(ast, _inner), do: ast - def compile_attrs([]), do: "" - def compile_attrs(attrs) do - for {name, value} <- attrs, into: "" do - name = name |> Atom.to_string() |> String.replace("_", "-") - " " <> name <> "=\"" <> to_string(value) <> "\"" end end - def start_buffer(initial_buffer), do: Agent.start(fn -> initial_buffer end) - def put_buffer(buff, content), do: Agent.update(buff, &[content | &1]) - def get_buffer(buff), do: Agent.get(buff, & &1) - def stop_buffer(buff), do: Agent.stop(buff) end diff --git a/lib/dsl/utils.ex b/lib/dsl/utils.ex new file mode 100644 index 0000000..7b9964c --- /dev/null +++ b/lib/dsl/utils.ex @@ -0,0 +1,45 @@ +defmodule Dsl.Utils do + @moduledoc false + + def put_open_tag(buff, el, attrs) when is_list(attrs) do + put_buffer(buff, "<#{el}#{compile_attrs(attrs)}>") + end + + def put_open_tag(buff, el, content) when is_binary(content) do + put_buffer(buff, "<#{el}>") + put_buffer(buff, content) + end + + def put_close_tag(buff, el) do + put_buffer(buff, "") + end + + def from_safe({:safe, partial}) do + partial + end + + def from_safe(partial) do + partial |> Phoenix.HTML.html_escape() |> Phoenix.HTML.safe_to_string() + end + + def insert_props({:@, _, [{name, _, _}]}, props) when is_atom(name) do + props[name] + end + + def insert_props(ast, _inner), do: ast + + def compile_attrs([]), do: "" + + def compile_attrs(attrs) do + for {name, value} <- attrs, into: "" do + name = name |> Atom.to_string() |> String.replace("_", "-") + + " " <> name <> "=\"" <> to_string(value) <> "\"" + end + end + + def start_buffer(initial_buffer), do: Agent.start(fn -> initial_buffer end) + def put_buffer(buff, content), do: Agent.update(buff, &[content | &1]) + def get_buffer(buff), do: Agent.get(buff, & &1) + def stop_buffer(buff), do: Agent.stop(buff) +end