move subroutine sival() out of readline loop
[barcat.git] / barcat
diff --git a/barcat b/barcat
index 7f442a54f97e410cd6f684d1e4e2598795c5d137..88dc55ce88a646ae1925d84f7bf6a29ffa240f8b 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -79,16 +79,27 @@ GetOptions(\%opt,
        'usage|h' => sub {
                local $/;
                my $pod = readline *DATA;
-               $pod =~ s/^=over\K/ 22/m;  # indent options list
+               $pod =~ s/^=over\K/ 25/m;  # indent options list
                $pod =~ s/^=item \N*\n\n\N*\n\K(?:(?:^=over.*?^=back\n)?(?!=)\N*\n)*/\n/msg;
+               $pod =~ s/[.,](?=\n)//g;  # trailing punctuation
+               $pod =~ s/^=item \K(?=--)/____/gm;  # align long options
+               # abbreviate <variable> indicators
+               $pod =~ s/\Q>.../s>/g;
+               $pod =~ s/<(?:number|count|seconds)>/N/g;
+               $pod =~ s/<character(s?)>/\Uchar$1/g;
+               $pod =~ s/\Q | /|/g;
+               $pod =~ s/(?<!\w)<([a-z]+)>/\U$1/g;  # uppercase
 
                require Pod::Usage;
-               my $parser = Pod::Usage->new;
+               my $parser = Pod::Usage->new(USAGE_OPTIONS => {
+                       -indent => 2, -width => 78,
+               });
                $parser->select('SYNOPSIS', 'OPTIONS');
                $parser->output_string(\my $contents);
                $parser->parse_string_document($pod);
 
                $contents =~ s/\n(?=\n\h)//msg;  # strip space between items
+               $contents =~ s/^  \K____/    /gm;  # nbsp substitute
                print $contents;
                exit;
        },
@@ -168,6 +179,16 @@ sub color {
        $_ = color(@_) . $_ . color(0) if defined;
 }
 
+sub sival {
+       my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15);
+       my $float = $_[0] !~ /^0*[-0-9]{1,3}$/;
+       sprintf('%3.*f%1s',
+               $float && ($unit % 3) == ($unit < 0),  # tenths
+               $_[0] / 1000 ** int($unit/3),   # number
+               $#{$opt{units}} * 1.5 < abs $unit ? "e$unit" : $opt{units}->[$unit/3]
+       );
+}
+
 sub show_lines {
 
 state $nr = $opt{hidemin} ? $opt{hidemin} - 1 : 0;
@@ -181,12 +202,13 @@ my $maxval = $opt{maxval} // (
        $order[0]
 ) // 0;
 my $minval = $opt{minval} // min $order[-1] // (), 0;
+my $range = $maxval - $minval;
 my $lenval = $opt{'value-length'} // max map { length } @order;
 my $len    = defined $opt{trim} && $opt{trim} <= 0 ? -$opt{trim} + 1 :
        max map { length $values[$_] && length $lines[$_] }
                0 .. min $#lines, $opt{hidemax} || ();  # left padding
-my $size   = ($maxval - $minval) &&
-       ($opt{width} - $lenval - $len) / ($maxval - $minval);  # bar multiplication
+my $size   = $range &&
+       ($opt{width} - $lenval - $len) / $range;  # bar multiplication
 
 my @barmark;
 if ($opt{markers} and $size > 0) {
@@ -216,7 +238,7 @@ if ($opt{markers} and $size > 0) {
                        ($lastmax - $minval) * $size + .5,
                        '-' x (($values[$nr - 1] - $minval) * $size);
                print color(92);
-               say '+' x (($maxval - $lastmax - $minval) * $size + .5);
+               say '+' x (($range - $lastmax) * $size + .5);
                print color(0);
                $lastmax = $maxval;
        }
@@ -224,20 +246,10 @@ if ($opt{markers} and $size > 0) {
 
 @lines > $nr or return if $opt{hidemin};
 
-sub sival {
-       my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15);
-       my $float = $_[0] !~ /^0*[-0-9]{1,3}$/;
-       sprintf('%3.*f%1s',
-               $float && ($unit % 3) == ($unit < 0),  # tenths
-               $_[0] / 1000 ** int($unit/3),   # number
-               $#{$opt{units}} * 1.5 < abs $unit ? "e$unit" : $opt{units}->[$unit/3]
-       );
-}
-
 say(
        color(31), sprintf('%*s', $lenval, $minval),
        color(90), '-', color(36), '+',
-       color(32), sprintf('%*s', $size * ($maxval - $minval) - 3, $maxval),
+       color(32), sprintf('%*s', $size * $range - 3, $maxval),
        color(90), '-', color(36), '+',
        color(0),
 ) if $opt{header};
@@ -245,7 +257,7 @@ say(
 while ($nr <= $#lines) {
        $nr >= $opt{hidemax} and last if defined $opt{hidemax};
        my $val = $values[$nr];
-       my $rel = length $val && ($val - $minval) / ($maxval - $minval);
+       my $rel = length $val && $range && ($val - $minval) / $range;
        my $color = !length $val || !$opt{palette} ? undef :
                $val == $order[0] ? $opt{palette}->[-1] : # max
                $val == $order[-1] ? $opt{palette}->[0] : # min
@@ -343,7 +355,7 @@ Force colored output of values and bar markers.
 Defaults on if output is a tty,
 disabled otherwise such as when piped or redirected.
 
-=item -f, --field=(<number>|<regexp>)
+=item -f, --field=(<number> | <regexp>)
 
 Compare values after a given number of whitespace separators,
 or matching a regular expression.
@@ -366,7 +378,7 @@ turning long numbers like I<12356789> into I<12.4M>.
 Also changes an exponent I<1.602176634e-19> to I<160.2z>.
 Short integers are aligned but kept without decimal point.
 
-=item -t, --interval[=(<seconds>|-<lines>)]
+=item -t, --interval[=(<seconds> | -<lines>)]
 
 Output partial progress every given number of seconds or input lines.
 An update can also be forced by sending a I<SIGALRM> alarm signal.
@@ -433,13 +445,13 @@ These options can be set to customize this range.
 
 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.
+or alternatively I<1;30> for bright 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>]
+=item --spark[=<characters>]
 
 Replace lines by I<sparklines>,
 single characters corresponding to input values.
@@ -559,7 +571,11 @@ Or the top 3 most frequent authors with statistics over all:
 
     git shortlog -sn | barcat -L3 -s
 
-Activity of the last days (substitute date C<-v-{}d> on BSD):
+Sparkline graphics of simple input given as inline parameters:
+
+       barcat --spark= 3 1 4 1 5 0 9 2 4
+
+Activity graph of the last days (substitute date C<-v-{}d> on BSD):
 
     ( git log --pretty=%ci --since=30day | cut -b-10
       seq 0 30 | xargs -i date +%F -d-{}day ) |