viernes, 21 de diciembre de 2012

Texto de la terminal en color con Jansi

Jansi
Las aplicaciones de terminal o consola ya no son tan habituales en estos tiempos de interfaces gráficas y aplicaciones web pero de vez en cuando puede que necesitemos desarrollar una ya que para ciertas tareas son mucho más simples y rápidas además de poder automatizarse las tareas con scripts de comandos. Las terminales virtuales actuales que existen en Linux, Windows o Mac soportan varios colores. El uso adecuadamente de colores en una aplicación puede ayudar al usuario a identificar e interpretar mejor la información que está viendo.

En Java hay una librería, Jansi, que permite enviar a la consola los códigos de escape ANSI adecuados para cambiar los colores de las letras, del fondo o ponerlas en «negrita» asi como cambiar la posición del cursor o borrrar una linea entre otras cosas. La API de Jansi está formada por unas pocas clases y se aprende a usarla en unos pocos minutos, la clase principal es Ansi y no necesitaremos mucho más.

Veamos como es en la práctica el uso de Jansi con un ejemplo sencillo mediante un proyecto de ejemplo con Jansi alojado en GitHub:

package es.com.blogspot.elblogdepicodev.jansi;
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;
public class ColorConsola {
public static void main(String[] args) {
AnsiConsole.systemInstall();
AnsiConsole.out.println(Ansi.ansi().bold().fg(Ansi.Color.RED).a("Hello").fg(Ansi.Color.GREEN).a(" World").fg(Ansi.Color.WHITE).a("!"));
AnsiConsole.out.println(Ansi.ansi().reset());
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.RED ).a("EEEEEEE lll bb lll dd iii dd "));
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.GREEN ).a("EE lll bb lll oooo gggggg dd eee pp pp cccc oooo dd eee vv vv"));
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.BLUE ).a("EEEEE lll bbbbbb lll oo oo gg gg dddddd ee e ppp pp iii cc oo oo dddddd ee e vv vv "));
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.CYAN ).a("EE lll bb bb lll oo oo ggggggg dd dd eeeee pppppp iii cc oo oo ... dd dd eeeee vvv "));
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.MAGENTA).a("EEEEEEE lll bbbbbb lll oooo gg dddddd eeeee pp iii ccccc oooo ... dddddd eeeee v "));
AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.YELLOW ).a(" ggggg pp "));
AnsiConsole.out.println(Ansi.ansi().reset());
AnsiConsole.systemUninstall();
}
}
Para construir el proyecto hay que ejecutar en una terminal:

$ ./gradlew dist
view raw build.sh hosted with ❤ by GitHub
En la carpeta build/distributions se habrá generado el archivo ColorConsola.zip que contendrá la librería de Jansi, la clase de ejemplo compilada y los archivos de linea de comandos para ejecutar la aplicación, basta con que descomprimamos el archivo y ejecutemos ColorConsola o ColorConsola.bat dependiendo de si nuestro sistema operativo es Unix compatible o Windows.
Para ejecutarlo:

./build/distributions/Jansi/bin/Jansi
view raw run.sh hosted with ❤ by GitHub
El resultado es este:


Para crear ese arte ASCII puedes consultar la entrada Arte usando texto ASCII con FIGlet.

Referencia:
Código fuente de ejemplo Texto de la terminal en color con Jansi
http://jansi.fusesource.org/
http://stackoverflow.com/questions/5762491/how-to-print-color-in-console-using-system-out-println