diff --git a/mark-yank-urls b/mark-yank-urls index 831f95e..3fcbccc 100644 --- a/mark-yank-urls +++ b/mark-yank-urls @@ -7,10 +7,37 @@ use strict; use warnings; my $url_matcher = qr{( - (?:https?://|ftp://|news://|mailto:|file://|www\.)[ab-zA-Z0-9\-\@;\/?:&=%\$_.+!*\x27(),~#]+ - [ab-zA-Z0-9\-\@;\/?&=%\$_+!*\x27()~] # exclude some trailing characters (heuristic) -)}x; + \b + (?: + [a-z][a-z0-9+]+:// | # scheme + www\. # or www. subdomain + ) + [\[\]a-z0-9\@:;.-]* # hostname + (?: + /[a-z0-9.,:;~\@?\$\&()/=#%+!*_-]* # path (and query string etc) + )? + (? 'x-www-browser', + https => 'x-www-browser', + ftp => 'x-www-browser', +); + +sub scheme { + my $uri = shift; + my ($scheme) = $uri =~ m|^([^:]+)://|; + return $scheme; +} + +sub get_handler { + my $uri = shift; + my $scheme = scheme($uri); + $scheme = 'http' if not $scheme and $uri =~ /^www\./; + return $handlers{$scheme}; +} sub on_start { my ($term) = @_; @@ -20,15 +47,11 @@ sub on_start { import Clipboard; } - eval { require Regexp::Common::URI }; - if(!$@) { - require Regexp::Common; - Regexp::Common->import('URI'); - - $url_matcher = $Regexp::Common::RE{URI}{HTTP}; - } - - $term->{browser} = $term->x_resource ("urlLauncher") || "x-www-browser"; + if (my $browser = $term->x_resource ('urlLauncher')) { + $handlers{http} = $browser; + $handlers{https} = $browser; + $handlers{ftp} = $browser; + } () } @@ -77,10 +100,11 @@ sub on_button_release { while ($text =~ /($url_matcher)/g) { my ($url, $first, $last) = ($1, $-[1], $+[1]); + my $handler = get_handler($url); - if($first <= $col && $last >= $col) { + if($handler and $first <= $col && $last >= $col) { $url =~ s/["']$//; - $term->exec_async($term->{browser}, $url); + $term->exec_async($handler, $url); return 1; } } @@ -171,7 +195,8 @@ sub on_key_release { } elsif ($keysym == 65293) { # my $url = get_active_url($term); - $term->exec_async($term->{browser}, $url); + my $handler = get_handler($url); + $term->exec_async($handler, $url) if $handler; deactivate_mark_mode ($term); return 1;