Skip to content

Commit 3fea472

Browse files
committed
IO.ANSI.escape shouldn't emit a reset sequence if no ANSI sequence was emitted
Closes #807
1 parent 7cb1809 commit 3fea472

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

lib/elixir/lib/io/ansi.ex

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,12 @@ defmodule IO.ANSI do
155155
"""
156156
@spec escape(String.t, emit :: boolean) :: String.t
157157
def escape(string, emit // terminal?) do
158-
do_escape(string <> "%{reset}", false, emit,[])
158+
{rendered, emitted} = do_escape(string, false, emit, false, [])
159+
if emitted and emit do
160+
rendered <> reset
161+
else
162+
rendered
163+
end
159164
end
160165

161166
@doc %B"""
@@ -177,33 +182,34 @@ defmodule IO.ANSI do
177182
"""
178183
@spec escape_fragment(String.t, emit :: boolean) :: String.t
179184
def escape_fragment(string, emit // terminal?) do
180-
do_escape(string, false, emit, [])
185+
{rendered, _emitted} = do_escape(string, false, emit, false, [])
186+
rendered
181187
end
182188

183-
defp do_escape(<< ?%, ?{, rest :: binary >>, false, emit, acc) do
189+
defp do_escape(<< ?%, ?{, rest :: binary >>, false, emit, _emitted, acc) do
184190
do_escape_sequence(rest, emit, acc)
185191
end
186-
defp do_escape(<< ?,, rest :: binary >>, true, emit, acc) do
192+
defp do_escape(<< ?,, rest :: binary >>, true, emit, _emitted, acc) do
187193
do_escape_sequence(rest, emit, acc)
188194
end
189-
defp do_escape(<< ?\s, rest :: binary >>, true, emit, acc) do
190-
do_escape(rest, true, emit, acc)
195+
defp do_escape(<< ?\s, rest :: binary >>, true, emit, emitted, acc) do
196+
do_escape(rest, true, emit, emitted, acc)
191197
end
192-
defp do_escape(<< ?}, rest :: binary >>, true, emit, acc) do
193-
do_escape(rest, false, emit, acc)
198+
defp do_escape(<< ?}, rest :: binary >>, true, emit, emitted, acc) do
199+
do_escape(rest, false, emit, emitted, acc)
194200
end
195-
defp do_escape(<< x :: [binary, size(1)], rest :: binary>>, false, emit, acc) do
196-
do_escape(rest, false, emit, [x|acc])
201+
defp do_escape(<< x :: [binary, size(1)], rest :: binary>>, false, emit, emitted, acc) do
202+
do_escape(rest, false, emit, emitted, [x|acc])
197203
end
198-
defp do_escape("", false, _emit, acc) do
199-
list_to_binary(Enum.reverse(acc))
204+
defp do_escape("", false, _emit, emitted, acc) do
205+
{list_to_binary(Enum.reverse(acc)), emitted}
200206
end
201207

202208
defp do_escape_sequence(rest, emit, acc) do
203209
{code, rest} = escape_sequence(rest)
204210
if emit do
205211
acc = [code|acc]
206212
end
207-
do_escape(rest, true, emit, acc)
213+
do_escape(rest, true, emit, true, acc)
208214
end
209215
end

lib/elixir/test/elixir/io/ansi_test.exs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ defmodule IO.ANSITest do
2626
end
2727

2828
test :fragment do
29-
assert IO.ANSI.escape("") == "#{IO.ANSI.reset}"
29+
assert IO.ANSI.escape("%{red}") == "#{IO.ANSI.red}#{IO.ANSI.reset}"
3030
assert IO.ANSI.escape_fragment("") == ""
3131
end
32+
33+
test :noop do
34+
assert IO.ANSI.escape("") == ""
35+
end
3236
end

0 commit comments

Comments
 (0)