Dez
31
Colorindo a saída do console em Ruby
Dezembro 31, 2007 |
É 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:
RUBY:
-
# 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á:
Você poderá criar alguns helpers que facilitarão os trabalhos futuros, como exemplo:
RUBY:
-
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:
RUBY:
-
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:
A tabela acima pode ser obtida através do script:
RUBY:
-
#!/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
Comentários
2 Comments so far



(2 votes, average: 4 out of 5)


Colorindo a saída do console em Ruby
Entenda como funciona a seqüência escape ANSI e como utilizá-la para colorir a saída do console, utilizando toda a facilidade de Ruby.
Colorindo a saída do console em Ruby
Entenda como funciona a seqüência escape ANSI e como utilizá-la para colorir a saída do console, utilizando toda a facilidade de Ruby.