From d86eb93366df577f6a6bdaef0032ee9ee9cf10b4 Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Thu, 16 Sep 2010 15:27:29 +0100 Subject: modified it to use DaringFireball liberal uri match rather than re::common to handle more cases --- tinyurl-tabcomplete/complete-tiny-url.pl | 45 +++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'tinyurl-tabcomplete') diff --git a/tinyurl-tabcomplete/complete-tiny-url.pl b/tinyurl-tabcomplete/complete-tiny-url.pl index def9440..e3100e4 100644 --- a/tinyurl-tabcomplete/complete-tiny-url.pl +++ b/tinyurl-tabcomplete/complete-tiny-url.pl @@ -2,7 +2,6 @@ use strict; use vars qw($VERSION %IRSSI); use Irssi; -use Regexp::Common qw/URI/; use WWW::Shorten::TinyURL; $VERSION = '2.1'; @@ -17,13 +16,53 @@ $VERSION = '2.1'; sub do_complete { my ($strings, $window, $word, $linestart, $want_space) = @_; return if $word eq ''; - if ($word =~ m/$RE{URI}{HTTP}{-keep}/) { - my $uri = makeashorterlink($1); + if (defined (my $found_uri = match_uri($word))) { + my $uri = makeashorterlink($found_uri); push @$strings, $uri if $uri; $$want_space = 1; Irssi::signal_stop(); } } +sub match_uri { + my $text = shift; + + my $regex = qr((?xi) +\b +( # Capture 1: entire matched URL + (?: + [a-z][\w-]+: # URL protocol and colon + (?: + /{1,3} # 1-3 slashes + | # or + [a-z0-9%] # Single letter or digit or '%' + # (Trying not to match e.g. "URI::Escape") + ) + | # or + www\d{0,3}[.] # "www.", "www1.", "www2." … "www999." + | # or + [a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash + ) + (?: # One or more: + [^\s()<>]+ # Run of non-space, non-()<> + | # or + \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels + )+ + (?: # End with: + \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels + | # or + [^\s`!()\[\]{};:'".,<>?«»“”‘’] # not a space or one of these punct chars + ) +)); + + if ($text =~ $regex) { + my $uri = $1; + $uri = 'http://' . $uri if $uri !~ m(http://); + return $uri; + } else { + return ''; + } +} + Irssi::signal_add_first( 'complete word', \&do_complete); -- cgit v1.2.3