#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use File::Basename;
use feature "state";
sub say
{print "@_", "\n"}; my %color_map = (
bold => 1,
tint => 2,
itaric => 3,
underline => 4,
blink => 5,
blink_quick => 6,
back_grey => 7,
invisible => 8,
center_bar => 9,
tall => 12,
underline_w => 21,
black => 30,
red => 31,
green => 32,
orange => 33,
blue => 34,
purple => 35,
cyan => 36,
back_black => 40,
back_shade_red => 41,
back_shade_green => 42,
back_orange => 43,
back_tint_blue => 44,
back_tint_purple => 45,
back_shade_cyan => 46,
back_whity => 47,
top_bar => 53,
left_up => 73,
right_down => 74,
dark_grey => 90,
vivid_red => 91,
vivid_green => 92,
vivid_yellow => 93,
vivid_blue => 94,
vivid_magenta => 95,
vivid_water => 96,
back_dark_grey => 100,
back_pink => 101,
back_light_green => 102,
back_light_yellow => 103,
back_light_blue => 104,
back_light_purple => 105,
back_light_cyan => 106,
back_white => 107,
null => 108,
);
sub dye {
my $color_letter_set = shift; "\e[" . $color_letter_set . "m" . $words . "\e[0m";
};
my @color_digits = @color_map{@color_words};
my @supported;
for (@color_digits) {
state $i = 0;
push @supported, dye
($color_digits[$i], $color_words[$i]); $i++;
}
my $this_script = basename($0, '');
my $USAGE = << "EOL";
This filter program do highlight words in STDIN
inputs | this_script "words" color
cat flower_names | $this_script "Rose" red
cat flower_names | $this_script "Rose" red back_dark_grey Itaric
supported visible colors are
@supported
EOL
die "$USAGE\n [@ARGV] found. More than 2 args needed.\n" if @ARGV < 2; my $color_letter_set;
for (1 .. @ARGV) {
my $color_letter = $color_map{lc shift @ARGV}; if ($color_letter) {
$color_letter_set .= $color_letter;
}
else {
die "$USAGE\nThe color may not be supported.\n"; }
$color_letter_set .= q(;) if @ARGV; };
while (<>) {
s/$words/dye($color_letter_set, $&)/eg;
}
IyEvdXNyL2Jpbi9lbnYgcGVybAp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4Owp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBmZWF0dXJlICJzdGF0ZSI7CgpzdWIgc2F5IHtwcmludCAiQF8iLCAiXG4ifTsKbXkgJWNvbG9yX21hcCA9ICgKICAgIGJvbGQgICAgICAgICAgICAgID0+IDEsCiAgICB0aW50ICAgICAgICAgICAgICA9PiAyLAogICAgaXRhcmljICAgICAgICAgICAgPT4gMywKICAgIHVuZGVybGluZSAgICAgICAgID0+IDQsCiAgICBibGluayAgICAgICAgICAgICA9PiA1LAogICAgYmxpbmtfcXVpY2sgICAgICAgPT4gNiwKICAgIGJhY2tfZ3JleSAgICAgICAgID0+IDcsCiAgICBpbnZpc2libGUgICAgICAgICA9PiA4LAogICAgY2VudGVyX2JhciAgICAgICAgPT4gOSwKICAgIHRhbGwgICAgICAgICAgICAgID0+IDEyLAogICAgdW5kZXJsaW5lX3cgICAgICAgPT4gMjEsCiAgICBibGFjayAgICAgICAgICAgICA9PiAzMCwKICAgIHJlZCAgICAgICAgICAgICAgID0+IDMxLAogICAgZ3JlZW4gICAgICAgICAgICAgPT4gMzIsCiAgICBvcmFuZ2UgICAgICAgICAgICA9PiAzMywKICAgIGJsdWUgICAgICAgICAgICAgID0+IDM0LAogICAgcHVycGxlICAgICAgICAgICAgPT4gMzUsCiAgICBjeWFuICAgICAgICAgICAgICA9PiAzNiwKICAgIGJhY2tfYmxhY2sgICAgICAgID0+IDQwLAogICAgYmFja19zaGFkZV9yZWQgICAgPT4gNDEsCiAgICBiYWNrX3NoYWRlX2dyZWVuICA9PiA0MiwKICAgIGJhY2tfb3JhbmdlICAgICAgID0+IDQzLAogICAgYmFja190aW50X2JsdWUgICAgPT4gNDQsCiAgICBiYWNrX3RpbnRfcHVycGxlICA9PiA0NSwKICAgIGJhY2tfc2hhZGVfY3lhbiAgID0+IDQ2LAogICAgYmFja193aGl0eSAgICAgICAgPT4gNDcsCiAgICB0b3BfYmFyICAgICAgICAgICA9PiA1MywKICAgIGxlZnRfdXAgICAgICAgICAgID0+IDczLAogICAgcmlnaHRfZG93biAgICAgICAgPT4gNzQsCiAgICBkYXJrX2dyZXkgICAgICAgICA9PiA5MCwKICAgIHZpdmlkX3JlZCAgICAgICAgID0+IDkxLAogICAgdml2aWRfZ3JlZW4gICAgICAgPT4gOTIsCiAgICB2aXZpZF95ZWxsb3cgICAgICA9PiA5MywKICAgIHZpdmlkX2JsdWUgICAgICAgID0+IDk0LAogICAgdml2aWRfbWFnZW50YSAgICAgPT4gOTUsCiAgICB2aXZpZF93YXRlciAgICAgICA9PiA5NiwKICAgIGJhY2tfZGFya19ncmV5ICAgID0+IDEwMCwKICAgIGJhY2tfcGluayAgICAgICAgID0+IDEwMSwKICAgIGJhY2tfbGlnaHRfZ3JlZW4gID0+IDEwMiwKICAgIGJhY2tfbGlnaHRfeWVsbG93ID0+IDEwMywKICAgIGJhY2tfbGlnaHRfYmx1ZSAgID0+IDEwNCwKICAgIGJhY2tfbGlnaHRfcHVycGxlID0+IDEwNSwKICAgIGJhY2tfbGlnaHRfY3lhbiAgID0+IDEwNiwKICAgIGJhY2tfd2hpdGUgICAgICAgID0+IDEwNywKICAgIG51bGwgICAgICAgICAgICAgID0+IDEwOCwKKTsKCnN1YiBkeWUgewogICAgbXkgJGNvbG9yX2xldHRlcl9zZXQgPSBzaGlmdDsKICAgIG15ICR3b3JkcyA9IHNoaWZ0OwogICAgIlxlWyIgLiAkY29sb3JfbGV0dGVyX3NldCAuICJtIiAuICR3b3JkcyAuICJcZVswbSI7Cn07CgpteSBAY29sb3Jfd29yZHMgID0gc29ydCBrZXlzICVjb2xvcl9tYXA7Cm15IEBjb2xvcl9kaWdpdHMgPSBAY29sb3JfbWFwe0Bjb2xvcl93b3Jkc307CgpteSBAc3VwcG9ydGVkOwpmb3IgKEBjb2xvcl9kaWdpdHMpIHsKICAgIHN0YXRlICRpID0gMDsKICAgIHB1c2ggQHN1cHBvcnRlZCwgZHllKCRjb2xvcl9kaWdpdHNbJGldLCAkY29sb3Jfd29yZHNbJGldKTsKICAgICRpKys7Cn0KCm15ICR0aGlzX3NjcmlwdCA9IGJhc2VuYW1lKCQwLCAnJyk7Cm15ICRVU0FHRSA9IDw8ICJFT0wiOwpUaGlzIGZpbHRlciBwcm9ncmFtIGRvIGhpZ2hsaWdodCB3b3JkcyBpbiBTVERJTgppbnB1dHMgfCB0aGlzX3NjcmlwdCAid29yZHMiIGNvbG9yCmNhdCBmbG93ZXJfbmFtZXMgfCAkdGhpc19zY3JpcHQgIlJvc2UiIHJlZApjYXQgZmxvd2VyX25hbWVzIHwgJHRoaXNfc2NyaXB0ICJSb3NlIiByZWQgYmFja19kYXJrX2dyZXkgSXRhcmljCgpzdXBwb3J0ZWQgdmlzaWJsZSBjb2xvcnMgYXJlCkBzdXBwb3J0ZWQKCkVPTAoKCmRpZSAiJFVTQUdFXG4gW0BBUkdWXSBmb3VuZC4gTW9yZSB0aGFuIDIgYXJncyBuZWVkZWQuXG4iIGlmIEBBUkdWIDwgMjsKbXkgJHdvcmRzID0gc2hpZnQgQEFSR1Y7Cm15ICRjb2xvcl9sZXR0ZXJfc2V0Owpmb3IgKDEgLi4gQEFSR1YpIHsKICAgIG15ICRjb2xvcl9sZXR0ZXIgPSAkY29sb3JfbWFwe2xjIHNoaWZ0IEBBUkdWfTsKICAgIGlmICgkY29sb3JfbGV0dGVyKSB7CiAgICAgICAgJGNvbG9yX2xldHRlcl9zZXQgLj0gJGNvbG9yX2xldHRlcjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGRpZSAiJFVTQUdFXG5UaGUgY29sb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQuXG4iOwogICAgfQogICAgJGNvbG9yX2xldHRlcl9zZXQgLj0gcSg7KSBpZiBAQVJHVjsKfTsKCndoaWxlICg8PikgewogICAgcy8kd29yZHMvZHllKCRjb2xvcl9sZXR0ZXJfc2V0LCAkJikvZWc7CiAgICBwcmludDsKfQo=