App-termpub
view release on metacpan or search on metacpan
lib/App/termpub.pm view on Meta::CPAN
sub handle_resize {
my $self = shift;
$self->SUPER::handle_resize;
$self->render;
$self->update_screen;
}
sub jump_to_toc {
my $self = shift;
if ( $self->epub->toc ) {
$self->set_chapter( $self->epub->toc );
$self->update_screen;
}
return;
}
sub open_image {
my ( $self, $path ) = @_;
my $tmp = tempfile;
my $filename =
Mojo::Path->new( $self->chapters->[ $self->chapter ]->filename );
$path = $filename->merge($path)->canonicalize;
$self->epub->archive->extractMember( $path->to_string, $tmp->to_string );
system( 'xdg-open', $tmp );
return;
}
sub open_link {
my $self = shift;
if ( $self->prefix ) {
my ( $type, $href ) = @{ $self->hrefs->[ $self->prefix - 1 ] || [] };
return if !$href;
if ( $type eq 'img' ) {
endwin;
$self->open_image( Mojo::Path->new($href) );
$self->update_screen;
return;
}
my $url = Mojo::URL->new($href);
if ( my $scheme = $url->scheme ) {
endwin;
system( 'xdg-open', $url->to_string );
$self->update_screen;
return;
}
my $path = $url->path;
my $current_chapter = $self->chapters->[ $self->chapter ];
$path = Mojo::Path->new( $current_chapter->filename )->merge($path);
for ( my $i = 0 ; $i < @{ $self->chapters } ; $i++ ) {
my $chapter = $self->chapters->[$i];
if ( $chapter->filename eq $path ) {
$self->set_chapter($i);
if ( my $fragment = $url->fragment ) {
if ( my $line = $self->id_line->{$fragment} ) {
$self->line($line);
}
}
$self->update_screen;
return;
}
}
}
return;
}
sub help_screen {
my $self = shift;
my @keys = sort keys %{ $self->key_bindings };
my $length = 0;
for my $key (@keys) {
my $str = $keycodes{$key} || $key;
$length = length($str) if length($str) > $length;
}
my $content;
for my $key (@keys) {
next if $key eq '' . Curses::KEY_RESIZE;
$content .= sprintf "%-*s = %s\n", $length, $keycodes{$key} || $key,
$self->key_bindings->{$key};
}
App::termpub::Pager::Text->new( content => $content )->render->run;
$self->update_screen;
}
sub set_chapter {
my ( $self, $num, $history ) = @_;
return if !$self->chapters->[$num];
if ( !$history ) {
if ( $self->history_index != 0 ) {
splice @{ $self->history }, 0, $self->history_index, $num;
}
else {
unshift @{ $self->history }, $num;
}
$self->history_index(0);
}
$self->chapter($num);
$self->render;
$self->title( $self->chapters->[$num]->title );
$self->set_mark;
$self->line(0);
return;
}
sub history_back {
my $self = shift;
return if !$self->history->[ $self->history_index + 1 ];
$self->history_index( $self->history_index + 1 );
$self->set_chapter( $self->history->[ $self->history_index ], 1 );
$self->update_screen;
return;
}
( run in 3.196 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )