Compile attrs at runtime to enable interpolation

This commit is contained in:
Mitchell Hanberg 2019-04-27 11:45:20 -04:00
parent 48c5eacf25
commit 53ede43000
2 changed files with 15 additions and 3 deletions

View file

@ -56,7 +56,8 @@ defmodule Dsl.Html do
el = unquote(el)
quote do
put_buffer(var!(buff, Dsl.Html), "<#{unquote(el)}#{unquote(compile_attrs(attrs))}>")
attrs = unquote(attrs)
put_buffer(var!(buff, Dsl.Html), "<#{unquote(el)}#{compile_attrs(attrs)}>")
unquote(inner)
put_buffer(var!(buff, Dsl.Html), "</#{unquote(el)}>")
end
@ -123,9 +124,9 @@ defmodule Dsl.Html do
def insert_props(ast, _inner), do: ast
defp compile_attrs([]), do: ""
def compile_attrs([]), do: ""
defp compile_attrs(attrs) do
def compile_attrs(attrs) do
for {name, value} <- attrs, into: "" do
name = name |> Atom.to_string() |> String.replace("_", "-")

View file

@ -275,5 +275,16 @@ defmodule Dsl.HtmlTest do
assert result ==
~s|<div>:atom</div><div>%{key: &quot;value&quot;}</div><div>{:status, :tuple}</div><div>&quot;string&quot;</div><div>1</div><div>[1, 2, 3]</div>|
end
test "can use string interpolation in props" do
interop = "hi"
{:safe, result} =
htm do
div(class: "#{interop} world")
end
assert result == ~s{<div class="hi world"></div>}
end
end
end