diff --git a/lib/surface/compiler/converter.ex b/lib/surface/compiler/converter.ex index adecb7d3..4bd35e5b 100644 --- a/lib/surface/compiler/converter.ex +++ b/lib/surface/compiler/converter.ex @@ -153,6 +153,11 @@ defmodule Surface.Compiler.Converter do [{:unquoted_string, meta} | acc] end + defp extract_meta({:string, _name, %{delimiter: ?"} = meta}, acc) do + meta = %{meta | column: meta.column - 1, column_end: meta.column_end + 1} + [{:double_quoted_string, meta} | acc] + end + defp extract_meta(_node, acc) do acc end diff --git a/lib/surface/compiler/converter_0_5.ex b/lib/surface/compiler/converter_0_5.ex index 17b96922..f43b3033 100644 --- a/lib/surface/compiler/converter_0_5.ex +++ b/lib/surface/compiler/converter_0_5.ex @@ -15,6 +15,16 @@ defmodule Surface.Compiler.Converter_0_5 do "{#{value}}" end + def convert(:double_quoted_string, value, _state, _opts) do + new_value = Regex.replace(~r/{{(.+?)}}/, value, "\#{\\1}") + + if new_value != value do + "{#{new_value}}" + else + value + end + end + def convert(:tag_name, "template", _state, _opts) do "#template" end diff --git a/lib/surface/compiler/tokenizer.ex b/lib/surface/compiler/tokenizer.ex index 00029fc2..c2101d9e 100644 --- a/lib/surface/compiler/tokenizer.ex +++ b/lib/surface/compiler/tokenizer.ex @@ -353,10 +353,12 @@ defmodule Surface.Compiler.Tokenizer do end defp handle_attr_value_begin("\"" <> rest, line, column, acc, state) do + acc = put_attr_value(acc, {:string, nil, %{line: line, column: column + 1, delimiter: ?"}}) handle_attr_value_double_quote(rest, line, column + 1, [], acc, state) end defp handle_attr_value_begin("'" <> rest, line, column, acc, state) do + acc = put_attr_value(acc, {:string, nil, %{line: line, column: column + 1, delimiter: ?'}}) handle_attr_value_single_quote(rest, line, column + 1, [], acc, state) end @@ -388,7 +390,11 @@ defmodule Surface.Compiler.Tokenizer do defp handle_attr_value_double_quote("\"" <> rest, line, column, buffer, acc, state) do value = buffer_to_string(buffer) - acc = put_attr_value(acc, {:string, value, %{delimiter: ?"}}) + + acc = + update_attr_value(acc, fn {type, _old_value, meta} -> + {type, value, Map.merge(meta, %{line_end: line, column_end: column})} + end) handle_maybe_tag_open_end(rest, line, column + 1, acc, state) end @@ -415,7 +421,11 @@ defmodule Surface.Compiler.Tokenizer do defp handle_attr_value_single_quote("'" <> rest, line, column, buffer, acc, state) do value = buffer_to_string(buffer) - acc = put_attr_value(acc, {:string, value, %{delimiter: ?'}}) + + acc = + update_attr_value(acc, fn {type, _old_value, meta} -> + {type, value, Map.merge(meta, %{line_end: line, column_end: column})} + end) handle_maybe_tag_open_end(rest, line, column + 1, acc, state) end diff --git a/test/compiler/converter_0_5_test.exs b/test/compiler/converter_0_5_test.exs index 187e236b..49f571bc 100644 --- a/test/compiler/converter_0_5_test.exs +++ b/test/compiler/converter_0_5_test.exs @@ -207,6 +207,29 @@ defmodule Surface.Compiler.Converter_0_5Test do """ end + test "convert literal strings with embedded interpolation" do + expected = + convert(""" +