Submarino.com.br

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