#!/usr/bin/perl

require "../cgi-lib.pl";
require "/home/dave/1337.pl";
print "Content-type: text/html\n\n";

@fun_color_colors = ('red','green','orange','blue','yellow','purple');
@stupid_colors = ('black','red','green','orange','blue','yellow','purple','black');
@font_sizes = ('-1','3','+1','+2','+3');
@tags = ('','i','b','u');


ReadParse(*in);
if($in{url} =~ /^\s*\w+\.\w+/i) {
    $in{url} =~ s/^\s+//;
    $in{url} = "http://$in{url}";
}
$in{url} =~ s/^([^;\s\*\`\$]+).*/$1/;
@source = split /\n/,`lynx -source $in{url}`;
if(!$in{url}) {
    print "<HTML><BODY>\n";
    print "<FORM>\n";
    print "Web site: <INPUT TYPE=TEXT NAME=\"url\" VALUE=\"$in{url}\">\n";
    print "<select name=transto size=1>\n";
    print "<option value=\"1337\">1337 5peek!</option>\n";
    print "<option value=\"morse\">Morse Code</option>\n";
    print "<option value=\"bleach\">Bleach</option>\n";
    print "<option value=\"colorful\">Colorful</option>\n";
    print "<option value=\"stupid\">Stupid HTML</option>\n";
    print "<option value=\"binary\">Binary</option>\n";
    print "<option value=\"swedish\">Swedish</option>\n";
    print "</select>\n";
    print "<INPUT TYPE=SUBMIT VALUE=\"Translate it!\"><br>\n";
    print "</FORM>\n";
    print "</BODY></HTML>\n";
    exit(0);
}
$transto = $in{transto} || "1337";
$base = $in{url};
$base =~ s/\/[^\/]+$/\//;
if($in{url} =~ /(http:\/\/[^\/]+)/i) {
    $urlbase = $1;
}
print "<HEAD><BASE HREF=\"$urlbase\"></HEAD>\n";
print "<!-- base = \"$base\", urlbase = \"$urlbase\", url = \"$in{url}\" -->\n";
foreach $line (@source) {
#    print "parsing: \"$line\"\n";
    while($line =~ /./) {
	if($line =~ /^([^\<\>]+)\</ || $line =~ /^([^\<\>]+)$/) {
	    $text = $1;
	    $line =~ s/^\Q$text\E//;
	    while($text =~ /./) {
		if($text =~ /^(\&\#?\w+\;)/) {
		    $char = $1;
		    $text =~ s/^\Q$char\E//;
		    print $char;
		}
		elsif($text =~ /^(.*?)\&\#?\w+\;/) {
		    $char = $1;
		    $text =~ s/^\Q$char\E//;
		    print translate($char);
		}
		else {
		    print translate($text);
		    $text = "";
		}
	    }
	}
	elsif($line =~ /^(\<[^\>]*\>)/ ||
	      $line =~ /^(\<[^\>]*)$/ ||
	      $line =~ /^(\&\#?\w+\;)/ ||
	      $line =~ /^([^\>]*\>)/) {
	    $html = $1;
	    $line =~ s/^\Q$html\E//;
	    if($html =~ /(href)=\'([^\']+)\'/i ||
	       $html =~ /(href)=\"([^\"]+)\"/i ||
	       $html =~ /(href)=(\S+)/i) {
		my($trans) = $2;
		my($to) = $trans;
		if($trans =~ /^http:\/\/.*$/i) {
		    $to = "http://$ENV{HTTP_HOST}$ENV{SCRIPT_NAME}?transto=$in{transto}\&url=".encode($trans);
		} else {
		    $to = "http://$ENV{HTTP_HOST}$ENV{SCRIPT_NAME}?transto=$in{transto}\&url=$urlbase".encode($trans);
		}
		$html =~ s/\Q$trans\E/$to/g;
	    }

	    print "$html";
	}
	else {
	    print "\nERROR! \"$line\"\n";
	    $line = "";
	}
    }
    print "\n";
}

sub encode {
    $_ = join '', @_;
    s/(\W)/'%'.sprintf("%02lx",ord($1))/ge;
    return $_;
}

sub translate {
    if($in{transto} eq "morse") { return to_morse($_[0]); }
    elsif($in{transto} eq "bleach") { return to_bleach($_[0]); }
    elsif($in{transto} eq "stupid") { return to_stupid_html($_[0]); }
    elsif($in{transto} eq "colorful") { return to_fun_colors($_[0]); }
    elsif($in{transto} eq "binary") { return to_binary($_[0]); }
    elsif($in{transto} eq "swedish") { return to_swedish($_[0]); }
    else { return to_1337($_[0]); }
}

sub to_binary {
    my($text) = @_;
    $text =~ s/(.)/sprintf("%08b",ord($1))/ge;
    return $text;
}

sub to_swedish {
    return "bork " x int(length($_[0]) / 5);    
}

sub to_stupid_html {
    return $text unless $text =~ /\S/;
    my($text) = @_;
    my($fontcolor) = int(rand scalar(@stupid_colors));
    my($fontsize) = int(rand scalar(@font_sizes));
    my($tag) = int(rand scalar(@tags));
    if(int(rand 5) >= 4) { $text .= "!!!!!!"; }
    if(int(rand 5) >= 4) { $text = uc $text; }
    if($tags[$tag]) { $text = "<$tags[$tag]>$text<\/$tags[$tag]>"; }
    return "<font size=$font_sizes[$fontsize] color=$stupid_colors[$fontcolor]>".$text."</font>";
}

sub to_fun_colors {
    my($text) = @_;
    $text = "<font color=$fun_color_colors[$color_index]>$text</font>";
    $color_index = ($color_index >= $#fun_color_colors) ? 0 : $color_index+1;
    return $text;
}

sub to_bleach {
    my($string) = @_;
    $string =~ s/\S/\&nbsp\;/g;
    return $string;
}

sub to_morse {
    my($string) = $_[0];
    my($ret) = "";
    my($char);
    my($loops) = 0;
    while($string =~ s/^(.)//) {
        $char = $1;
        $loops++;
        if($char =~ /[\d\w\.\,\/\+\=\?\(\)\-\"\'\:\;\$]/) {
            $char = lc $char;
            if($char eq "a") { $ret .= ".- "; }
            elsif($char eq "b") { $ret .= "-... "; }
            elsif($char eq "c") { $ret .= "-.-. "; }
            elsif($char eq "d") { $ret .= "-.. "; }
            elsif($char eq "e") { $ret .= ". "; }
            elsif($char eq "f") { $ret .= "..-. "; }
            elsif($char eq "g") { $ret .= "--. "; }
            elsif($char eq "h") { $ret .= ".... "; }
            elsif($char eq "i") { $ret .= ".. "; }
            elsif($char eq "j") { $ret .= ".--- "; }
            elsif($char eq "k") { $ret .= "-.- "; }
            elsif($char eq "l") { $ret .= ".-.. "; }
            elsif($char eq "m") { $ret .= "-- "; }
            elsif($char eq "n") { $ret .= "-. "; }
            elsif($char eq "o") { $ret .= "--- "; }
            elsif($char eq "p") { $ret .= ".--. "; }
            elsif($char eq "q") { $ret .= "--.- "; }
            elsif($char eq "r") { $ret .= ".-. "; }
            elsif($char eq "s") { $ret .= "... "; }
            elsif($char eq "t") { $ret .= "- "; }
            elsif($char eq "u") { $ret .= "..- "; }
            elsif($char eq "v") { $ret .= "...- "; }
            elsif($char eq "w") { $ret .= ".-- "; }
            elsif($char eq "x") { $ret .= "-..- "; }
            elsif($char eq "y") { $ret .= "-.-- "; }
            elsif($char eq "z") { $ret .= "--.. "; }
            elsif($char eq ".") { $ret .= ".-.-.- "; }
            elsif($char eq ",") { $ret .= "--..-- "; }
            elsif($char eq "/") { $ret .= "-..-. "; }
            elsif($char eq "+") { $ret .= ".-.-. "; }
            elsif($char eq "=") { $ret .= "-...- "; }
            elsif($char eq "?") { $ret .= "..--.. "; }
            elsif($char eq "(") { $ret .= "-.--. "; }
            elsif($char eq ")") { $ret .= "-.--.- "; }
            elsif($char eq "-") { $ret .= "-....- "; }
            elsif($char eq "\"") { $ret .= ".-..-. "; }
            elsif($char eq "_") { $ret .= "..--.- "; }
            elsif($char eq "'") { $ret .= ".----. "; }
            elsif($char eq ":") { $ret .= "---... "; }
            elsif($char eq ";") { $ret .= "-.-.-. "; }
            elsif($char eq "\$") { $ret .= "...-..- "; }
            elsif($char eq "0") { $ret .= "----- "; }
            elsif($char eq "1") { $ret .= ".---- "; }
            elsif($char eq "2") { $ret .= "..--- "; }
            elsif($char eq "3") { $ret .= "...-- "; }
            elsif($char eq "4") { $ret .= "....- "; }
            elsif($char eq "5") { $ret .= "..... "; }
            elsif($char eq "6") { $ret .= "-.... "; }
            elsif($char eq "7") { $ret .= "--... "; }
            elsif($char eq "8") { $ret .= "---.. "; }
            elsif($char eq "9") { $ret .= "----. "; }
            else { $ret .= $char; }
        }
        else {
            $ret .= $char;
        }
    }
    return "$ret";
}

