X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/ba560363d26272c0464706f5352be7a929729ff2..1581d8acae9b0ed74bd4c5a696f6cdc470fe84d9:/barcat diff --git a/barcat b/barcat index db9de17..c2f41aa 100755 --- a/barcat +++ b/barcat @@ -77,7 +77,10 @@ if (defined $opt{interval}) { } or warn $@, "Expect slowdown with large datasets!\n"; } -$SIG{INT} = 'IGNORE'; # continue after assumed eof +$SIG{INT} = sub { + $SIG{INT} = 'DEFAULT'; # reset for subsequent attempts + 'IGNORE' # continue after assumed eof +}; my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+ (?: e[+-]?[0-9]+ )? |)/x; while (readline) { @@ -99,6 +102,12 @@ while (readline) { $SIG{INT} = 'DEFAULT'; +sub color { + $opt{color} and defined $_[0] or return ''; + return "\e[$_[0]m" if defined wantarray; + $_ = color(@_) . $_ . color(0) if defined; +} + sub show_lines { state $nr = $opt{hidemin} ? $opt{hidemin} - 1 : 0; @@ -124,18 +133,18 @@ if ($opt{markers} // 1 and $size > 0) { $barmark[ orderpos($#order * .68269) ] = '<'; $barmark[ orderpos($#order / 2) ] = '+'; # mean $barmark[ -$minval * $size ] = '|' if $minval < 0; # zero - defined and $opt{color} and $_ = "\e[36m$_\e[0m" for @barmark; + color(36) for @barmark; state $lastmax = $maxval; if ($maxval > $lastmax) { print ' ' x ($lenval + $len); - printf "\e[90m" if $opt{color}; + printf color(90); printf '%-*s', ($lastmax - $minval) * $size + .5, '-' x (($values[$nr - 1] - $minval) * $size); - print "\e[92m" if $opt{color}; + print color(92); say '+' x (($maxval - $lastmax - $minval) * $size + .5); - print "\e[0m" if $opt{color}; + print color(0); $lastmax = $maxval; } } @@ -143,13 +152,12 @@ if ($opt{markers} // 1 and $size > 0) { @lines > $nr or return if $opt{hidemin}; sub sival { - my $unit = int(log($_[0]) / log(1000) - ($_[0] < 1)); - my $float = $_[0] !~ /^ (?: 0*\.)? [0-9]{1,3} $/x; - sprintf('%*.*f%*s', - $float ? 5 : 3, $float, # length and tenths - $_[0] / 1000 ** $unit, # number - $float ? 0 : 3, # unit size - $#{$opt{units}} >> 1 < abs $unit ? "e$unit" : $opt{units}->[$unit] + 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] ); } @@ -157,12 +165,12 @@ while ($nr <= $#lines) { $nr >= $opt{hidemax} and last if defined $opt{hidemax}; my $val = $values[$nr]; if (length $val) { - my $color = !$opt{color} ? 0 : + my $color = !$opt{color} ? undef : $val == $order[0] ? 32 : # max $val == $order[-1] ? 31 : # min 90; $val = $opt{units} ? sival($val) : sprintf "%*s", $lenval, $val; - $val = "\e[${color}m$val\e[0m" if $color; + color($color) for $val; } my $line = $lines[$nr] =~ s/\n/$val/r; printf '%-*s', $len + length($val), $line; @@ -192,6 +200,7 @@ if ($opt{stat}) { } __END__ +=encoding utf8 =head1 NAME @@ -354,7 +363,7 @@ External datasets, like movies per year: But please get I to process JSON and replace the manual selection by C<< jq '.[].year' >>. -PokEmon height comparison: +Pokémon height comparison: curl https://github.com/Biuni/PokemonGO-Pokedex/raw/master/pokedex.json | jq -r '.pokemon[] | [.height,.num,.name] | join(" ")' | barcat @@ -380,6 +389,12 @@ Or the top 3 most frequent authors with statistics over all: git shortlog -sn | barcat -L3 -s +Activity of the last days: + + ( git log --pretty=%ci --since=30day | cut -b-10 + seq 0 30 | xargs -i date +%F -d-{}day ) | + sort | uniq -c | awk '$1--' | graph + =head1 AUTHOR Mischa POSLAWSKY