LinkEmbedder
view release on metacpan or search on metacpan
lib/LinkEmbedder/Link/Github.pm view on Meta::CPAN
package LinkEmbedder::Link::Github;
use Mojo::Base 'LinkEmbedder::Link';
use Mojo::Util qw(html_unescape trim);
use constant DEBUG => $ENV{LINK_EMBEDDER_DEBUG} || 0;
has provider_name => 'GitHub';
has provider_url => sub { Mojo::URL->new('https://github.com') };
sub learn_p {
my $self = shift;
return $self->url =~ m!gist\.github\.com/(.+)! ? $self->_learn_from_gist_p($1) : $self->SUPER::learn_p;
}
sub _learn_from_dom {
my ($self, $dom) = @_;
my $e;
$self->SUPER::_learn_from_dom($dom);
# Sometimes the og:title is less informative than <title>
$e = $dom->at('title');
$self->title($e->all_text) if $e and length($e->all_text) > length($self->title);
# Pages with readme
$e = $dom->find('#readme p');
$self->_learn_from_readme($e) if $e;
# Pages with source code
$e = $dom->find('table.highlight');
$self->_learn_from_code($e->first, $dom) if $e->size == 1;
# Clean up title
my $title = $self->title;
$title =~ s!^\s*GitHub\W+!!si;
$title =~ s![^\w\)\]\}]+GitHub\s*$!!si;
$self->title($title);
}
sub _learn_from_code {
my ($self, $e, $dom) = @_;
my $selector = '';
# Handle line number possibly with range
my $fragment = $self->url->fragment;
if ($fragment =~ /L(\d+)(?:-L(\d+))?/) {
my $from = $1;
my $to = $2 // $from + 10;
$selector .= '.blob-num:is(' . join(', ', map {qq([data-line-number="$_"])} $from .. $to) . ') + ';
}
$selector .= '.blob-code';
return unless my @code = $e->find($selector)->map('all_text')->each;
$self->{paste} = join '', map { $_ .= "\n" unless /\n$/; $_ } @code;
$self->template->[1] = 'paste.html.ep';
if ($e = $dom->at('#blob-path')) {
$self->title(trim html_unescape $e->all_text) if $e->all_text;
}
}
sub _learn_from_gist_p {
my ($self, $gist_id) = @_;
my @gist_id = split '/', $gist_id;
( run in 1.240 second using v1.01-cache-2.11-cpan-71847e10f99 )