Delphi XE3 - Удалить код / цвет Анси из строки
Я пытаюсь разобраться со строками кода Ansi. Я получаю [32m, [37m, [K
и т. д.
Есть ли более быстрый способ удаления / удаления кодов ANSI из строк, которые я получаю, вместо того, чтобы делать это с помощью цикла с помощью символов, ищущих начальную и конечную точки кодов ANSI?
Я знаю, что объявление выглядит примерно так: #27'['#x';'#y';'#z'm';
где x, y, z... - коды ANSI. Поэтому я предполагаю, что должен искать #27, пока не найду "m;"
Есть ли уже сделанные функции для достижения того, чего я хочу? Мой поиск ничего не дал, кроме этой статьи. Спасибо
1 ответ
Решение
Вы можете очень быстро обработать этот протокол с помощью такого кода (простейший конечный автомат):
var
s: AnsiString;
i: integer;
InColorCode: Boolean;
begin
s := 'test'#27'['#5';'#30';'#47'm colored text';
InColorCode := False;
for i := 1 to Length(s) do
if InColorCode then
case s[i] of
#0: TextAttrib = Normal;
...
#47: TextBG := White;
'm': InColorCode := false;
else;
// I do nothing here for `;`, '[' and other chars.
// treat them if necessary
end;
else
if s[i] = #27 then
InColorCode := True
else
output char with current attributes
Очистка строки из ESC-кодов:
procedure StripEscCode(var s: AnsiString);
const
StartChar: AnsiChar = #27;
EndChar: AnsiChar = 'm';
var
i, cnt: integer;
InEsc: Boolean;
begin
Cnt := 0;
InEsc := False;
for i := 1 to Length(s) do
if InEsc then begin
InEsc := s[i] <> EndChar;
Inc(cnt)
end
else begin
InEsc := s[i] = StartChar;
if InEsc then
Inc(cnt)
else
s[i - cnt] :=s[i];
end;
setLength(s, Length(s) - cnt);
end;