in reply to Inserting a little life to my output

The above answers ('bout ANSIColor) are all you need really. Just for the record I would like to submit a short subroutine that I threw together a long time ago. I use it from time to time in my projects.

(Of course Term::ANSIColor isn't that hard to use in it self, but I like to be able to write short colorcodes). Here goes:

Note: The second parameter to colorparse() should be set to a true value if the output is to be used with Term::ReadLine.

use strict; use Term::ANSIColor qw/:constants/; use Carp; print colorparse("%CThis is bright/bold cyan%n and this is normal text +.\n"); print colorparse("%RC%Yo%Bl%Mo%Cr%n rocks!\n"); sub colorparse { my $txt = shift; my $is_prompt = shift || 0; if (not defined $txt) { croak("error: missing parameter\nusage: colorparse(\$txt,\$is_prom +pt)"); } my %transtbl = ( k => RESET . BLACK , K => RESET . BLACK . BOLD , r => RESET . RED , R => RESET . RED . BOLD , g => RESET . GREEN , G => RESET . GREEN . BOLD , y => RESET . YELLOW , Y => RESET . YELLOW . BOLD , b => RESET . BLUE , B => RESET . BLUE . BOLD , m => RESET . MAGENTA , M => RESET . MAGENTA . BOLD , c => RESET . CYAN , C => RESET . CYAN . BOLD , w => RESET . WHITE , W => RESET . WHITE . BOLD , n => RESET ); if ($is_prompt) { $txt =~ s/%([kKrRgGyYbBmMcCwWn])/\001\001$transtbl{$1}\001\002/g; } else { $txt =~ s/%([kKrRgGyYbBmMcCwWn])/$transtbl{$1}/g; } $txt =~ s/%%/%/g; return($txt); }

-- 
dempa

Replies are listed 'Best First'.
Re: Re: Inserting a little life to my output
by hotshot (Prior) on Dec 17, 2002 at 14:49 UTC
    thanks a lot it will sure help. just one thing, can you explain what you did in case $is_prompt is true, and the last line before the return statement?

    Hotshot

      Sure hotshot (if I remember what I did, that is :) ).

      When I made this subroutine and used the output for a colorful prompt (with Term::ReadLine), the color codes (the real ones, from Term::ANSIColor) confused the readline-prompt. In short, it counted the "invisible" color codes as characters and inserted the newline (which should come at the end of the terminal window) too early. To avoid this I inserted some extra control characters around the color codes to avoid it being counted by ReadLine.

      The last line before the return statement is for converting %% to %. That means: Use %% in colorparse() to output a literal %.

      -- 
      dempa

Re: Re: Inserting a little life to my output
by agentv (Friar) on Dec 17, 2002 at 18:45 UTC
    ...thanks! (++) That was a useful demonstration.

    ...All the world looks like -well- all the world, when your hammer is Perl.
    ---v