#!/usr/bin/perl
package App::term::hr;
use vars qw($VERSION);
my $APP = 'hr';
$VERSION = '0.11';
use strict;
use warnings;
use utf8;
use Pod::Usage;
use Getopt::Long qw(GetOptions);
Getopt::Long::Configure('bundling_override');
use Term::ExtendedColor qw(fg bg bold);
#< options
my %opt = (
char => '=',
size => undef,
pre => 0,
post => 0,
);
my $attributes = '';
GetOptions(
'c|char:s' => \$opt{char},
's|size:i' => \$opt{size},
'pre:i' => \$opt{pre},
'post:i' => \$opt{post},
'fg:i' => sub {
$attributes .= ($attributes !~ m/^$/)
? ";38;5;$_[1]"
: "38;5;$_[1]"
},
'bg:i' => sub {
$attributes .= ($attributes !~ m/^$/)
? ";48;5;$_[1]"
: "48;5;$_[1]"
},
'b|bold' => sub {
$attributes .= ($attributes !~ m/^$/)
? ";1"
: "38;5;1"
},
'i|italic' => sub {
$attributes .= ($attributes !~ m/^$/)
? ";3"
: "3"
},
'u|underline' => sub {
$attributes .= ($attributes !~ m/^$/)
? ";4"
: "4"
},
'r|reverse' => sub {
$attributes .= ($attributes !~ m/^$/)
? ";7"
: "7"
},
'h|help' => sub { pod2usage(verbose => 1); },
'm|man' => sub { pod2usage(verbose => 3); },
'v|version' => sub { printf "%s v%s\n", $APP, $VERSION; exit },
);
#>
hr();
sub hr {
my $char = shift // $opt{char};
my $hr = sprintf "%s%s%s",
' ' x $opt{pre},
$char x columns(),
' ' x $opt{post};
if($attributes !~ m/^$/) {
$hr = color($hr, $attributes);
print $hr;
}
else {
print $hr;
# print $char x columns();
}
print "\n";
}
sub columns {
return $opt{size} if defined($opt{size});
my $width = 80; # sane default
if(defined $ENV{COLUMNS}) {
$width = $ENV{COLUMNS};
}
elsif(eval { require Term::Size; 1 }) {
($width, undef) = Term::Size::chars();
}
$width = ($width - ($opt{pre} + $opt{post}));
return $width;
}
sub color {
my $str = shift;
my $colors = shift;
return fg($colors, $str);
}
=head1 NAME
hr - define a thematic change in the content of a terminal session
=head1 SYNOPSIS
hr [OPTIONS]
=head1 DESCRIPTION
hr prints a horisontal bar in your terminal. Useful when you run a
chain of commands that might produce a lot of output and you need to
differentiate where a given output is coming from.
=head1 OPTIONS
-c, --char Character to use
-s, --size Number of columns
-pre, --pre Pad the left side with whitespace n
-post, --post Pad the right side with whitespace n
-fg, --fg Foreground color to use, int 0-255
-bg, --bg Background color to use, int 0-255
-b, --bold Use bold
-i, --italic Use italics
-u, --underline Use underline
-r, --reverse Use reverse video
-h, --help Display this help and exit
-m, --man Display the manual and exit
-v, --version Display version info and exit
=head1 EXAMPLES
# display a yellow underlined bar using the default '=' character
hr -fg 220 --underline
# display a red solid bar padded by 10 columns from right and left
hr -fg 160 -c ▀ --pre 10 --post 10
# display a solid grey, thick bar using ascii character _ and the bold,
# underline and reverse video attributes
hr -fg 240 -c_ -bur
# display a bar made of dots, with 5 column spacing one each size
# and 20 columns wide.
hr -fg 197 -c· -pre 5 -post 5 -size 20
# use all options at once, because why not?
hr -c ! -fg 52 -bg 196 -biur -s 70 -pre 5 -post 5
# use several characters to form a bar using arithmetics
hr -c " japh " -fg 1 -bg 0 -b -s $(($COLUMNS / 8))
=head1 AUTHOR
Magnus Woldrich
CPAN ID: WOLDRICH
m@japh.se
http://japh.se
http://github.com/trapd00r
=head1 COPYRIGHT
Copyright 2019 B<THIS APPLICATION>s L</AUTHOR> and L</CONTRIBUTORS> as listed
above.
=head1 LICENSE
This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut