Colorindo a saída do console em Ruby

É muito comum administradores de sistemas escreverem scripts para otimizar execução de processos, visualizar resultados de tarefas, monitorar estados dos serviços, etc, onde são geradas algumas saídas para o console. Muita vezes é importante destacar as saídas, como por exemplo, deixar em vermelho os erros, em verde os sucessos, etc, facilitando a análise dos resultados.

É uma situação que as seqüências escapes ANSI podem ajudar. Suportado nas maioria dos terminais, incluindo VT100 (o BTW, console da família de Windows NT não o suporta, mas existe um contorno que será explicado mais a frente).

Para o começar, vamos examinar a estrutura da seqüência de escape ANSI. A seqüência dever sempre começar com o símbolo ESC (código 27 da tabela ASCII) seguindo pela abertura de um ([) colchete. Há um ou mais número separado por (;) ponto-e-vírgula com uma letra na extremidade.

Não descreverei todos os códigos possíveis, qualquer um pode encontrá-los no Wikipédia ou Google. A seqüência com a letra ‘m’ na extremidade é usada mudar a cor do primeiro plano e a cor do fundo. Em geral é parecido com: ESC [31m, onde o 31 define a cor de primeiro plano (texto) como vermelha.

Segue abaixo uma tabela com códigos suportados na maioria dos terminais:

CódigoEfeito
0desativa todos os atributos
1ativa o modo brilho
4ativa o modo sublinhado
5ativa o modo pisca-pisca
7troca a cor do primeiro plano pela cor de fundo
8oculta o texto (cor do texto igual ao do fundo)
30texto na cor preta
31texto na cor vermelha
32texto na cor verde
33texto na cor amarela
34texto na cor azul
35texto na cor magenta
36texto na cor ciano
37texto na cor branca
39texto na cor padrão
40fundo na cor preta
41fundo na cor vermelha
42fundo na cor verde
43fundo na cor amarela
44fundo na cor azul
45fundo na cor magenta
46fundo na cor ciano
47fundo na cor branca
49fundo na cor padrão

Como você pode observar na tabela, podemos definir a cor do texto e a cor de fundo separadamente ou combiná-las em uma única seqüência, por exemplo: ESC[1;33;44m - amarelo brilhante com fundo azul.

ATENÇÃO: Não esqueça de desativar todos os atributos antes de finalizar, senão todos os textos seguintes serão exibidos com os atributos que você acabou de definir, a não ser que essa seja sua intenção.

Chega de teoria, vamos a parte prática:

Utilizando o IRB vamos executar o seguinte trecho de código

#Imprimindo uma mensagem de sucesso em verde
puts "Importando categorias [ \e[32mOK\e[0m ]"
# Impriminido uma mensagem de falha em vermelho
puts "Importando tags [\e[31mFALHOU\e[0m]"

Como resultado você obterá:

Resultado do terminal usando cores

Você poderá criar alguns helpers que facilitarão os trabalhos futuros, como exemplo:

def colorize(text, color_code)
   "#{color_code}#{text}\e[0m"
end
 
def red(text); colorize(text, "\e[31m"); end
def green(text); colorize(text, "\e[32m"); end
 
# Imprimindo uma mensagem de sucesso em verde
puts "Importando categorias [ #{green('OK')} ]"
# Impriminido uma mensagem de falha em vermelho
puts "Importando tags [#{red('FALHOU')}]"

Recomendo você utilizar desta forma para ser DRY, claro que talvez seja possível melhorar mais ainda, mas este não é objetivo deste post.

Como dito acima, o Windows não suporta seqüências escapes ANSI, mas você pode resolver isso lendo o artigo Command Interpreter Ansi Support, ou com as próprias facilidade do Ruby:

Primeiro instale o win32console:

gem install win32console

Agora adicione o código abaixo no inicio de seu script:

begin
   require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
   raise 'Voce deve instalar o gem win32console para utilizar cores no Windows'
end

Pronto, a saída de seu script será colorida tanto no Windows como no Unix.

Para finalizar, veja a tabela completa com diferentes códigos, a qual você poderá usar em seus scripts:

Tabelas de Cores

A tabela acima pode ser obtida através do script:

#!/usr/bin/ruby
 
[0, 1, 4, 5, 7].each do |attr|
   puts '----------------------------------------------------------------'
   puts "ESC[#{attr};Texto;Fundo"
   30.upto(37) do |fg|
      40.upto(47) do |bg|
         print "\033[#{attr};#{fg};#{bg}m #{fg};#{bg}  "
      end
      puts "\033[0m"
   end
end

Fonte: kpumuk.info



Últimos tweets

    Artigos similares

    3 Comentários para “Colorindo a saída do console em Ruby”

      Deixe uma resposta