X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/544058a8ebb15d95a4e66abad4213fd0f83c6aac..723ee2afb91020afe0bb270f91c76bef283b6643:/barcat diff --git a/barcat b/barcat index e02ce4e..1ffdeda 100755 --- a/barcat +++ b/barcat @@ -180,9 +180,8 @@ if (defined $opt{interval}) { } or warn $@, "Expect slowdown with large datasets!\n"; } -my $valmatch = qr< - $opt{anchor} ( \h* -? [0-9]* [.]? [0-9]+ (?: e[+-]?[0-9]+ )? |) ->x; +my $float = qr<[0-9]* [.]? [0-9]+ (?: e[+-]?[0-9]+ )?>; # positive numberish +my $valmatch = qr< $opt{anchor} ( \h* -? $float |) >x; while (defined ($_ = $opt{input} ? shift @{ $opt{input} } : readline)) { s/\r?\n\z//; s/\A\h*// unless $opt{unmodified}; @@ -249,7 +248,7 @@ my @barmark; if ($opt{markers} and $size > 0) { for my $markspec (split /\h/, $opt{markers}) { my ($char, $func) = split //, $markspec, 2; - my $pos = eval { + my @pos = eval { if ($func eq 'avg') { return sum(@order) / @order; } @@ -263,18 +262,28 @@ if ($opt{markers} and $size > 0) { elsif ($func =~ /\A-?[0-9.]+\z/) { return $func; } + elsif ($func =~ /\A\/($float)\z/) { + my @range = $1; + #TODO log + for (my $next = $1; $next < $maxval; $next += $range[0]) { + push @range, $next; + } + return @range; + } else { die "Unknown marker $char: $func\n"; } }; - defined $pos or do { + @pos or do { warn $@ if $@; next; }; - $pos -= $minval; - $pos &&= log $pos if $opt{log}; - $pos >= 0 or next; - color(36) for $barmark[$pos / $range * $size] = $char; + for my $pos (@pos) { + $pos -= $minval; + $pos &&= log $pos if $opt{log}; + $pos >= 0 or next; + color(36) for $barmark[$pos / $range * $size] = $char; + } } state $lastmax = $maxval; @@ -359,14 +368,15 @@ sub show_stat { $linemin += @lines; $linemax = @lines - $linemax; } - printf '%.8g of ', $opt{'value-format'}->( - sum(grep {length} @values[$linemin .. $linemax]) // 0 - ); + print varfmt('${sum+} of ', { + lines => $linemax - $linemin + 1, + sum => sum(0, grep {length} @values[$linemin .. $linemax]), + }); } if (@order) { my $total = sum @order; - my $fmt = '${sum;color(1)} total in ${count} values'; - $fmt .= ' over ${lines} lines' if @order != @lines; + my $fmt = '${sum+;color(1)} total in ${count#} values'; + $fmt .= ' over ${lines#} lines' if @order != @lines; $fmt .= " ($_)" for $opt{report} || (); print varfmt($fmt, { sum => $total, @@ -383,11 +393,12 @@ sub show_stat { sub varfmt { my ($fmt, $vars) = @_; - $fmt =~ s[\$\{( (?: [^{}]++ | \{(?1)\} )+ )\}]{ + $fmt =~ s[\$\{ \h*+ ((?: [^{}]++ | \{(?1)\} )+) \}]{ my ($name, $cmd) = split /\s*;/, $1, 2; + my $format = $name =~ s/\+// || $name !~ s/\#// && $opt{reformat}; local $_ = $vars->{$name}; if (defined) { - $_ = $opt{'value-format'}->($_) if $opt{reformat}; + $_ = $opt{'value-format'}->($_) if $format; if ($cmd) { eval $cmd; warn "Error in \$$name report: $@" if $@; @@ -564,7 +575,12 @@ A single indicator glyph precedes each position: Exact value to match on the axis. A vertical bar at the zero crossing is displayed by I<|0> for negative values. -For example I<:3.14> would show a colon at pi. +For example I<π3.14> would locate pi. + +=item I + +Repeated at every multiple of a number. +For example I<:/1> for a grid at every integer. =item I @@ -739,7 +755,7 @@ Total population history in XML from the World Bank: curl http://api.worldbank.org/v2/country/1W/indicator/SP.POP.TOTL | xmlstarlet sel -t -m '*/*' -v wb:date -o ' ' -v wb:value -n | - barcat -f1 -H + barcat -f1 -H --markers=+/1e9 Population and other information for all countries: