#!/usr/bin/env perl ########################## # Scott Baker # 2017-06-29 ########################## use strict; use warnings; use Data::Dump::Color; use Test::More; ############################################################################### ############################################################################### ok(color("reset") eq "\e[0m", "Reset"); ok(color("bold") eq "\e[1m", "Bold"); ok(color("blink") eq "\e[5m", "Blink"); ok(color("italic") eq "\e[3m", "Italic"); ok(color("underline") eq "\e[4m", "Underline"); ok(color("inverse") eq "\e[7m", "Inverse"); ok(color("red") eq "\e[38;5;160m", "Color: Red"); ok(color("blue") eq "\e[38;5;27m", "Color: Blue"); ok(color("green") eq "\e[38;5;34m", "Color: Green"); ok(color("yellow") eq "\e[38;5;226m", "Color: Yellow"); ok(color("orange") eq "\e[38;5;214m", "Color: Orange"); ok(color("purple") eq "\e[38;5;93m", "Color: Purple"); ok(color("white") eq "\e[38;5;15m", "Color: White"); ok(color("black") eq "\e[38;5;0m", "Color: Black"); ok(color("red_bold") eq "\e[1m\e[38;5;160m", "Color: Bold Red"); ok(color("213_italic") eq "\e[3m\e[38;5;213m", "Color: 213 Italic"); ok(color("red_on_blue") eq "\e[38;5;160m\e[48;5;27m", "Color: Red on Blue"); ok(color("165_blink") eq "\e[5m\e[38;5;165m", "Color: 165 Blink"); ok(color("on_white") eq "\e[48;5;15m", "Color: On White"); done_testing(); print "\n"; my @colors = qw(red blue green yellow orange purple white black); for (my $i = 0; $i < 7; $i++) { foreach my $color (sort @colors) { my $ansi = color($color); print color("bold") . $ansi . "XXXXXXXXXXXXXXX"; } print color() . "\n"; } print color("bold") . color("yellow") . " Scott Baker " . color() . "\n"; print color("83_bold") . " Scott Baker " . color() . "\n"; print color("blink") . color("198") . " Blink Baker " . color() . "\n"; print color("underline") . color("57") . " Underline Baker " . color() . "\n"; print color("italic") . color("26") . " Italic Baker " . color() . "\n"; print color("inverse") . color("26") . " Invert Baker " . color() . "\n"; print color("213_italic") . " Scott pink italic" . color() . "\n"; print color("green_bold") . " Green Baker " . color() . "\n"; print color("black_bold") . color("inverse") . " Inverse Baker " . color() . "\n"; print color("bold") . color("yellow_on_blue") . " SUPERMAN " . color() . "\n"; print color("bold") . color("red_blink") . " RED BLINK " . color() . "\n"; ############################################################################### ############################################################################### # String format: '115', '165_bold', '10_on_140', 'reset', 'on_173', 'red', 'white_on_blue' sub color { my ($str, $txt) = @_; # If we're NOT connected to a an interactive terminal don't do color if (-t STDOUT == 0) { return ''; } # No string sent in, so we just reset if (!length($str) || $str eq 'reset') { return "\e[0m"; } # Some predefined colors my %color_map = qw(red 160 blue 27 green 34 yellow 226 orange 214 purple 93 white 15 black 0); $str =~ s|([A-Za-z]+)|$color_map{$1} // $1|eg; # Get foreground/background and any commands my ($fc,$cmd) = $str =~ /^(\d{1,3})?_?(\w+)?$/g; my ($bc) = $str =~ /on_(\d{1,3})$/g; # Some predefined commands my %cmd_map = qw(bold 1 italic 3 underline 4 blink 5 inverse 7); my $cmd_num = $cmd_map{$cmd // 0}; my $ret = ''; if ($cmd_num) { $ret .= "\e[${cmd_num}m"; } if (defined($fc)) { $ret .= "\e[38;5;${fc}m"; } if (defined($bc)) { $ret .= "\e[48;5;${bc}m"; } if ($txt) { $ret .= $txt . "\e[0m"; } return $ret; }