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;
Другие вопросы по тегам