1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#! /usr/bin/perl -w
# example of how to call an appropriate viewer
#
# URLs must start with a scheme and shell metas should be already quoted
# (tin doesn't recognize URLs without a scheme and it quotes the metas)
use strict;
use warnings;
(my $pname = $0) =~ s#^.*/##;
die "Usage: $pname URL" if $#ARGV != 0;
# version Number
my $version = "0.1.2";
my ($method, $url, $match, @try);
$method = $url = $ARGV[0];
$method =~ s#^([^:]+):.*#$1#io;
# shell escape
$url =~ s#([\&\;\`\'\\\"\|\*\?\~\<\>\^\(\)\[\]\{\}\$\010\013\020\011])#\\$1#g;
if ($ENV{"BROWSER_".uc($method)}) {
push(@try, split(/:/, $ENV{"BROWSER_".uc($method)}));
} else {
if ($ENV{BROWSER}) {
push(@try, split(/:/, $ENV{BROWSER}));
} else { # set some defaults
push(@try, 'firefox -a firefox -remote openURL\(%s\)');
push(@try, 'mozilla -remote openURL\(%s\)');
push(@try, 'opera -remote openURL\(%s\)');
push(@try, qw(chromium 'galeon -n' 'epiphany -n' konqueror));
push(@try, 'lynx'); # prefer lynx over links as it can handle news:-urls
push(@try, qw('links2 -g' links w3m surf arora));
push(@try, 'kfmclient newTab'); # has no useful return-value on error
push(@try, 'xdg-open'); # xdg-open evaluates $BROWSER which is unset
}
}
for my $browser (@try) {
# ignore empty parts
next if ($browser =~ m/^$/o);
# expand %s if not preceded by odd number of %
$match = $browser =~ s/(?<!%)((?:%%)*)%s/$1$url/og;
# expand %c if not preceded by odd number of %
$browser =~ s/(?<!%)((?:%%)*)%c/$1:/og;
# reduce dubble %
$browser =~ s/%%/%/og;
# append URL if no %s expansion took place
$browser .= " ".$url if (!$match);
# leave loop if $browser was started successful
last if (system("$browser 2>/dev/null") == 0);
}
exit 0;
__END__
=head1 NAME
url_handler.pl - Spawn appropriate viewer for a given URL
=head1 SYNOPSIS
B<url_handler.pl> I<URL>
=head1 DESCRIPTION
B<url_handler.pl> takes an URL as argument and spawns the first executable
viewer found in either B<$BROWSER_I<SCHEME>> or B<$BROWSER>.
=head1 ENVIRONMENT
=over 4
=item B<$BROWSER_I<SCHEME>>
=back
The user's preferred utility to browse URLs of type I<SCHEME>. May actually
consist of a sequence of colon-separated browser commands to be tried in
order until one succeeds. If a command part contains %s, the URL is
substituted there, otherwise the browser command is simply called with the
URL as its last argument. %% is replaced by a single percent sign (%), and
%c is replaced by a colon (:).
Examples:
=over 2
=item $BROWSER_FTP="wget:ncftp"
=item $BROWSER_GOPHER="lynx:links"
=item $BROWSER_MAILTO="mutt:pine -url"
=item $BROWSER_NEWS="lynx"
=item $BROWSER_NNTP="lynx"
=back
Z<>
=over 4
=item B<$BROWSER>
=back
The user's preferred utility to browse URLs for which there is no special
viewer defined via B<$BROWSER_I<SCHEME>>. Again it may actually consist of a
sequence of colon-separated browser commands to be tried in order until one
succeeds. If a command part contains %s, the URL is substituted there,
otherwise the browser command is simply called with the URL as its last
argument. %% is replaced by a single percent sign (%), and %c is replaced
by a colon (:).
Examples:
=over 2
=item $BROWSER="firefox -a firefox -remote openURL\(%s\):opera:konqueror:links2 -g:lynx:w3m"
=back
=head1 SECURITY
B<url_handler.pl> was designed to work together with B<tin>(1) which only
issues shell escaped absolute URLs thus B<url_handler.pl> does not try hard
to shell escape its input nor does it convert relative URLs into absolute
ones! If you use B<url_handler.pl> from other applications be sure to at
least shell escaped its input!
=head1 AUTHOR
Urs Janssen E<lt>urs@tin.orgE<gt>
=head1 SEE ALSO
http://www.catb.org/~esr/BROWSER/
http://www.dwheeler.com/browse/secure_browser.html
=cut
|