Console colorido usando Node.js

Para quem esta acostumado trabalhar com make para subir um ambiente ou o pessoal que gosta de escrever alguns shell scripts para automação de simples rotinas acho muito importante colocar cor nos retornos do script, isso é ótimo para sinalizar o que realmente o software (ou script) esta fazendo.

Para deixar um retorno colorido usando Node.js não é muito diferente de shell script, pois o que vai processar o retorno é um console bash (zsh ou qual quer outro shell), veja o exemplo abaixo de como deixar um retorno de shell script colorido:

echo -e " \033[0;30m Preto  \033[0m             --> 0;30 "
echo -e " \033[0;31m Vermelho  \033[0m          --> 0;31 "
echo -e " \033[0;32m Verde  \033[0m             --> 0;32 "
echo -e " \033[0;33m Marrom  \033[0m            --> 0;33 "
echo -e " \033[0;34m Azul  \033[0m              --> 0;34 "
echo -e " \033[0;35m Purple  \033[0m            --> 0;35 "
echo -e " \033[0;36m Cyan  \033[0m              --> 0;36 "
echo -e " \033[0;37m Cinza Claro  \033[0m       --> 0;37 "
echo -e " \033[1;30m Preto Acinzentado \033[0m  --> 1;30 "
echo -e " \033[1;31m Vermelho Claro  \033[0m    --> 1;31 "
echo -e " \033[1;32m Verde Claro  \033[0m       --> 1;32 "
echo -e " \033[1;33m Amarelo \033[0m            --> 1;33 "
echo -e " \033[1;34m Azul  Claro \033[0m        --> 1;34 "
echo -e " \033[1;35m Purple Claro  \033[0m      --> 1;35 "
echo -e " \033[1;36m Cyan  Claro \033[0m        --> 1;36 "
echo -e " \033[1;37m Branco  \033[0m            --> 1;37 "

echo -e " \033[40;1;37m Fundo Preto    \033[0m     --> 40;?;? "
echo -e " \033[41;1;37m Fundo Vermelho \033[0m     --> 41;?;? "
echo -e " \033[42;1;37m Fundo Verde    \033[0m     --> 42;?;? "
echo -e " \033[43;1;37m Fundo Marrom   \033[0m     --> 43;?;? "
echo -e " \033[44;1;37m Fundo Azul     \033[0m     --> 44;?;? "
echo -e " \033[45;1;37m Fundo Purple   \033[0m     --> 45;?;? "
echo -e " \033[46;1;37m Fundo Cyan     \033[0m     --> 46;?;? "
echo -e " \033[47;1;37m Fundo Cinza    \033[0m     --> 47;?;? "

echo -e " \033[4;30m Sublinhado  \033[0m        --> 4;? "
echo -e " \033[5;30m Piscando    \033[0m        --> 5;? "
echo -e " \033[7;30m Invertido   \033[0m        --> 7;? "
echo -e " \033[8;30m Concealed   \033[0m        --> 8;? "

image0

Bom como comentei acima em Node.js não é muito diferente, seja exemplo abaixo:

'use strict';
//// http://avelino.us/2012/07/27/console-colorido-usando-node-js
////

// Retorna o texto em vermelho
console.log("\033[31m Aqui esta o texto em vermelho.")

// Retorna o texto em azul
console.log("\033[34m Aqui esta o texto em azul.")

// Volta o padrão do bash
console.log("\033[0m Aqui estamos dando reset nas cores do bash.")


// Criando variavel para deixar um pouco mais simples
var red, blue, reset;
red   = '\u001b[31m';
blue  = '\u001b[34m';
reset = '\u001b[0m';

console.log(red +"Aqui esta o texto em vermelho. "+ blue +"Aqui esta o texto em vermelho. "+ reset +"Aqui estamos dando reset nas cores do bash.")

image1

Perceba que no começo do script estamos usando o "``'use strict';``", para não termos problema com o formato loco de color dentro das strings. No exemplo que estamos usando variáveis coloquei as colors em Unicode (eis ai uma problema!).

Porque uso "\u" nos códigos unicode?

Bom realmente eu não entendi muito bem o porque o Node.js trata dessa forma, mas achei uma essa explicação:

Octal literals can be identified by a numeric value starting with

System Message: WARNING/2 (<string>, line 97)

Line block ends without a blank line.

a leading 0 (zero). Since this is a source of a possible unintentional octal values when the programmer zero-pads decimal numbers of varying lengths in the source code to make then look prettier and more uniform. The strict mode disallows the octal mode due to this reason. | The ESCape code can be represented in a number of ways. Decimal 27 , Hexadecimal 1B , Octal 33 or Binary 00011011. | So instead of write the ESC code in a string as \033 you can as well just choose one of the other modes. Hexadecimal for instance: \x1B. | In your example you used the two-byte unicode representation of the character \u001b which works just as well. | I’m still an oldschool C head and usually assumes all strings to be plain ASCII so I’d use \x1B by default instead of this newfangled unicode crap Java is using. ^_^

Realmente não é muito produtivo desenvolver dessa forma, mas temos algumas iniciativas open source que pode nos ajudar com o retorno de cores dentro do Node.js.

Todos os projetos acima estão dentro do npm.