Skip to content

Commit 7e856e1

Browse files
committed
Don't process ANSI escapes in strings in IEx
1 parent 893e333 commit 7e856e1

File tree

3 files changed

+11
-28
lines changed

3 files changed

+11
-28
lines changed

lib/iex/lib/iex.ex

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -244,26 +244,13 @@ defmodule IEx do
244244
end
245245
246246
@doc """
247-
Returns `string` escaped using the specified color.
247+
Returns `string` escaped using the specified color. ANSI escapes in `string`
248+
are not processed in any way.
248249
"""
249250
def color(color_name, string) do
250251
colors = IEx.Options.get(:colors)
251-
IO.ANSI.escape "%{#{colors[color_name]}}#{string}", colors[:enabled]
252-
end
253-
254-
@doc """
255-
Returns an escaped fragment using the specified color.
256-
"""
257-
def color_fragment(color_name) do
258-
colors = IEx.Options.get(:colors)
259-
IO.ANSI.escape_fragment "%{#{colors[color_name]}}", colors[:enabled]
260-
end
261-
262-
@doc """
263-
Returns an escaped fragment that resets colors and attributes.
264-
"""
265-
def color_reset() do
266-
colors = IEx.Options.get(:colors)
267-
IO.ANSI.escape_fragment "%{reset}", colors[:enabled]
252+
enabled = colors[:enabled]
253+
IO.ANSI.escape_fragment("%{#{colors[color_name]}}", enabled)
254+
<> string <> IO.ANSI.escape_fragment("%{reset}", enabled)
268255
end
269256
end

lib/iex/lib/iex/introspection.ex

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ defmodule IEx.Introspection do
99
{ :module, _ } ->
1010
case module.__info__(:moduledoc) do
1111
{ _, binary } when is_binary(binary) ->
12-
IO.puts IEx.color(:info, "# #{inspect module}\n")
13-
# We use fragments here so that escape sequences in `binary` are
14-
# treated literally and don't get converted to ANSI escapes.
15-
IO.write IEx.color_fragment(:info) <> binary <> IEx.color_reset()
12+
# FIXME: add tests for `binary` containing ANSI escapes
13+
IO.write IEx.color(:info, "# #{inspect module}\n" <> binary)
1614
{ _, _ } ->
1715
IO.puts IEx.color(:error, "No docs for #{inspect module} have been found")
1816
_ ->
@@ -150,9 +148,8 @@ defmodule IEx.Introspection do
150148
defp print_doc({ { fun, _ }, _line, kind, args, doc }) do
151149
args = Enum.map_join(args, ", ", print_doc_arg(&1))
152150
IO.puts IEx.color(:info, "* #{kind} #{fun}(#{args})\n")
153-
# We use fragments here so that escape sequences in `doc` are
154-
# treated literally and don't get converted to ANSI escapes.
155-
if doc, do: IO.write IEx.color_fragment(:info) <> doc <> IEx.color_reset()
151+
# FIXME: add tests for `doc` containing ANSI escapes
152+
if doc, do: IO.write IEx.color(:info, doc)
156153
end
157154

158155
defp print_doc_arg({ ://, _, [left, right] }) do

lib/iex/lib/iex/server.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,8 @@ defmodule IEx.Server do
157157
end
158158

159159
defp io_put(result) do
160-
IO.puts IEx.color_fragment(:eval_result) <>
161-
inspect(result, IEx.Options.get(:inspect)) <>
162-
IEx.color_reset()
160+
# FIXME: add tests for `result` containing ANSI escapes
161+
IO.puts IEx.color(:eval_result, inspect(result, IEx.Options.get(:inspect)))
163162
end
164163

165164
defp io_error(result) do

0 commit comments

Comments
 (0)