App-PS1
view release on metacpan or search on metacpan
lib/App/PS1.pm view on Meta::CPAN
use Term::ANSIColor;
use base qw/Class::Accessor::Fast/;
eval { require Term::Colour256 };
my $t256 = !$EVAL_ERROR;
our $VERSION = 0.08;
__PACKAGE__->mk_accessors(qw/ ps1 cols plugins bw low exit parts safe theme verbose/);
my %theme = (
default => {
# name Low Colour Hi Colour
background => [ 'black' , 'on_52' ],
marker => [ 'black' , 246 ],
up_time => [ 'yellow', 'yellow' ],
up_label => [ 'black' , 'black' ],
branch => [ 'cyan' , 'cyan' ],
branch_label => [ 'black' , 'black' ],
date => [ 'red' , 'red' ],
face_happy => [ 'green' , 46 ],
face_sad => [ 'red' , 202 ],
dir_name => [ 'white' , 'white' ],
dir_label => [ 'black' , 'black' ],
dir_size => [ 'cyan' , 'cyan' ],
},
green => {
# name Low Colour Hi Colour
background => [ 'on_green', 'on_22' ],
marker => [ 'black' , 246 ],
up_time => [ 'yellow' , 'yellow' ],
up_label => [ 'black' , 'black' ],
branch => [ 'white' , 190 ],
branch_label => [ 'black' , 'black' ],
date => [ 'red' , 9 ],
face_happy => [ 'green' , 46 ],
face_sad => [ 'red' , 202 ],
dir_name => [ 'blue' , 21 ],
dir_label => [ 'black' , 'black' ],
dir_size => [ 'cyan' , 33 ],
},
blue => {
# name Low Colour Hi Colour
background => [ 'on_blue' , 'on_30' ],
marker => [ 'black' , 236 ],
up_time => [ 'yellow' , 'yellow' ],
up_label => [ 'black' , 'black' ],
branch => [ 'white' , 190 ],
branch_label => [ 'black' , 'black' ],
date => [ 'red' , 52 ],
face_happy => [ 'green' , 46 ],
face_sad => [ 'red' , 52 ],
dir_name => [ 'blue' , 21 ],
dir_label => [ 'black' , 'black' ],
dir_size => [ 'green' , 46 ],
},
);
sub new {
my ($class, $params) = @_;
my $self = $class->SUPER::new($params);
$self->safe( $ENV{UNICODE_UNSAFE} ) if !defined $self->safe;
$self->theme("default") if !defined $self->theme;
$theme{ $self->theme } ||= {};
for my $name ( keys %{ $theme{ $self->theme } } ) {
my $env = $ENV{ 'APP_PS1_' . uc $name };
if ($env) {
$theme{ $self->theme }{$name} = [ ( $env ) x 2 ];
}
}
return $self;
}
sub sum(@) { ## no critic
my $i = 0;
$i += $_ || 0 for (@_);
return $i;
}
sub cmd_prompt {
my ($self) = @_;
my $out = '';
$self->parts([]);
for my $param ( split /;/, $self->ps1 ) {
my ( $plugin, $options ) = split /(?=[{])/, $param;
next if $plugin !~ /^[a-z]+$/;
next if !$self->load($plugin);
$options = $self->parse_options($options, $plugin);
my ($text, $size) = eval { $self->$plugin($options) };
if ($size) {
push @{$self->parts}, [ $text, $size ];
}
}
my $total = $self->parts_size;
my $spare = $self->cols - $total;
my $spare_size = $spare / ( @{$self->parts} - 1 );
while ($spare < 0 || $spare_size < 0) {
pop @{$self->parts};
if ( @{$self->parts} == 1 ) {
$total = $self->parts_size;
$spare = $self->cols - $total;
$spare_size = $spare;
last;
}
$total = $self->parts_size;
$spare = $self->cols - $total;
$spare_size = ( @{$self->parts} - 1 ) ? $spare / ( @{$self->parts} - 1 ) : 0;
}
if ( $total <= $self->cols ) {
my $line = '';
my $extra = 0;
for my $i ( 0 .. @{$self->parts} - 2 ) {
( run in 2.024 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )