@@ -134,6 +134,46 @@ defmodule IO.ANSI do
134
134
raise ArgumentError , "invalid ANSI sequence specification: #{ other } "
135
135
end
136
136
137
+ def format ( chardata , emit \\ terminal? ) do
138
+ do_format ( chardata , [ ] , emit , :maybe )
139
+ end
140
+
141
+ def format_fragment ( chardata , emit \\ terminal? ) do
142
+ do_format ( chardata , [ ] , emit , false )
143
+ end
144
+
145
+ defp do_format ( [ ] , buffer , _emit , append_reset ) do
146
+ if append_reset == true do
147
+ Enum . reverse ( buffer ) ++ IO.ANSI . reset
148
+ else
149
+ Enum . reverse ( buffer )
150
+ end
151
+ end
152
+
153
+ defp do_format ( chardata , buffer , emit , append_reset ) when not is_list ( chardata ) do
154
+ do_format ( [ chardata ] , buffer , emit , append_reset )
155
+ end
156
+
157
+ defp do_format ( chardata , buffer , emit , append_reset ) do
158
+ [ elem | rest ] = chardata
159
+
160
+ cond do
161
+ is_atom ( elem ) and emit ->
162
+ try do
163
+ do_format ( rest , [ apply ( IO.ANSI , elem , [ ] ) | buffer ] , emit , ! ! append_reset )
164
+ rescue
165
+ _ in UndefinedFunctionError ->
166
+ raise ArgumentError , message: "invalid ANSI sequence specification: #{ elem } "
167
+ end
168
+ is_atom ( elem ) and not emit ->
169
+ do_format ( rest , buffer , emit , append_reset )
170
+ is_list ( elem ) ->
171
+ do_format ( elem ++ rest , buffer , emit , append_reset )
172
+ true ->
173
+ do_format ( rest , [ elem | buffer ] , emit , append_reset )
174
+ end
175
+ end
176
+
137
177
@ doc ~S"""
138
178
Escapes a string by converting named ANSI sequences into actual ANSI codes.
139
179
0 commit comments