summaryrefslogtreecommitdiffstats
path: root/scripts/url.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/url.pl')
-rw-r--r--scripts/url.pl329
1 files changed, 329 insertions, 0 deletions
diff --git a/scripts/url.pl b/scripts/url.pl
new file mode 100644
index 0000000..a9b6b46
--- /dev/null
+++ b/scripts/url.pl
@@ -0,0 +1,329 @@
+# $Id: url.pl,v 1.52 2002/11/21 06:04:52 jylefort Exp $
+
+use Irssi 20020121.2020 ();
+$VERSION = "0.54";
+%IRSSI = (
+ authors => 'Jean-Yves Lefort',
+ contact => 'jylefort\@brutele.be, decadix on IRCNet',
+ name => 'url',
+ description => 'An URL grabber for Irssi',
+ license => 'BSD',
+ url => 'http://void.adminz.be/',
+ changed => '$Date: 2002/11/21 06:04:52 $ ',
+);
+
+# description:
+#
+# url.pl grabs URLs in messages and allows you to open them on the fly,
+# or to write them in a HTML file and open that file.
+#
+# /set's:
+#
+# url_grab_level
+#
+# message levels to take in consideration
+# example: PUBLICS ACTIONS
+#
+# url_redundant
+#
+# whether to grab same URLs multiple times or not
+# example: ON
+#
+# url_verbose_grab
+#
+# whether to grab verbosely or not
+# example: OFF
+#
+# url_hilight
+#
+# whether to hilight the URLs in the text or not
+# example: OFF
+#
+# url_index_color
+#
+# hilight index color (mirc color string)
+#
+# url_color
+#
+# hilight URL color (mirc color string)
+#
+# browse_command
+#
+# a command used to open URLs
+# %u will be replaced by the URL
+# example: galeon %u &
+#
+# url_file
+#
+# where to write the URL list
+# example: ~/.irssi-urls.html
+#
+# commands
+#
+# /URL [-clear|<number>]
+#
+# -clear will clear the URL list.
+#
+# <number> will open the specified URL.
+#
+# If no arguments are specified, a HTML file containing all
+# grabbed URLs will be written and opened.
+#
+# changes:
+#
+# 2002-11-21 release 0.54
+# * added a DTD to the generated HTML file, suggested
+# by Hugo Haas <hugo@larve.net>
+#
+# 2002-11-19 release 0.53
+# * eh yes, once again a better regexp by
+# Hugo Haas <hugo@larve.net>
+#
+# 2002-11-06 release 0.52
+# * yet another regexp correction, again by
+# Hugo Haas <hugo@larve.net>
+#
+# 2002-10-23 release 0.51
+# * URI regexp corrected by Hugo Haas <hugo@larve.net>
+#
+# 2002-09-26 release 0.50
+# * entirely rewritten; the previous template bloatness
+# has been dropped to get back to a simpler concept
+#
+# 2002-07-04 release 0.47
+# * signal_add's uses a reference instead of a string
+#
+# 2002-03-11 release 0.46
+# * fixed an oblivion in the documentation
+#
+# 2002-02-14 release 0.45
+# * replaced theme capability by /set url_color,
+# fixing a bug in the URL hilighting
+#
+# 2002-02-09 release 0.44
+# * 0.43 didn't grabbed anything: fixed
+#
+# 2002-02-09 release 0.43
+# * url_hilight was _still_ causing an infinite loop
+# under certain conditions: fixed
+# * URLs found at the start of a message were
+# hilighted wrongly: fixed
+#
+# 2002-02-09 release 0.42
+# * if url_hilight was enabled, an infinite loop was
+# caused while printing the hilighted message: fixed
+#
+# 2002-02-08 release 0.41
+# * safer percent substitutions
+# * improved URL regexp
+#
+# 2002-02-08 release 0.40
+# * added /URL -create command
+# * added url_hilight setting
+#
+# 2002-02-01 release 0.34
+# * more precise URL regexp
+#
+# 2002-02-01 release 0.33
+# * added /URL - command
+# * added url_redundant setting
+#
+# 2002-02-01 release 0.32
+# * some little improvements made in the URL regexp
+#
+# 2002-01-31 release 0.31
+# * oops, '<@idiot> I am really stupid' was grabbed coz
+# the '@' mode char trigerred the email regexp
+#
+# 2002-01-31 release 0.30
+# * major update: not HTML-oriented anymore; can generate
+# any type of text file by the use of template files
+#
+# 2002-01-28 release 0.23
+# * changes in url_item and url_item_timestamp_format
+# settings will now be seen immediately
+# * "Added item #n in URL list" is now printed after
+# the grabbed message
+#
+# 2002-01-28 release 0.22
+# * messages are now saved as they were printed in irssi
+# * removed %n format of url_item
+#
+# 2002-01-27 release 0.21
+# * uses builtin expand
+#
+# 2002-01-27 release 0.20
+# * added a %s format to url_item
+# * changed the %d format of url_page to %s
+# * added url_{page|item}_timestamp_format settings
+# * reworked the documentation
+#
+# 2002-01-25 release 0.12
+# * added url_verbose_grab_setting
+#
+# 2002-01-24 release 0.11
+# * now handles actions correctly
+#
+# 2002-01-23 initial release
+#
+# todo:
+#
+# * also hilight redundant URLs
+# * open URLs with alternate programs
+# * add a 'url_grab_own_messages' setting
+
+use strict;
+use POSIX qw(strftime);
+
+use constant MSGLEVEL_NO_URL => 0x0400000;
+
+my @items;
+
+# -verbatim- import expand
+sub expand {
+ my ($string, %format) = @_;
+ my ($len, $attn, $repl) = (length $string, 0);
+
+ $format{'%'} = '%';
+
+ for (my $i = 0; $i < $len; $i++) {
+ my $char = substr $string, $i, 1;
+ if ($attn) {
+ $attn = undef;
+ if (exists($format{$char})) {
+ $repl .= $format{$char};
+ } else {
+ $repl .= '%' . $char;
+ }
+ } elsif ($char eq '%') {
+ $attn = 1;
+ } else {
+ $repl .= $char;
+ }
+ }
+
+ return $repl;
+}
+# -verbatim- end
+
+sub print_text {
+ my ($textdest, $text, $stripped) = @_;
+
+ if (! ($textdest->{level} & MSGLEVEL_NO_URL)
+ && (Irssi::level2bits(Irssi::settings_get_str('url_grab_level'))
+ & $textdest->{level})
+ && ($stripped =~ /[a-zA-Z0-9+-.]+:\/\/[^ \t\<\>\"]+/o)) {
+
+ if (! Irssi::settings_get_bool('url_redundant')) {
+ foreach (@items) { return if ($_->{url} eq $&) }
+ }
+
+ push @items,
+ {
+ time => time,
+ target => $textdest->{target},
+ pre_url => $`,
+ url => $&,
+ post_url => $'
+ };
+
+ if (Irssi::settings_get_bool('url_hilight')) {
+ my $url_pos = index $text, $&;
+ $textdest->{level} |= MSGLEVEL_NO_URL;
+ Irssi::signal_emit('print text', $textdest,
+ substr($text, 0, $url_pos) .
+ Irssi::settings_get_str('url_index_color') . @items . ':' .
+ Irssi::settings_get_str('url_color') . $& . '' .
+ substr($text, $url_pos + length $&),
+ $stripped);
+ Irssi::signal_stop();
+ }
+
+ Irssi::print('Added item #' . @items . ' to URL list')
+ if Irssi::settings_get_bool('url_verbose_grab');
+ }
+}
+
+sub write_file {
+ my $file = shift;
+
+ open(FILE, ">$file") or return $!;
+
+ print FILE <<'EOF' or return $!;
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>IRC URL list</title>
+ </head>
+ <body>
+ <center>
+ <table border="1" cellpadding="5">
+ <caption>IRC URL list</caption>
+ <tr><th>time<th>target<th>message</tr>
+EOF
+
+ foreach (@items) {
+ my $timestamp = strftime('%c', localtime $_->{time});
+ print FILE " <tr><td>$timestamp<td>$_->{target}<td>$_->{pre_url}<a href=\"$_->{url}\">$_->{url}</a>$_->{post_url}</tr>\n" or return $!;
+ }
+
+ print FILE <<'EOF' or return $!;
+ </table>
+ </center>
+ <hr>
+ <center><small>Generated by url.pl</small>
+ </body>
+</html>
+EOF
+
+ close(FILE) or return $!;
+
+ return undef;
+}
+
+sub url {
+ my ($args, $server, $item) = @_;
+ my ($file) = glob Irssi::settings_get_str('url_file');
+ my $command = Irssi::settings_get_str('browse_command');
+
+ if ($args ne '') {
+ if (lc $args eq '-clear') {
+ @items = ();
+ Irssi::print('URL list cleared');
+ } elsif ($args =~ /^[0-9]+$/) {
+ if ($args > 0 && $items[$args - 1]) {
+ system(expand($command, 'u', $items[$args - 1]->{url}));
+ } else {
+ Irssi::print("URL #$args not found");
+ }
+ } else {
+ Irssi::print('Usage: /URL [-clear|<number>]', MSGLEVEL_CLIENTERROR);
+ }
+ } else {
+ if (@items) {
+ my $error;
+ if ($error = write_file($file)) {
+ Irssi::print("Unable to write $file: $error", MSGLEVEL_CLIENTERROR);
+ } else {
+ system(expand($command, 'u', $file));
+ }
+ } else {
+ Irssi::print('URL list is empty');
+ }
+ }
+}
+
+Irssi::settings_add_str('misc', 'url_grab_level',
+ 'PUBLIC TOPICS ACTIONS MSGS DCCMSGS');
+Irssi::settings_add_bool('lookandfeel', 'url_verbose_grab', undef);
+Irssi::settings_add_bool('lookandfeel', 'url_hilight', 1);
+Irssi::settings_add_str('lookandfeel', 'url_index_color', '08');
+Irssi::settings_add_str('lookandfeel', 'url_color', '12');
+Irssi::settings_add_bool('misc', 'url_redundant', 0);
+Irssi::settings_add_str('misc', 'browse_command',
+ 'galeon-wrapper %u >/dev/null &');
+Irssi::settings_add_str('misc', 'url_file', '~/.irc_url_list.html');
+
+Irssi::signal_add('print text', \&print_text);
+
+Irssi::command_bind('url', \&url);