scripts/escape.pl


# Usage: 
#  Do /escape (or /esc) just like you would use /lastlog
#  this then prints the lines, which you can use in /eval.
#  see /help lastlog for options
#
# For example:
#  <someone> Hey! join #fooX (where X is some char you can't copy-paste)
#  then you do /esc #foo
#  and you'll get something like 19:50 \x048/<\x04g \x04gsomeone\x04g\x048/>\x04g \x04ehey! join #foo\x12
#  ignore the stuff in the first part of the message, that's irssi's internal color format for the line printed.
#  doing /eval join #foo\x12 will make you join the right channel
#  /esc -clear makes your scrollback clean again

use Irssi;
use strict;
use vars qw($VERSION %IRSSI);
$VERSION = '1.0';
%IRSSI = (
	authors => 'Wouter Coekaerts',
	contact => 'wouter@coekaerts.be, coekie@#irssi',
	name => 'escape',
	description => 'displays lines in your scrollback in escaped form, so you can copy and paste them including colors and special characters',
	license => 'GPL v2',
	url => 'http://wouter.coekaerts.be/irssi/',
);

sub escape {
	my ($text) = @_;
	$text =~ s/(.)/escape_char($1)/eg;
	return $text;
}

sub escape_char {
	my ($char) = @_;
	my $ord = ord($char);
	if ($char eq '\\' || $char eq '$' || $char eq ';') {
		return "\\$char";
	} elsif ($ord < 32 || $ord > 126) {
		return '\\x' . sprintf("%02x", ord($char));
	} else {
		return $char;
	}
}

Irssi::command_bind("escape", sub {
	my ($data, $server, $item) = @_;
	my $context = $item ? $item : Irssi::active_win;

	Irssi::signal_add_first('print text', 'sig_print_text');
	$context->command("lastlog $data");
	Irssi::signal_remove('print text', 'sig_print_text');
});

sub sig_print_text {
	my ($dest, $text, $stripped_text) = @_;
	$_[1] = escape($text);
	Irssi::signal_continue(@_);
}