diff options
Diffstat (limited to 'scripts/log2ansi.pl')
| -rw-r--r-- | scripts/log2ansi.pl | 253 | 
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"; +} | 
