package App::Mobirc::Plugin::MessageBodyFilter::Clickable; # vim:expandtab: use strict; use MooseX::Plaggerize::Plugin; use URI::Find; use URI::Escape; use HTML::Entities; use App::Mobirc::Util; @URI::tel::ISA = qw( URI ); has accept_schemes => ( is => 'ro', isa => 'ArrayRef', ); has http_link_string => ( is => 'ro', isa => 'Str', ); has http_link_target => ( is => 'ro', isa => 'Str', default => '_blank', ); has redirector => ( is => 'ro', isa => 'Str', ); has au_pcsv => ( is => 'ro', isa => 'Bool', ); has pocket_hatena => ( is => 'ro', isa => 'Bool', ); has google_gwt => ( is => 'ro', isa => 'Bool', ); hook message_body_filter => sub { my ( $self, $global_context, $text ) = @_; my $as = $self->accept_schemes; my $link_string_table = {}; if (!$as || grep { $_ eq "tel" } @$as) { $text =~ s{\b(?:tel:)?(0\d{1,3})([-(]?)(\d{2,4})([-)]?)(\d{4})\b}{ my $ret = "tel:$1$3$5"; $link_string_table->{$ret} = $&; $ret; }eg; } if (!$as || grep { $_ eq "mailto" } @$as) { $text =~ s{\b(?:mailto:)?(\w[\w.+=-]+\@[\w.-]+[\w]\.[\w]{2,4})\b}{ my $ret = "mailto:$1"; $link_string_table->{$ret} = $&; $ret; }eg; } URI::Find->new( sub { my ( $uri, $orig_uri ) = @_; if ($self->accept_schemes && !(grep { $_ eq $uri->scheme } @$as)) { return $orig_uri; } return ($self->can("process_" . $uri->scheme) || \&process_default)->($self, $uri, $orig_uri, $link_string_table); } )->find( \$text ); return $text; }; sub process_http { my ( $self, $uri, $orig_uri ) = @_; my $out = ""; my $link_string = $orig_uri; if ( $self->http_link_string ) { $link_string =$self->http_link_string; $link_string =~ s{\$(\w+)}{ $uri->$1; }eg } $link_string = encode_entities(uri_unescape($link_string), q(<>&")); my $encoded_uri = encode_entities($uri, q(<>&")); if ( $self->redirector ) { $out = sprintf( '%s', encode_entities($self->redirector, q(<>&")), $encoded_uri, $self->http_link_target, $link_string ); } else { $out = sprintf( '%s', $encoded_uri, $self->http_link_target, $link_string ); } if ( $self->au_pcsv ) { $out .= sprintf( '[PCSV]', $encoded_uri, $self->http_link_target ); } if ( $self->pocket_hatena ) { $out .= sprintf( '[ph]', uri_escape($uri), $self->http_link_target ); } if ( $self->google_gwt ) { $out .= sprintf( '[gwt]', uri_escape($uri), $self->http_link_target ); } return U $out; } sub process_default { my ( $self, $uri, $orig_uri, $link_string_table ) = @_; my $link_string = $orig_uri; if ( $link_string_table->{$orig_uri} ) { $link_string = $link_string_table->{$orig_uri}; } return sprintf( qq{%s}, encode_entities($uri, q(<>&")), $self->http_link_target, encode_entities($link_string, q(<>&")), ); } 1;