Esa herramienta web usa, internamente, el comando FIGlet, que lo puedes encontrar o instalar en tu Linux. Yo sí que lo tengo instalado, para generar alguna banderola, de vez en cuando.
Es más, existe
Text::FIGlet, con lo que puedes usar FIGlet desde tu programa, sin depender de servicios externos.
Using perl Syntax Highlighting
use Text::FIGlet;
my $font = Text::FIGlet->new(-f=>"doh");
print $font->figify(-A=>"Test");
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El problema está en lo siguiente: FIGlet genera la banderola simplificando los caracteres que sean comunes entre letras, para reducir el ancho total del texto. Por ejemplo, en el siguiente texto observad que las letras comparten las barras diagonales inversas que tienen a los lados:
Using text Syntax Highlighting
________ ________ ________ ________ _______ ________
|\ __ \|\ __ \|\ ____\|\ ___ \|\ ___ \ |\ _____\
\ \ \|\ \ \ \|\ /\ \ \___|\ \ \_|\ \ \ __/|\ \ \__/
\ \ __ \ \ __ \ \ \ \ \ \ \\ \ \ \_|/_\ \ __\
\ \ \ \ \ \ \|\ \ \ \____\ \ \_\\ \ \ \_|\ \ \ \_|
\ \__\ \__\ \_______\ \_______\ \_______\ \_______\ \__\
\|__|\|__|\|_______|\|_______|\|_______|\|_______|\|__|
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Entonces, deducimos que es complicado saber dónde empieza y dónde acaba cada letra, en ese texto. En el ejemplo que nos has puesto sí que se sabe, porque son caracteres ':' rodeados por la misma letra que representan. Pero es debido a la forma de esas letras de esa fuente en particular. Con otras fuentes, las letras se mezclan, como hemos visto.
Una solución sería... pedir la generación de cada letra por separado. De esa manera podemos colorearla con las secuencias de escape que queramos. Pero...
Fijaros en el ejemplo que os he puesto. Observad que la letra 'B' se "mete" por encima de la letra 'A'. Es decir: como todas las letras tienen la misma inclinación, FIGlet las acerca lo máximo posible. Si tuviéramos letras por separado, tendríamos este problema:
Using text Syntax Highlighting
________ ________
|\ __ \ |\ __ \
\ \ \|\ \ \ \ \|\ /\
\ \ __ \ \ \ __ \
\ \ \ \ \ \ \ \|\ \
\ \__\ \__\ \ \_______\
\|__|\|__| \|_______|
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
en lugar de
Using text Syntax Highlighting
________ ________
|\ __ \|\ __ \
\ \ \|\ \ \ \|\ /\
\ \ __ \ \ __ \
\ \ \ \ \ \ \|\ \
\ \__\ \__\ \_______\
\|__|\|__|\|_______|
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
tendrías que ver el algoritmo que usa FIGlet para "simplificar" ese espacio en blanco extra, y eliminarlos manualmente (quizás por medio de alguna expresión regular, pero puede ser muy complicado). Todo ese trabajo es lo que hace Text::FIGlet.
La solución que te comenta chanio (Bienvenido a los foros de Perl en Español, chanio) es justo la solución que tienes en el módulo
Text::Banner. Ese módulo genera banderolas al estilo del comando Unix 'banner'. Eso quiere decir que los caracteres son muy sencillos (no hay distintas fuentes de letras), pero al menos podemos elegir el "relleno" de las letras.
Ahora bien. Supongamos que tenemos una fuente de letras como la que muestras, la 'Doh'. Esa fuente sí que permite hacer algo muy curioso: es muy fácil saber, línea por línea, dónde empieza y termina cada letra. Bastaría usar una expresión regular para poner los colores. Tal cual. Bueno... no tal cual. Habría que disponer las letras en un modo distinto del de sobrescribir.
Aquí te pongo un programa de ejemplo, y el resultado que sale.
Using perl Syntax Highlighting
#!/usr/bin/env perl
#
# Coloreado de banderolas FIGlet con fuente de letras Doh
#
use v5.18;
use Text::FIGlet;
use Term::ANSIColor;
## Generación del texto
#
## Disposición de las letras
#my $disposicion = -3; # Monoespaciado
#my $disposicion = -1; # Concatenado
my $disposicion = 0; # Juntado
#my $disposicion = undef; # Solapado
my $font = Text::FIGlet->new(
-f => 'doh', # nombre de la fuente
-d => '/usr/share/figlet', # directorio donde están las fuentes de letras
-m => $disposicion, # disposición
);
my $texto = 'Test';
my $ancho = 120;
# La línea siguiente es importante.
# Si queremos el resultado en un solo escalar, ponemos una variable escalar.
# Si queremos el resultado por líneas, ponemos un array.
#
my $txt = $font->figify(
-A => $texto,
-w => $ancho,
);
#say $txt;
## Coloreado
#
## Mapa de colores
my %mapa_colores = (
T => 'magenta',
e => 'yellow',
s => 'bright_blue',
t => 'black on_green',
);
# Aquí, la magia:
# Recorremos globalmente el texto (/g).
# Capturamos en $1 cualquier texto que coincida con el patrón <letra>:::::<letra>.
# En $2 estará esa <letra>.
# Por cada patrón encontrado, lo embuimos entre llamadas color(), que generan secuencias
# de escape para colorear. Como es un trozo de código ejecutable, así lo indicamos (/e).
$txt =~ s/((\w)(?:\2|:)+\2)/color($mapa_colores{$2}) . $1 . color('reset')/ge;
say $txt; # ya podemos verlo
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
La salida es:
Y, sí: el coloreado se hace en una sola línea de Perl. Pero es posible por las características de las propias letras.