summaryrefslogtreecommitdiffstats
path: root/scripts/log2ansi.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/log2ansi.pl')
-rw-r--r--scripts/log2ansi.pl253
1 files changed, 253 insertions, 0 deletions
diff --git a/scripts/log2ansi.pl b/scripts/log2ansi.pl
new file mode 100644
index 0000000..42e92d4
--- /dev/null
+++ b/scripts/log2ansi.pl
@@ -0,0 +1,253 @@
+#! /usr/bin/perl
+#
+# $Id: log2ansi,v 1.9 2004/03/08 21:31:26 peder Exp $
+#
+# Copyright (C) 2002, 2003 by Peder Stray <peder@ninja.no>
+#
+# This is a standalone perl program and not intended to run within
+# irssi, it will complain if you try to...
+
+use strict;
+use Getopt::Long;
+use vars qw(%ansi %base %attr %old);
+use vars qw(@bols @nums @mirc @irssi @mc @mh @ic @ih);
+
+use vars qw{$VERSION %IRSSI};
+($VERSION) = '$Revision: 1.9 $' =~ / (\d+\.\d+) /;
+%IRSSI = (
+ name => 'log2ansi',
+ authors => 'Peder Stray',
+ contact => 'peder@ninja.no',
+ url => 'http://ninja.no/irssi/log2ansi',
+ license => 'GPL',
+ description => 'convert mirc color and irssi interal formatting to ansi colors, useful for log filtering',
+ );
+
+if (__PACKAGE__ =~ /^Irssi/) {
+ # we are within irssi... die!
+ Irssi::print("%RWarning:%n log2ansi is should not run from within irssi");
+ die "Suicide to prevent loading\n";
+}
+
+my $clear = 0;
+
+GetOptions(
+ '--clear!' => \$clear,
+ );
+
+for (@ARGV) {
+ if (/\.bz2$/) {
+ $_ = "bunzip2 < '$_' |";
+ } elsif (/\.gz$/) {
+ $_ = "gunzip < '$_' |";
+ }
+}
+
+my($n) = 0;
+%ansi = map { $_ => $n++ } split //, 'krgybmcw';
+
+@bols = qw(bold underline blink reverse fgh bgh);
+@nums = qw(fgc bgc);
+
+@base{@bols} = qw(1 4 5 7 1 5);
+@base{@nums} = qw(30 40);
+
+@mirc = split //, 'WkbgRrmyYGcCBMKw';
+@irssi = split //, 'kbgcrmywKBGCRMYW';
+
+@mc = map {$ansi{lc $_}} @mirc;
+@mh = map {$_ eq uc $_} @mirc;
+
+@ic = map {$ansi{lc $_}} @irssi;
+@ih = map {$_ eq uc $_} @irssi;
+
+sub defc {
+ my($attr) = shift || \%attr;
+ $attr->{fgc} = $attr->{bgc} = -1;
+ $attr->{fgh} = $attr->{bgh} = 0;
+}
+
+sub defm {
+ my($attr) = shift || \%attr;
+ $attr->{bold} = $attr->{underline} =
+ $attr->{blink} = $attr->{reverse} = 0;
+}
+
+sub def {
+ my($attr) = shift || \%attr;
+ defc($attr);
+ defm($attr);
+}
+
+sub setold {
+ %old = %attr;
+}
+
+sub emit {
+ my($str) = @_;
+ my(%elem,@elem);
+
+ my(@clear) = ( (grep { $old{$_} > $attr{$_} } @bols),
+ (grep { $old{$_}>=0 && $attr{$_}<0 } @nums)
+ );
+
+ $elem{0}++ if @clear;
+
+ for (@bols) {
+ $elem{$base{$_}}++
+ if $attr{$_} && ($old{$_} != $attr{$_} || $elem{0});
+ }
+
+ for (@nums) {
+ $elem{$base{$_}+$attr{$_}}++
+ if $attr{$_} >= 0 && ($old{$_} != $attr{$_} || $elem{0});
+ }
+
+ @elem = sort {$a<=>$b} keys %elem;
+
+ if (@elem) {
+ @elem = () if @elem == 1 && !$elem[0];
+ printf "\e[%sm", join ";", @elem
+ unless $clear;
+ }
+
+ print $str;
+
+ setold;
+}
+
+while (<>) {
+ chomp;
+ def;
+ setold;
+
+ while (length) {
+ if (s/^\cB//) {
+ # toggle bold
+ $attr{bold} = !$attr{bold};
+
+ } elsif (s/^\cC//) {
+ # mirc colors
+
+ if (/^[^\d,]/) {
+ defc;
+ } else {
+
+ if (s/^(\d\d?)//) {
+ $attr{fgc} = $mc[$1 % 16];
+ $attr{fgh} = $mh[$1 % 16];
+ }
+
+ if (s/^,//) {
+ if (s/^(\d\d?)//) {
+ $attr{bgc} = $mc[$1 % 16];
+ $attr{bgh} = $mh[$1 % 16];
+ } else {
+ $attr{bgc} = -1;
+ $attr{bgh} = 0;
+ }
+ }
+ }
+
+ } elsif (s/^\cD//) {
+ # irssi format
+
+ if (s/^a//) {
+ $attr{blink} = !$attr{blink};
+ } elsif (s/^b//) {
+ $attr{underline} = !$attr{underline};
+ } elsif (s/^c//) {
+ $attr{bold} = !$attr{bold};
+ } elsif (s/^d//) {
+ $attr{reverse} = !$attr{reverse};
+ } elsif (s/^e//) {
+ # indent
+ } elsif (s/^f([^,]*),//) {
+ # indent_func
+ } elsif (s/^g//) {
+ def;
+ } elsif (s/^h//) {
+ # cleol
+ } elsif (s/^i//) {
+ # monospace
+ } else {
+ s/^(.)(.)//;
+ my($f,$b) = map { ord($_)-ord('0') } $1, $2;
+ if ($f<0) {
+# $attr{fgc} = -1; $attr{fgh} = 0;
+ } else {
+ # c>7 => bold, c -= 8 if c>8
+ $attr{fgc} = $ic[$f];
+ $attr{fgh} = $ih[$f];
+ }
+ if ($b<0) {
+# $attr{bgc} = -1; $attr{bgh} = 0;
+ } else {
+ # c>7 => blink, c -= 8
+ $attr{bgc} = $ic[$b];
+ $attr{bgh} = $ih[$b];
+ }
+ }
+
+ } elsif (s/^\cF//) {
+ # blink
+ $attr{blink} = !$attr{blink};
+
+ } elsif (s/^\cO//) {
+ def;
+
+ } elsif (s/^\cV//) {
+ $attr{reverse} = !$attr{reverse};
+
+ } elsif (s/^\c[\[([^m]*)m//) {
+ my(@ansi) = split ";", $1;
+ my(%a);
+
+ push @ansi, 0 unless @ansi;
+
+ for my $code (@ansi) {
+ if ($code == 0) {
+ def(\%a);
+ } elsif ($code == $base{bold}) {
+ $a{bold} = 1;
+ } elsif ($code == $base{underline}) {
+ $a{underline} = 1;
+ } elsif ($code == $base{blink}) {
+ $a{underline} = 1;
+ } elsif ($code == $base{reverse}) {
+ $a{reverse} = 1;
+ } elsif ($code => 30 && $code <= 37) {
+ $a{fgc} = $code - 30;
+ } elsif ($code => 40 && $code <= 47) {
+ $a{bgc} = $code - 40;
+ } else {
+ $a{$code} = 1;
+ }
+ }
+
+ if ($a{fgc} >= 0 && $a{bold}) {
+ $a{fgh} = 1;
+ $a{bold} = 0;
+ }
+
+ if ($a{bgc} >= 0 && $a{blink}) {
+ $a{bgh} = 1;
+ $a{blink} = 0;
+ }
+
+ for my $key (keys %a) {
+ $attr{$key} = $a{$key};
+ }
+
+ } elsif (s/^\c_//) {
+ $attr{underline} = !$attr{underline};
+
+ } else {
+ s/^(.[^\cB\cC\cD\cF\cO\cV\c[\c_]*)//;
+ emit $1;
+ }
+ }
+
+ def;
+ emit "\n";
+}