Pergunta

Esta é uma pergunta semelhante a Este. Eu gostaria de converter sequências de escape da ANSI, especialmente para cores, em HTML. No entanto, gostaria de fazer isso usando PHP. Existem bibliotecas ou código de exemplo por aí que fazem isso? Caso contrário, algo que pode me levar em parte a uma solução personalizada?

Foi útil?

Solução

Eu não conheço nenhuma biblioteca desse tipo no PHP. Mas se você tiver uma entrada consistente com cores limitadas, pode realizá -lo usando um simples str_replace():

$dictionary = array(
    'ESC[01;34' => '<span style="color:blue">',
    'ESC[01;31' => '<span style="color:red">',
    'ESC[00m'   => '</span>' ,
);
$htmlString = str_replace(array_keys($dictionary), $dictionary, $shellString);

Outras dicas

A solução STR_Place não funcionaria nos casos em que as cores são "aninhadas", porque nos códigos de cores ANSI, um ESC [0M RESET é tudo o que é necessário para redefinir todos os atributos. Enquanto estiver no HTML, você precisa do número exato de tags de fechamento de extensão.

Uma solução alternativa que funciona o caso de uso "aninhado" está abaixo:

  // Ugly hack to process the color codes
  // We need something like Perl's HTML::FromANSI
  // http://search.cpan.org/perldoc?HTML%3A%3AFromANSI
  // but for PHP
  // http://ansilove.sourceforge.net/ only converts to image :(
  // Technique below is from:
  // http://stackoverflow.com/questions/1375683/converting-ansi-escape-sequences-to-html-using-php/2233231
  $output = preg_replace("/\x1B\[31;40m(.*?)(\x1B\[0m)/", '<span style="color: red">$1</span>$2', $output);
  $output = preg_replace("/\x1B\[1m(.*?)(\x1B\[0m)/", '<b>$1</b>$2', $output);
  $output = preg_replace("/\x1B\[0m/", '', $output);

(tirado da minha edição de terminal drush aqui: http://drupal.org/node/709742 )

Também estou procurando a biblioteca PHP para fazer isso facilmente.

PS se você deseja converter sequências de escape Ansi em PNG/imagem, você pode usar Ansilove.

Existem bibliotecas agora: ANSI-TO-HTML

E muito fácil de usar:

$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top