• Publicidad

Banderola con letras en colores

Juegos, desafíos, bibliotecas de programación, juegos comerciales, tus propios proyectos...

Banderola con letras en colores

Notapor jimr1984 » 2017-07-26 10:00 @458

Hola, buenos días.

Por favor, tengo una duda y me gustaría saber cómo resolverla.

Tengo un script, y necesito ponerle una banderola ("banner"). Utilizando esta herramienta en línea
creo el nombre en ASCII: http://www.patorjk.com/software/taag/#p=display&f=Doh&t=Test

La idea es que cuando ejecute mi script Perl miejemplo.pl se muestre la banderola:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
TTTTTTTTTTTTTTTTTTTTTTT                                          tttt          
T:::::::::::::::::::::T                                       ttt:::t          
T:::::::::::::::::::::T                                       t:::::t          
T:::::TT:::::::TT:::::T                                       t:::::t          
TTTTTT  T:::::T  TTTTTTeeeeeeeeeeee        ssssssssss   ttttttt:::::ttttttt    
        T:::::T      ee::::::::::::ee    ss::::::::::s  t:::::::::::::::::t    
        T:::::T     e::::::eeeee:::::eess:::::::::::::s t:::::::::::::::::t    
        T:::::T    e::::::e     e:::::es::::::ssss:::::stttttt:::::::tttttt    
        T:::::T    e:::::::eeeee::::::e s:::::s  ssssss       t:::::t          
        T:::::T    e:::::::::::::::::e    s::::::s            t:::::t          
        T:::::T    e::::::eeeeeeeeeee        s::::::s         t:::::t          
        T:::::T    e:::::::e           ssssss   s:::::s       t:::::t    tttttt
      TT:::::::TT  e::::::::e          s:::::ssss::::::s      t::::::tttt:::::t
      T:::::::::T   e::::::::eeeeeeee  s::::::::::::::s       tt::::::::::::::t
      T:::::::::T    ee:::::::::::::e   s:::::::::::ss          tt:::::::::::tt
      TTTTTTTTTTT      eeeeeeeeeeeeee    sssssssssss              ttttttttttt  
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

pero CADA LETRA en un color diferente. Estuve intentándolo, pero NO logro hacer esto, que se mantenga en una sola línea.

Si alguien, por favor, puede darme una mano.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 108
Registrado: 2012-11-25 07:11 @341

Publicidad

Re: Banner Letras en Colores

Notapor chanio » 2017-07-26 12:56 @581

Entendiendo que necesitas imprimirlo en una consola Linux y no en HTML o RTF o en consola de Windows (que no suele normalmente mostrar colores alternativos).
  1. Tienes que armarte un diccionario con cada carácter alfanumérico convertido en igual cantidad de filas y columnas en ASCII (lo mismo que hace el programa web, pero en formato de texto monoespaciado, igual cantidad de columnas para cada carácter). Lo bueno, es que ya no necesitarás ir a ninguna web para hacer tus ASCII. Para hacer tus caracteres, tienes que copiar pacientemente todos los que entrega la web... (ver más abajo el diccionario para cada carácter ASCII).
  2. Luego armar una matriz de líneas a imprimir (por ej. @imprimir) en tu programa.
  3. Luego, usando REGEX ir agregando en cada línea (elemento de la matriz @imprimir) la línea ASCII del carácter que quieres mostrar hallada en el diccionario.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %dicionario = (
  2. "A" => [
  3.  *******
  4.  *     *
  5.  *******
  6.  *     *
  7.  *     *
  8.  *     *
  9.  
  10. ],
  11. "B" => [ #... etc.
  12. ## REGEX...
  13. foreach my $letra ( $texto =~/(\S)/g )
  14. {
  15.   foreach my $linea (0...5)
  16.   {  ## ACÁ PONDRÍAS EL COLOR NUEVO
  17.      $imprimir[$linea] .= $diccionario{$letra}[$linea];
  18.      ## ACÁ PONDRÍAS EL FINAL DEL COLOR NUEVO
  19.   }
  20. }
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4

Una vez que compruebas que esto funciona igual que como quieres.

Ya tendrías hecho tu propio conversor de textos a ASCII.

Para agregarle color, solo tienes que adaptar el siguiente código, que le da color de consola Linux aleatoriamente a cada carácter de un texto.

Lo que tienes que adaptar es agregar a cada línea ASCII del carácter que estás convirtiendo en ASCII el mismo código de escape (así se llaman los que le dan color a la consola Linux) antes de agregar los caracteres ASCII. Y lo mismo, pero con los caracteres de escape reset (vuelven al color normal), al terminar de agregar cada línea ASCII (ver los comentarios en el ejemplo).

Este es el código que primero necesitas entender (probando) cómo funciona. Luego, separar cada color en una matriz del mismo largo que la cantidad de caracteres de tu texto. Y finalmente, agregarlos antes de insertar cada línea ASCII. Notar que el carácter de escape de reset, siempre es el mismo (\033[0m}).
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. binmode(STDOUT,":utf8");## IMPRIMIR CARACTERES LATINOS
  2. my $i;die ("MAL: No tenemos Internet!") unless (pingHo());
  3. foreach (split(/\n/,<<MSG)){ $i=$.; s//\e[3@{[$i++%7+1]};1m/g;print "$_\033[0m\n"}## (abajo ) ESCRIBIR EL MENSAJE A MOSTRAR...
  4.    +---------------------------------------------+
  5.    |  Y A   E S T A M O S   C O N E C T A D O S  |
  6.    +---------------------------------------------+
  7. MSG
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4

Estas líneas, las puedes usar para emitir mensajes de consola muy coloridos. Siempre vuelve a repetirse la misma secuencia de colores. Por eso, repito lo mismo con cada línea.
chanio
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2017-07-26 12:01 @542

Re: Banderola con letras en colores

Notapor jimr1984 » 2017-07-26 15:47 @699

Gracias por la respuestas, intentaré realizarlo.

De todas maneras aclaro que estoy utilizando la consola de MS-DOS en Windows.

Si alguien tiene otra solución, por favor.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 108
Registrado: 2012-11-25 07:11 @341

Re: Banderola con letras en colores

Notapor explorer » 2017-07-26 17:07 @755

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.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Text::FIGlet;
  2. my $font = Text::FIGlet->new(-f=>"doh");
  3. print $font->figify(-A=>"Test");
Coloreado en 0.005 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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 ________  ________  ________  ________  _______   ________
|\   __  \|\   __  \|\   ____\|\   ___ \|\  ___ \ |\  _____\
\ \  \|\  \ \  \|\ /\ \  \___|\ \  \_|\ \ \   __/|\ \  \__/
 \ \   __  \ \   __  \ \  \    \ \  \ \\ \ \  \_|/_\ \   __\
  \ \  \ \  \ \  \|\  \ \  \____\ \  \_\\ \ \  \_|\ \ \  \_|
   \ \__\ \__\ \_______\ \_______\ \_______\ \_______\ \__\
    \|__|\|__|\|_______|\|_______|\|_______|\|_______|\|__|
Coloreado en 0.001 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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 ________      ________
|\   __  \    |\   __  \
\ \  \|\  \   \ \  \|\ /\
 \ \   __  \   \ \   __  \
  \ \  \ \  \   \ \  \|\  \
   \ \__\ \__\   \ \_______\
    \|__|\|__|    \|_______|
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
en lugar de
Sintáxis: [ Descargar ] [ Ocultar ]
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.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #
  3. # Coloreado de banderolas FIGlet con fuente de letras Doh
  4. #
  5. use v5.18;
  6. use Text::FIGlet;
  7. use Term::ANSIColor;
  8.  
  9. ## Generación del texto
  10. #
  11.  
  12. ## Disposición de las letras
  13. #my $disposicion = -3;          # Monoespaciado
  14. #my $disposicion = -1;          # Concatenado
  15. my $disposicion =  0;           # Juntado
  16. #my $disposicion = undef;       # Solapado
  17.  
  18.  
  19. my $font = Text::FIGlet->new(
  20.     -f => 'doh',                # nombre de la fuente
  21.     -d => '/usr/share/figlet',  # directorio donde están las fuentes de letras
  22.     -m => $disposicion,         # disposición
  23. );
  24.  
  25. my $texto = 'Test';
  26. my $ancho = 120;
  27.  
  28.  
  29. # La línea siguiente es importante.
  30. #  Si queremos el resultado en un solo escalar, ponemos una variable escalar.
  31. #  Si queremos el resultado por líneas, ponemos un array.
  32. #
  33. my $txt = $font->figify(
  34.     -A => $texto,
  35.     -w => $ancho,
  36. );
  37.  
  38. #say $txt;
  39.  
  40. ## Coloreado
  41. #
  42. ## Mapa de colores
  43. my %mapa_colores = (
  44.     T => 'magenta',
  45.     e => 'yellow',
  46.     s => 'bright_blue',
  47.     t => 'black on_green',
  48. );
  49.  
  50. # Aquí, la magia:
  51. # Recorremos globalmente el texto (/g).
  52. # Capturamos en $1 cualquier texto que coincida con el patrón <letra>:::::<letra>.
  53. # En $2 estará esa <letra>.
  54. # Por cada patrón encontrado, lo embuimos entre llamadas color(), que generan secuencias
  55. # de escape para colorear. Como es un trozo de código ejecutable, así lo indicamos (/e).
  56. $txt =~ s/((\w)(?:\2|:)+\2)/color($mapa_colores{$2}) . $1 . color('reset')/ge;
  57.  
  58. say $txt;       # ya podemos verlo
Coloreado en 0.011 segundos, usando GeSHi 1.0.8.4
La salida es:
Imagen
Y, sí: el coloreado se hace en una sola línea de Perl. Pero es posible por las características de las propias letras.
JF^D Perl Programming
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14035
Registrado: 2005-07-24 18:12 @800
Ubicación: Madrid, España

Re: Banderola con letras en colores

Notapor explorer » 2017-07-26 17:26 @768

jimr1984 escribiste:Gracias por la respuestas, intentaré realizarlo.

De todas maneras aclaro que estoy utilizando la consola de MS-DOS en Windows.

Si alguien tiene otra solución, por favor.

Además de mi respuesta anterior, deberás usar

use Win32::Console::ANSI;

para que la consola de Windows tenga colores.
JF^D Perl Programming
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14035
Registrado: 2005-07-24 18:12 @800
Ubicación: Madrid, España

Re: Banderola con letras en colores

Notapor jimr1984 » 2017-07-26 17:46 @782

Estoy algo limitado con respecto a la versión.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
C:\Perl5.16\bin\>perl -v

This is perl 5, version 16, subversion 1 (v5.16.1) built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2012, Larry Wall

Binary build 1601 [296175] provided by ActiveState http://www.ActiveState.com
Built Aug 30 2012 20:08:55

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es la que estoy utilizando, por algunas cuestiones no me es posible actualizar o cambiar de versión.

¿Existe alguna manera de algo más sencillo, pues tenía en mente que quizás podría colorear letra por letra y luego concatenar e imprimir.

Es decir, puede ser este tipo de letra también, no hay problema.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print color('red'), '
  2. #####
  3.  #  
  4.  #  
  5.  #  
  6.  # ';  
  7.  
  8. print color('yellow'), '
  9. #####
  10. #    
  11. ####  
  12. #    
  13. #####';  
  14.  
  15. print color('green'), '
  16. ####
  17. #    
  18. #    
  19. #    
  20. ####';  
  21.  
  22. print color('blue'), '
  23. #####
  24.  #  
  25.  #  
  26.  #  
  27.  # ';  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4

Luego imprimir todo en una sola línea. Algo así estaba pensando que quizás sería la manera.
En esta ocasión NO necesito tener TextFLig para crear mis propias banderolas, letras, etc.

Quizás pueda salvar el tema de la versión de Perl que utilizo realizando de alguna otra manera.

Gracias, saludos.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 108
Registrado: 2012-11-25 07:11 @341

Re: Banderola con letras en colores

Notapor explorer » 2017-07-31 18:00 @792

Perl v5.16 es del año 2012. :)

Text::FIGlet no tiene ningún problema para funcionar bajo v5.16, así que lo único que tienes que hacer es cambiar el

use v5.18;

por

use v5.16;

La ventaja de Text::FIGlet es que... no necesitas tener instalado figlet en tu sistema operativo (algo habitual, en Windows).

La solución que propones es la misma que comenta chanio, un poco más arriba. Repasa su mensaje, porque ahí están las claves para realizarlo.

Una forma de abreviar el problema es decir: si todas las letras tienen el mismo ancho, entonces es fácil hacer los cálculos para colocar cada letra en la matriz. O... podemos generar directamente las líneas del texto resultado, sin necesidad de crear ninguna matriz.

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %letras = (
  2.         'A' => '.......',
  3.         'B' => '.......',
  4.         ...;                            # definimos cada letra como una cadena de texto que contiene ancho×alto caracteres
  5. );
  6.  
  7. my @texto = split //, $texto;                           # separamos cada letra del $texto
  8.  
  9. for my $j ( 0 .. $alto_de_letras - 1 ) {                # para todas las líneas de alto de las letras
  10.  
  11.     for my $i ( 0 .. $#texto ) {                        # para todas las letras del texto
  12.  
  13.         # aquí seleccionamos el color de la letra i-ésima
  14.         ...;
  15.         print color(...);
  16.  
  17.         # pintamos el segmento $j-ésimo de la $letra $i-ésima del @texto
  18.         print substr $letra{ $texto[$i] }, $j * $ancho_de_letras, $ancho_de_letras;
  19.  
  20.         print color('reset');
  21.     }
  22.  
  23.     print "\n";                                         # fin de línea
  24. }
  25.  
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4
JF^D Perl Programming
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14035
Registrado: 2005-07-24 18:12 @800
Ubicación: Madrid, España


Volver a Juegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados