X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/8533154739967d8a22b897d1507616a6c5a4e666..e1677f5ff98c942aa9758da02b7d4336b3dfe46b:/barcat diff --git a/barcat b/barcat index 6dbddd9..bf38f12 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}; @@ -240,8 +239,8 @@ my $range = $maxval - $minval; $range &&= log $range if $opt{log}; 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 + max(map { length $values[$_] && length $lines[$_] } $nr .. $limit) + // 0; # left padding my $size = defined $opt{width} && $range && ($opt{width} - $lenval - $len - !!$opt{indicators}); # bar multiplication @@ -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 = my $multiple = my $next = $1; + while ($next < $maxval) { + $multiple *= 10 if $opt{log}; + push @range, $next += $multiple; + } + 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,19 +393,21 @@ sub show_stat { sub varfmt { my ($fmt, $vars) = @_; - $fmt =~ s[\$\{ (\w+) (?; (?: [^{}]+ | \{.*?\} )*)? \}]{ - local $_ = $vars->{$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}; - if ($+{cmd}) { - eval $+{cmd}; - warn "Error in \$$1 report: $@" if $@; + $_ = $opt{'value-format'}->($_) if $format; + if ($cmd) { + eval $cmd; + warn "Error in \$$name report: $@" if $@; } $_; } else { - warn "Unknown variable \$$1 in report\n"; - "\$$1"; + warn "Unknown variable \$$name in report\n"; + "\$$name"; } }eg; return $fmt; @@ -563,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 @@ -738,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: