App-JobLog
view release on metacpan or search on metacpan
lib/App/JobLog/Log/Format.pm view on Meta::CPAN
}
sub display {
my ( $days, $merge_level, $hidden, $screen_width, $show_year ) = @_;
if (@$days) {
collect $_, $merge_level for @$days;
my @synopses = map { @{ $_->synopses } } @$days;
my $columns = {
time => single_interval($merge_level) && !$hidden->{time},
date => !$hidden->{date},
tags => !$hidden->{tags},
description => !$hidden->{description},
duration => !$hidden->{duration},
};
$show_year &&= $columns->{date};
my $format = _define_format( \@synopses, $columns, $screen_width );
# keep track of various durations
my $times = {
total => 0,
untagged => 0,
expected => 0,
vacation => 0,
tags => {}
};
# display synopses and add up durations
for my $d (@$days) {
$d->times($times);
$d->display( $format, $columns, $screen_width, $show_year );
}
unless ( $hidden->{totals} ) {
my ( $m1, $m2 ) =
( length 'TOTAL HOURS', length duration( $times->{total} ) );
my @keys = keys %{ $times->{tags} };
push @keys, 'UNTAGGED' if $times->{untagged};
push @keys, 'VACATION' if $times->{vacation};
for my $tag (@keys) {
my $l = length $tag;
$m1 = $l if $l > $m1;
}
$format = sprintf " %%-%ds %%%ds\n", $m1, $m2;
printf $format, 'TOTAL HOURS', duration( $times->{total} );
printf $format, 'VACATION', duration( $times->{vacation} )
if $times->{vacation};
if ( %{ $times->{tags} } ) {
printf $format, 'UNTAGGED', duration( $times->{untagged} )
if $times->{untagged};
for my $key ( sort keys %{ $times->{tags} } ) {
my $d = $times->{tags}{$key};
printf $format, $key, duration($d);
}
}
}
}
else {
say 'No events in interval specified.';
}
}
# generate printf format for synopses
# returns format and wrap widths for tags and descriptions
sub _define_format {
my ( $synopses, $hash, $screen_width ) = @_;
#determine maximum width of each column
my $widths;
for my $s (@$synopses) {
if ( $hash->{tags} ) {
my $w1 = $hash->{widths}{tags} || 0;
my $ts = $s->tag_string;
if ( $screen_width > -1 && length $ts > TAG_COLUMN_LIMIT ) {
my $wrapped = wrap( $ts, TAG_COLUMN_LIMIT );
$ts = '';
for my $line (@$wrapped) {
$ts = $line if length $line > length $ts;
}
}
my $w2 = length $ts;
$hash->{widths}{tags} = $w2 if $w2 > $w1;
}
if ( $hash->{time} ) {
my $w1 = $hash->{widths}{time} || 0;
my $w2 = length $s->time_fmt;
$hash->{widths}{time} = $w2 if $w2 > $w1;
}
if ( $hash->{duration} ) {
my $w1 = $hash->{widths}{duration} || 0;
my $w2 = length duration( $s->duration );
$hash->{widths}{duration} = $w2 if $w2 > $w1;
}
}
my $margins = 0;
if ( $hash->{tags} && $hash->{widths}{tags} ) {
$margins++;
$hash->{formats}{tags} = sprintf '%%-%ds', $hash->{widths}{tags};
# there seems to be a bug in Text::Wrap that requires tinkering with the column width
$hash->{widths}{tags}++;
}
if ( $hash->{time} && $hash->{widths}{time} ) {
$margins++;
$hash->{formats}{time} = sprintf '%%%ds', $hash->{widths}{time};
}
if ( $hash->{duration} && $hash->{widths}{duration} ) {
$margins++;
$hash->{formats}{duration} = sprintf '%%%ds', $hash->{widths}{duration};
}
if ( $hash->{description} ) {
if ( $screen_width == -1 ) {
$hash->{formats}{description} = '%s';
}
else {
$margins++;
my $max_description = $screen_width;
for my $col (qw(time duration tags)) {
$max_description -= $hash->{widths}{$col} || 0;
( run in 0.479 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )