#!/usr/bin/perl

# omg-color -- by greenfly
# application which colorizes input piped to it according to a specified pattern
#
# usage: cat file | omg-color <pattern>
#
# current patterns are:
# checkers	-- red on black/black on red alternating in a checker pattern
# chess		-- white on black/black on white alternating in a checker pattern
# random	-- random on random
# randomfg	-- random on default
# randomword	-- randon on random, color changes after each word
# randomwordfg	-- random on default, color changes after each word
# wave		-- random on default, alternating in a wave pattern
# rainbow	-- alternating rainbow pattern

$pattern = shift;


# set some colors
$escape = "\33[";
$end = "m";
$fg{black}	= "30";
$fg{red}	= "31";
$fg{green}	= "32";
$fg{yellow}	= "33";
$fg{blue}	= "34";
$fg{magenta}	= "35";
$fg{lightblue}	= "36";
$fg{white}	= "37";
$bg{black}	= "40";
$bg{red}	= "41";
$bg{green}	= "42";
$bg{yellow}	= "43";
$bg{blue}	= "44";
$bg{magenta}	= "45";
$bg{lightblue}	= "46";
$bg{white}	= "47";

$color{brighten} = "01";
$color{normal} = "0";

$white_on_black = "$escape$fg{white};$bg{black}$end";
$black_on_white = "$escape$fg{black};$bg{white}$end";

$black_on_red = "$escape$fg{black};$bg{red}$end";
$red_on_black = "$escape$fg{red};$bg{black}$end";

if($pattern eq "checkers")
{
   $color1 = $black_on_red;
   $color2 = $red_on_black;
   checkerboard();
}
elsif($pattern eq "chess")
{
   $color1 = $black_on_white;
   $color2 = $white_on_black;
   checkerboard();
}
elsif($pattern eq "random")
{
   random();
}
elsif($pattern eq "randomfg")
{
   randomfg();
}
elsif($pattern eq "randomword")
{
   randomword();
}
elsif($pattern eq "randomwordfg")
{
   randomwordfg();
}
elsif($pattern eq "rainbow")
{
   rainbow();
}
elsif($pattern eq "wave")
{
   wave();
}
else
{
   default();
}


sub randomword
{
   while(<>)
   {
      s/$/$escape$color{normal}$end/;
      while(/(\S+\s)/g)
      {
	 my $fg = 0;
	 my $bg = 0;
	 while($fg == $bg)
	 {
	    $fg = int(rand 8);
	    $bg = int(rand 8);
	 }
	 $fg += 30;
	 $bg += 40;
	 print "$escape$fg;$bg$end" . "$1";
      }

   }
   print "$escape$color{normal}$end";
}

sub randomwordfg
{
   while(<>)
   {
      s/$/$escape$color{normal}$end/;
      while(/(\S+\s)/g)
      {
	 $fg = int(rand 7) + 1;
	 $fg += 30;
	 $bg = 40;
	 print "$escape$fg;$bg$end" . "$1";
      }
   }
   print "$escape$color{normal}$end";
}

#sub wave
#{
#   $count = 0;
#   while(<>)
#   {
#      s/$/$escape$color{normal}$end/;
#      $fg = $count;
#      while(/(\S+\s)/g)
#      {
#	 $fg = ($fg % 8);
#	 if($fg == 0)
#	 { 
#	    $bg = 47;
#	 }
#	 else
#	 {
#	    $bg = 40;
#	 }
#	 $fg += 30;
#	 print "$escape$fg;$bg$end" . "$1";
#	 $fg++;
#      }
#
#      $count++;
#   }
#   print "$escape$color{normal}$end";
#}

sub random
{
   while(<>)
   {
      s/$/$escape$color{normal}$end/;
      while(/(.)/g)
      {
	 my $fg = 0;
	 my $bg = 0;
	 while($fg == $bg)
	 {
	    $fg = int(rand 8);
	    $bg = int(rand 8);
	 }
	 $fg += 30;
	 $bg += 40;
	 print "$escape$fg;$bg$end" . "$1";
      }

      print "\n";
   }
   print "$escape$color{normal}$end";
}

sub randomfg
{
   while(<>)
   {
      s/$/$escape$color{normal}$end/;
      while(/(.)/g)
      {
	    $fg = int(rand 7) + 1;
	    $fg += 30;
	    $bg += 40;
	    print "$escape$fg;$bg$end" . "$1";
      }

      print "\n";
   }
   print "$escape$color{normal}$end";
}

sub rainbow
{
   my @rainbow = qw(red yellow green blue magenta);
   my $count = 0;
   while(<>)
   {
	 $wordcount = 0;
      while(/(.{1,10})/g)
      {
	 if(($wordcount == 8) && ($count % 8 < 4))
	 {
	    print "$escape$color{normal}$end";
	    print "\n"; 
	    $count++; 
	 }
	 elsif(($wordcount == 9) && ($count % 8 >= 4))
	 { 
	    print "$escape$color{normal}$end";
	    print "\n";
	    $count++; 
	 }
	 
	 $fg = ($wordcount % 5);
	 $bg = 40;
	 print "$escape$fg{$rainbow[$fg]};$bg$end" . "$1";
	 $wordcount++;
      }
      $count++;

      print "$escape$color{normal}$end";
      print "\n";
   }
   print "$escape$color{normal}$end";
}
sub wave
{
   my $count = 0;
   while(<>)
   {
      if($count % 8 < 4)
      {
	 $wordcount = 0;
      }
      else
      {
	 $wordcount = 1;
      }
      while(/(.{1,10})/g)
      {
	 if(($wordcount == 8) && ($count % 8 < 4))
	 {
	    print "$escape$color{normal}$end";
	    print "\n"; 
	    $count++; 
	 }
	 elsif(($wordcount == 9) && ($count % 8 >= 4))
	 { 
	    print "$escape$color{normal}$end";
	    print "\n";
	    $count++; 
	 }
	 
	 $fg = ($wordcount % 8);
	 if($fg == 0)
	 { 
	    $bg = 47;
	 }
	 else
	 {
	    $bg = 40;
	 }
	 $fg += 30;
	 print "$escape$fg;$bg$end" . "$1";
	 $wordcount++;
      }
      $count++;

      print "$escape$color{normal}$end";
      print "\n";
   }
   print "$escape$color{normal}$end";
}

sub checkerboard
{
   my $count = 0;
   while(<>)
   {
      if($count % 8 < 4)
      {
	 $wordcount = 0;
      }
      else
      {
	 $wordcount = 1;
      }
      while(/(.{1,10})/g)
      {
	 if(($wordcount == 8) && ($count % 8 < 4))
	 {
	    print "$escape$color{normal}$end";
	    print "\n"; 
	    $count++; 
	    if($count % 8 >= 4)
	    {
	       $wordcount = 1;
	    }
	 }
	 elsif(($wordcount == 9) && ($count % 8 >= 4))
	 { 
	    print "$escape$color{normal}$end";
	    print "\n";
	    $count++; 
	    if($count % 8 < 4)
	    {
	       $wordcount = 0;
	    }
	 }
	 if($wordcount % 2 == 0)
	 {
	    print "$color1" . "$1";
	 }
	 else
	 {
	    print "$color2" . "$1";
	 }
	 $wordcount++;
      }
      $count++;

      print "$escape$color{normal}$end";
      print "\n";
   }
   print "$escape$color{normal}$end";
}

sub default
{
   while(<>)
   {
      print;
   }
}
