palette option to customize value colors
[barcat.git] / barcat
diff --git a/barcat b/barcat
index 1bcda801779e9a4028b07f5005b5217b5d5120e8..8bb7bbd2c3b742532aeb50a1f986135a0a8dcc2d 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -6,7 +6,7 @@ use List::Util qw( min max sum );
 use open qw( :std :utf8 );
 use experimental qw( lexical_subs );
 
-our $VERSION = '1.05';
+our $VERSION = '1.06';
 
 use Getopt::Long '2.33', qw( :config gnu_getopt );
 my %opt;
@@ -42,6 +42,7 @@ GetOptions(\%opt,
                        " (range expected)\n"
                );
        },
+       'header!',
        'markers|m=s',
        'graph-format=s' => sub {
                $opt{'graph-format'} = substr $_[1], 0, 1;
@@ -49,10 +50,17 @@ GetOptions(\%opt,
        'spark:s' => sub {
                $opt{spark} = [split //, $_[1] || '▁▂▃▄▅▆▇█'];
        },
+       'palette:s' => sub {
+               $opt{palette} = [ split /\s/, $_[1] ];
+       },
        'stat|s!',
        'signal-stat=s',
        'unmodified|u!',
        'width|w=i',
+       'version' => sub {
+               say "barcat version $VERSION";
+               exit;
+       },
        'usage|h' => sub {
                local $/;
                my $pod = readline *DATA;
@@ -86,6 +94,7 @@ $opt{anchor} //= qr/\A/;
 $opt{'value-length'} = 6 if $opt{units};
 $opt{'value-length'} = 1 if $opt{unmodified};
 $opt{'signal-stat'} //= exists $SIG{INFO} ? 'INFO' : 'QUIT';
+$opt{palette} //= $opt{color} && [31, 90, 32];
 
 my (@lines, @values, @order);
 
@@ -188,6 +197,14 @@ sub sival {
        );
 }
 
+say(
+       color(31), sprintf('%*s', $lenval, $minval),
+       color(90), '-', color(36), '+',
+       color(32), sprintf('%*s', $size * ($maxval - $minval) - 3, $maxval),
+       color(90), '-', color(36), '+',
+       color(0),
+) if $opt{header};
+
 while ($nr <= $#lines) {
        $nr >= $opt{hidemax} and last if defined $opt{hidemax};
        my $val = $values[$nr];
@@ -198,10 +215,10 @@ while ($nr <= $#lines) {
        }
 
        if (length $val) {
-               my $color = !$opt{color} ? undef :
-                       $val == $order[0] ? 32 : # max
-                       $val == $order[-1] ? 31 : # min
-                       90;
+               my $color = !$opt{palette} ? undef :
+                       $val == $order[0] ? $opt{palette}->[-1] : # max
+                       $val == $order[-1] ? $opt{palette}->[0] : # min
+                       $opt{palette}->[1] // $opt{palette}->[0];
                $val = $opt{units} ? sival($val) : sprintf "%*s", $lenval, $val;
                color($color) for $val;
        }
@@ -290,6 +307,10 @@ A string can indicate the starting position of a value
 or capture the numbers itself,
 for example I<-f'(\d+)'> for the first digits anywhere.
 
+=item --header
+
+Prepend a chart axis with minimum and maximum values labeled.
+
 =item -H, --human-readable
 
 Format values using SI unit prefixes,
@@ -356,6 +377,16 @@ or 68% of all entries.
 
 =back
 
+=item --palette=<color>...
+
+Override colors of parsed numbers.
+Can be any CSI escape, such as I<90> for default dark grey,
+or alternatively I<1;30> for bold black.
+
+In case of additional colors,
+the last is used for values equal to the maximum, the first for minima.
+If unspecified, these are green and red respectively (I<31 90 32>).
+
 =item --spark[=<glyphs>]
 
 Replace lines by I<sparklines>,