#!/usr/bin/perl use warnings; use strict; use Getopt::Long qw{:config gnu_getopt posix_default}; use POSIX; use Term::ReadKey; $0 =~ s{^.*/([^/]+)$}{$1}; my %opt; GetOptions(\%opt, qw{ cancel|c height|h=i overlay|o stack|s width|w=i }) or do { print STDERR < $delmax ? $addmax : $delmax; my $scale = $width / $max; my $today = int (time / 86400); for my $date ($today - $height .. $today) { my $add = 0; my $del = 0; my $mod = 0; $add{$date} //= 0; $del{$date} //= 0; if ($opt{cancel} or $opt{overlay}) { if ($add{$date} > $del{$date}) { $add = $add{$date} - $del{$date}; } else { $del = $del{$date} - $add{$date}; } } if ($opt{overlay}) { $mod = $add{$date} < $del{$date} ? $add{$date} : $del{$date}; } if ($opt{stack}) { $add = $add{$date}; $del = $del{$date}; } my $greg = strftime "%b %d %w", localtime $date * 86400; $greg =~ s{(\d)$}{substr "sMTWTFs", $1, 1}e; my $line = sprintf "$greg \e[33m%s\e[32m%s\e[31m%s\e[0m\n", "#" x ($mod && 1 + $mod * $scale), "+" x ($add && 1 + $add * $scale), "-" x ($del && 1 + $del * $scale); if (length $line > $width + 30) { $line = sprintf "## %d ##\e[32m++ %d ++\e[31m-- %d --\e[0m\n", $mod, $add, $del; $line = "$greg \e[33m" . "#"x($width + 16 - length $line) . $line; } print $line; } printf " \e[33m#\e[0m <- %-8.1f %s %8d ->\n", 1/$scale, " " x ($width - 25), $max;