Skip to content

Commit 59b2665

Browse files
committed
Append space on middle and start expr if necessary, closes #10340
1 parent 1c8e625 commit 59b2665

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

lib/eex/lib/eex/tokenizer.ex

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ defmodule EEx.Tokenizer do
6565
error
6666

6767
{:ok, expr, new_line, new_column, rest} ->
68-
key =
68+
{key, expr} =
6969
case :elixir_tokenizer.tokenize(expr, 1, file: "eex", check_terminators: false) do
70-
{:ok, tokens} -> token_key(tokens)
71-
{:error, _, _, _} -> :expr
70+
{:ok, tokens} -> token_key(tokens, expr)
71+
{:error, _, _, _} -> {:expr, expr}
7272
end
7373

7474
{rest, new_line, new_column, buffer} =
@@ -122,38 +122,42 @@ defmodule EEx.Tokenizer do
122122
end
123123

124124
# Receives tokens and check if it is a start, middle or an end token.
125-
defp token_key(tokens) do
125+
defp token_key(tokens, expr) do
126126
case {tokens, Enum.reverse(tokens)} do
127127
{[{:end, _} | _], [{:do, _} | _]} ->
128-
:middle_expr
128+
{:middle_expr, expr}
129129

130130
{_, [{:do, _} | _]} ->
131-
:start_expr
131+
{:start_expr, maybe_append_space(expr)}
132132

133133
{_, [{:block_identifier, _, _} | _]} ->
134-
:middle_expr
134+
{:middle_expr, maybe_append_space(expr)}
135135

136136
{[{:end, _} | _], [{:stab_op, _, _} | _]} ->
137-
:middle_expr
137+
{:middle_expr, expr}
138138

139139
{_, [{:stab_op, _, _} | reverse_tokens]} ->
140140
fn_index = Enum.find_index(reverse_tokens, &match?({:fn, _}, &1)) || :infinity
141141
end_index = Enum.find_index(reverse_tokens, &match?({:end, _}, &1)) || :infinity
142142

143143
if end_index > fn_index do
144-
:start_expr
144+
{:start_expr, expr}
145145
else
146-
:middle_expr
146+
{:middle_expr, expr}
147147
end
148148

149149
{tokens, _} ->
150150
case Enum.drop_while(tokens, &closing_bracket?/1) do
151-
[{:end, _} | _] -> :end_expr
152-
_ -> :expr
151+
[{:end, _} | _] -> {:end_expr, expr}
152+
_ -> {:expr, expr}
153153
end
154154
end
155155
end
156156

157+
defp maybe_append_space([?\s]), do: [?\s]
158+
defp maybe_append_space([h]), do: [h, ?\s]
159+
defp maybe_append_space([h | t]), do: [h | maybe_append_space(t)]
160+
157161
defp closing_bracket?({closing, _}) when closing in ~w"( [ {"a, do: true
158162
defp closing_bracket?(_), do: false
159163

lib/eex/test/eex_test.exs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ defmodule EExTest do
127127
end
128128

129129
test "trim mode with no spaces" do
130+
string = """
131+
<%=if true do%>
132+
this
133+
<%else%>
134+
that
135+
<%end%>
136+
"""
137+
138+
expected = "\n this\n"
139+
assert_eval(expected, string, [], trim: true)
140+
130141
string = """
131142
<%=cond do%>
132143
<%false ->%>

0 commit comments

Comments
 (0)