# Paste script for irssi
# (C) Simon Huggins 2002
# [email protected]
# Reformat pasted text ready to paste onto channels.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc., 59
# Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
use strict;
use vars qw($VERSION %IRSSI);
use Irssi 20020217.1542 (); # Version 0.8.1
$VERSION = "0.5";
%IRSSI = (
authors => "Simon Huggins",
contact => "huggie-irssi\@earth.li",
name => "Paste",
description => "Paste reformats long pieces of text typically pasted into your client from webpages so that they fit nicely into your channel. Width of client may be specified",
license => "GPLv2",
url => "http://the.earth.li/~huggie/irssi/",
changed => "Sat Mar 9 10:59:49 GMT 2002",
);
use Irssi::Irc;
use Text::Wrap;
use Text::Tabs;
use POSIX qw(strftime);
=pod
=head1 paste.pl
B - a script for irssi to manage reformatting before pasting to channels
To stop people pasting from webpages with very poor formatting this script
allows you to reformat as you paste.
=head1 USAGE
Load the script then create a new unused window and paste your text into it.
The defaults should be reasonable so then B will paste it in the
current window (either by saying it to the current channel, msging it to the
current recipient in a query window or by printing it up as client messages
in a blank window).
Try altering I (0 is the autoformatted default based on your
nick length) to affect the width of the pasted text.
Alter I to change the prefix added to each line (B to remove it altogether).
Set I to show the lines pasted into the buffer as you paste it.
=head1 AUTHOR
Send suggestions to Simon Huggins
=cut
my $pastewin;
BEGIN {
$pastewin = Irssi::window_find_name('paste');
if (!$pastewin) {
Irssi::command("window new hide");
Irssi::command("window name paste");
$pastewin = Irssi::window_find_name('paste');
}
$pastewin->print(">>> Paste your buffer here to start <<<");
}
Irssi::settings_add_bool("paste","paste_showbuf",0);
Irssi::settings_add_int("paste","paste_width",0);
Irssi::settings_add_str("paste","paste_prefix",">> ");
{
my @buffer;
my $buf=0;
my $last_ts;
sub event_send_text {
my ($line, $server, $windowitem) = @_;
return if $windowitem;
if ($last_ts < (time() - 60)) {
@buffer=();
$buf= 0;
$pastewin->print("Buffer cleared!");
}
$line =~ s/^\s+/ /;
$line =~ s/\s+$/ /;
$buffer[$buf] .= $line." ";
if (!$line and $buffer[$buf] ne "") {
$buf++;
}
if (Irssi::settings_get_bool("paste_showbuf")) {
$pastewin->print($line,MSGLEVEL_CLIENTCRAP);
}
$last_ts = time();
Irssi::signal_stop();
}
sub paste {
my ($data, $server, $witem) = @_;
my $offset;
if (!$buf and $buffer[0] eq "") {
$pastewin->print("No buffer to paste!",MSGLEVEL_HILIGHT);
return;
}
my $anyoldwin = Irssi::active_win();
my $width = Irssi::settings_get_int("paste_width");
my $prefix = Irssi::settings_get_str("paste_prefix");
my $prefixlen = length($prefix);
if ($width > 0) {
if ($width < 3+$prefixlen) {
$pastewin->print("paste_width is too small ($width<".
(3+$prefixlen).")!",
MSGLEVEL_HILIGHT);
return;
}
$Text::Wrap::columns = $width;
} else {
if ($server->{nick}) {
$offset+=length($server->{nick})+$prefixlen+15;
}
$Text::Wrap::columns = $anyoldwin->{'width'} - $offset;
if ($Text::Wrap::columns < 3+$prefixlen) {
$pastewin->print("Width would be too small (".
$Text::Wrap::columns."<".
(3+$prefixlen).", window width was ".
$anyoldwin->{'width'}.
")!",
MSGLEVEL_HILIGHT);
return;
}
}
foreach my $outbuffer (@buffer) {
$outbuffer =~ s/^\s*//;
$outbuffer =~ s/\s*$//;
$outbuffer = wrap("","", $outbuffer);
$outbuffer = expand($outbuffer);
if ($witem) {
foreach (split '\n', $outbuffer) {
$witem->command("say ".$prefix.$_);
}
} else {
foreach (split '\n', $outbuffer) {
$anyoldwin->print($prefix.$_, MSGLEVEL_HILIGHT);
}
}
}
}
sub clear_buffer {
@buffer = ();
$buf = 0;
$pastewin->print("Buffer cleared!");
}
}
Irssi::signal_add_first("send text", "event_send_text");
Irssi::command_bind("paste", "paste");
Irssi::command_bind("clear_buffer", "clear_buffer");