prepare to fix spark distribution
[barcat.git] / barcat
diff --git a/barcat b/barcat
index fedb6c9081334a981f796a40d3201ea57f4b7170..095ee93c5ac9080dbff1408ebf8afb8af8068f0a 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -6,10 +6,12 @@ use List::Util qw( min max sum );
 use open qw( :std :utf8 );
 use re '/msx';
 
-our $VERSION = '1.07';
+our $VERSION = '1.08';
 
-use Getopt::Long '2.33', qw( :config gnu_getopt );
 my %opt;
+if (@ARGV) {
+require Getopt::Long;
+Getopt::Long->import('2.33', qw( :config gnu_getopt ));
 GetOptions(\%opt,
        'ascii|a!',
        'color|c!',
@@ -77,8 +79,9 @@ GetOptions(\%opt,
        'signal-stat=s',
        'unmodified|u!',
        'width|w=i',
-       'version' => sub {
-               say "barcat version $VERSION";
+       'version|V' => sub {
+               my $mascot = $opt{ascii} ? '=^,^=' : 'ฅ^•ﻌ•^ฅ';
+               say "barcat $mascot version $VERSION";
                exit;
        },
        'usage|h' => sub {
@@ -92,6 +95,7 @@ GetOptions(\%opt,
                );
        },
 ) or exit 64;  # EX_USAGE
+}
 
 $opt{width} ||= $ENV{COLUMNS} || qx(tput cols) || 80 unless $opt{spark};
 $opt{color} //= -t *STDOUT;  # enable on tty
@@ -112,17 +116,21 @@ $opt{input} = (@ARGV && $ARGV[0] =~ m/\A[-0-9]/) ? \@ARGV : undef
 $opt{'sum-format'} = sub { sprintf '%.8g', $_[0] };
 $opt{'calc-format'} = sub { sprintf '%*.*f', 0, 2, $_[0] };
 $opt{'value-format'} = $opt{units} && sub {
-       my $unit = int(
+       my $unit = (
                log(abs $_[0] || 1) / log(10)
-               - 3 * ($_[0] < .9995)   # shift to smaller unit if below 1
-               - log(.9995) / log(10)  # 3 digits rounding up
+               - 3 * (abs($_[0]) < .9995)   # shift to smaller unit if below 1
                + 1e-15  # float imprecision
        );
-       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]
+       my $decimal = ($unit % 3) == ($unit < 0);
+       $unit -= log($decimal ? .995 : .9995) / log(10);  # rounded
+       $decimal = ($unit % 3) == ($unit < 0);
+       $decimal &&= $_[0] !~ /^-?0*[0-9]{1,3}$/;  # integer 0..999
+       sprintf('%*.*f%1s',
+               3 + ($_[0] < 0), # digits plus optional negative sign
+               $decimal,  # tenths
+               $_[0] / 1000 ** int($unit/3),  # number
+               $#{$opt{units}} * 1.5 < abs $unit ? sprintf('e%d', $unit) :
+                       $opt{units}->[$unit/3]  # suffix
        );
 };
 
@@ -291,6 +299,10 @@ while ($nr <= $limit) {
                color($color) for $val;
        }
        my $line = $lines[$nr] =~ s/\n/$val/r;
+       if (not length $val) {
+               say $line;
+               next;
+       }
        printf '%-*s', $len + length($val), $line;
        print $barmark[$_] // $opt{'graph-format'}
                for 1 .. $size && (($values[$nr] || 0) - $minval) * $size + .5;
@@ -341,9 +353,9 @@ sub show_exit {
 show_exit();
 
 __END__
-Usage:
-  barcat [OPTIONS] [FILES|NUMBERS]
-
+Usage:                                               /\_/\
+  barcat [OPTIONS] [FILES|NUMBERS]                  (=•.•=)
+                                                    (u   u)
 Options:
   -a, --[no-]ascii         Restrict user interface to ASCII characters
   -c, --[no-]color         Force colored output of values and bar markers
@@ -369,14 +381,14 @@ Options:
       --value-length=SIZE  Reserved space for numbers
   -w, --width=COLUMNS      Override the maximum number of columns to use
   -h, --usage              Overview of available options
-      --help               Full documentation
-      --version            Version information
+      --help               Full pod documentation
+  -V, --version            Version information
 
 =encoding utf8
 
 =head1 NAME
 
-barcat - graph to visualize input values
+barcat - concatenate texts with graph to visualize values
 
 =head1 SYNOPSIS
 
@@ -552,10 +564,10 @@ Overview of available options.
 
 =item --help
 
-Full documentation
-rendered by perldoc.
+Full pod documentation
+as rendered by perldoc.
 
-=item --version
+=item -V, --version
 
 Version information.
 
@@ -640,16 +652,16 @@ Or the top 3 most frequent authors with statistics over all:
 
     git shortlog -sn | barcat -L3 -s
 
-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 ) |
     sort | uniq -c | awk '$1--' | barcat --spark
 
+Sparkline graphics of simple input given as inline parameters:
+
+       barcat --spark= 3 1 4 1 5 0 9 2 4
+
 =head1 AUTHOR
 
 Mischa POSLAWSKY <perl@shiar.org>