@@ -154,7 +154,7 @@ defmodule IO.ANSI do
154
154
["Hello, ", "\e[31m", "\e[1m", "world!", "\e[0m"]
155
155
"""
156
156
def format ( chardata , emit \\ terminal? ) do
157
- do_format ( chardata , [ ] , emit , :maybe )
157
+ do_format ( chardata , [ ] , [ ] , emit , :maybe )
158
158
end
159
159
160
160
@ doc ~S"""
@@ -174,39 +174,40 @@ defmodule IO.ANSI do
174
174
["\e[1m", 87, 111, 114, 100]
175
175
"""
176
176
def format_fragment ( chardata , emit \\ terminal? ) do
177
- do_format ( chardata , [ ] , emit , false )
177
+ do_format ( chardata , [ ] , [ ] , emit , false )
178
178
end
179
179
180
- defp do_format ( [ ] , buffer , _emit , append_reset ) do
181
- if append_reset == true do
182
- Enum . reverse ( buffer ) ++ [ IO.ANSI . reset ]
183
- else
184
- Enum . reverse ( buffer )
180
+ defp do_format ( [ term | rest ] , rem , acc , emit , append_reset ) do
181
+ do_format ( term , [ rest | rem ] , acc , emit , append_reset )
182
+ end
183
+
184
+ defp do_format ( term , rem , acc , true , append_reset ) when is_atom ( term ) do
185
+ try do
186
+ do_format ( [ ] , rem , [ acc | [ apply ( IO.ANSI , term , [ ] ) ] ] , true , ! ! append_reset )
187
+ rescue
188
+ _ in UndefinedFunctionError ->
189
+ raise ArgumentError , message: "invalid ANSI sequence specification: #{ term } "
185
190
end
186
191
end
187
192
188
- defp do_format ( chardata , buffer , emit , append_reset ) when not is_list ( chardata ) do
189
- do_format ( [ chardata ] , buffer , emit , append_reset )
193
+ defp do_format ( term , rem , acc , false , append_reset ) when is_atom ( term ) do
194
+ do_format ( [ ] , rem , acc , false , append_reset )
190
195
end
191
196
192
- defp do_format ( chardata , buffer , emit , append_reset ) do
193
- [ elem | rest ] = chardata
194
-
195
- cond do
196
- is_atom ( elem ) and emit ->
197
- try do
198
- do_format ( rest , [ apply ( IO.ANSI , elem , [ ] ) | buffer ] , emit , ! ! append_reset )
199
- rescue
200
- _ in UndefinedFunctionError ->
201
- raise ArgumentError , message: "invalid ANSI sequence specification: #{ elem } "
202
- end
203
- is_atom ( elem ) and not emit ->
204
- do_format ( rest , buffer , emit , append_reset )
205
- is_list ( elem ) ->
206
- do_format ( elem ++ rest , buffer , emit , append_reset )
207
- true ->
208
- do_format ( rest , [ elem | buffer ] , emit , append_reset )
209
- end
197
+ defp do_format ( term , rem , acc , emit , append_reset ) when not is_list ( term ) do
198
+ do_format ( [ ] , rem , [ acc | [ term ] ] , emit , append_reset )
199
+ end
200
+
201
+ defp do_format ( [ ] , [ next | rest ] , acc , emit , append_reset ) do
202
+ do_format ( next , rest , acc , emit , append_reset )
203
+ end
204
+
205
+ defp do_format ( [ ] , [ ] , acc , true , true ) do
206
+ [ acc | IO.ANSI . reset ]
207
+ end
208
+
209
+ defp do_format ( [ ] , [ ] , acc , _emit , _append_reset ) do
210
+ acc
210
211
end
211
212
212
213
@ doc ~S"""
0 commit comments