Selfcode Decoder

zurück zur Eingabe

Quellcode des Scripts

#!/usr/bin/perl -w
# 25/02/2003 by peter <mail@peter.in-berlin.de>
#
# Nach der Spezifikation von emu (http://emmanuel.dammerer.at/selfcode.html)
# zusätzlich: 	SelfHTML/Community: sh:/ := TuT-Beitragschreiber
# 		Serverseitige Sprachen/Lieblingssprache: ls:% := Ruby
# 		Serverseitige Sprachen/Lieblingssprache: ls:\ := TCL
# und den Religion/JavaScript Teil.

use CGI; 
use strict;

#-- Definition des SelfHTML-Codes ---------------------------------------------

my $selfcode = { 
'sh' => {
	'name' => 'SelfHTML', 
	'main' => 0,
	'sub' => 0,
	'}' => 'Ich bin Stefan Münz.',
	')' => 'Developer.',
	'|' => 'Featureartikelschreiber.',
	'/' => 'TuT-Beitragschreiber.',
	'(' => 'Ich habe nichts damit zu tun.',
	},
'fo' => {
	'name' => 'Das Forum',
	'main' => 0,
	'sub' => 1,
	'}' => 'Ich bin unter den Top-10. Mein Leben besteht im wesentlichen aus dem Forum. Mein monatliches Schreibaufkommen ist mit einem Berufsjournalisten vergleichbar.',
	')' => 'Ich bin regelmäßiger Poster.',
	'|' => 'Ich komme gelegentlich und habe ein ausgewogenes Fragen-Antwort-Verhältnis.',
	'(' => 'Wenn ich Hilfe brauche, dann sicher nicht da.',
	'{' => 'Alles Idioten, Newbiehasser, Standardfetischisten, E-Mobber.',
	'§' => 'Ich komme nur, um meine Erfolge bei Gericht feiern zu lassen.',
	'#' => 'ANTWORTN ABA SChNELL!!!11',
	'~' => 'Reiner Menscheleisubter.'
	},
'ch' => {
	'name' => 'Der Chat',
	'main' => 0,
	'sub' => 2,
	'}' => 'Ich bin 24 Stunden im Chat. Ich habe kein Leben.',
	')' => 'Regelmäßiger Besucher, AOP.',
	'|' => 'Gelegentlich.',
	'(' => 'Mir kommen die Leute etwas unfreundlich vor.',
	'{' => 'Chatter sind verwirrte Kick-Fanatiker, die für das Forum zu blöd sind.',
	']' => 'Nur bei den Eröffnungsfeierlichkeiten oder wenn eine Arthur-P-Abwehr koordiniert wird.',
	'#' => 'Ich bin Terrorkröte.',
	'°' => 'Ich bin regelmäßiger Besucher, aber keiner will mir AOP geben.',
	'~' => 'Warum habe ich eigentlich einen AOP, wenn ich doch nie da bin?',
	'?' => 'Es gibt einen SelfChat?'
	},
'rl' => {
	'name' => 'Treffen (rl = real life)',
	'main' => 0,
	'sub' => 3,
	'}' => 'Ich war fast immer dabei.',
	')' => 'Regelmäßiger Besucher.',
	'|' => 'Ein oder zwei Besuche.',
	'(' => 'Noch nie dort.',
	'°' => 'Leider hatte ich noch nie Zeit.',
	'?' => 'Es gibt Treffen?'
	},
'br' => {
	'name' => 'Lieblingsbrowser',
	'main' => 1,
	'sub' => 0,
	'$' => 'IE-Benutzer.',
	'>' => 'Gecko (Mozilla, etc.)',
	'<' => 'Opera.',
	'^' => 'Mozilla und Opera.',
	'&' => 'Je nach Bedarf.',
	'µ' => 'Links, Lynx, etc.',
	']' => 'Quelltextleser.',
	'\\' => 'Konqueror.',
	'~' => 'andere.',
	'?' => 'Duscholux.'
	},
'n4' => {
	'name' => 'Netscape 4',
	'main' => 1,
	'sub' => 1,
	'}' => 'Netscape 4 ist die große Liebe meines Lebens. Ich schicke den Entwicklern zu ihren Geburtstagen Blumen. Ich heule bei den neuesten Statistiken.',
	')' => 'Ich benutze ihn, weil er immer noch der beste ist. Dieses primitive Bashing ist nur lächerlich.',
	'|' => 'Ich muss ihn gelegentlich benutzen, weil er immer noch besser als IE ist. Die Webmaster kann ich zwar verstehen, aber nett finde ich es nicht.',
	'(' => 'Netscape 4 ist ein Horror.',
	'{' => 'Benutzer dieses Browsers sind Wirtschaftsschädlinge, Verrückte oder Rechthaber. Netscape 4 sollte baldestmöglich behördlich verboten werden. Meine Seiten lassen diesen Schrott automatisch abstürzen.',
	'°' => 'Besonders erfreut bin ich nicht, aber ich muss eben die Seiten anpassen.',
	'#' => 'SCHEIßBRAUSER!!!11',
	'~' => 'Dieser Religionskrieg ist doch lächerlich.',
	'&' => 'Eine optimale Version sollte keiner erwarten, aber man sollte diesen Browser berücksichtigen.',
	
	'?' => 'Netwas?'
	},
'ie' => {
	'name' => 'Internet Explorer',
	'main' => 1,
	'sub' => 2,
	'}' => 'Ich bin absoluter Fan. Ich habe alle Sicherheitseinstellungen minimiert und vollstes Vertrauen. Ich liebe Microsoft. Alternative Browser sind nur für anarchistische Idioten.',
	')' => 'Ich benutze den Internet Explorer, weil er der beste Browser ist.',
	'|' => 'Ich benutze ihn ohne irgendwelche Hintergedanken.',
	'(' => 'Ein schlechter Browser.',
	'{' => 'Dieses Stück Programmcode ist gemeingefährlich. Jeder, der so etwas wissentlich verbreitet, ist ein potentieller Schwerverbrecher.',
	'%' => 'Der Marktanteil ist - gemessen an der Qualität - nicht gerechtfertigt und gefährlich.'
	},
'mo' => {
	'name' => 'Mozilla',
	'main' => 1,
	'sub' => 3,
	'}' => 'Mozilla hat mein Leben verändert.',
	')' => 'Mozilla ist der beste Browser.',
	'|' => 'Nicht schlecht, aber Opera ist besser.',
	'(' => 'Definitiv kein guter Browser.',
	'{' => 'Gutmensch-Browser für weltfremde Spinner.',
	'?' => 'Es heißt »Godzilla«.'
	},
'va' => {
	'name' => 'Validator',
	'main' => 2,
	'sub' => 0,
	'}' => 'Der Validator ist mein Gott.',
	')' => 'Ich versuche, nur valide zu schreiben.',
	'|' => 'Nach Möglichkeit.',
	'(' => 'Warum sollte ich valide schreiben?',
	'{' => 'Vorschriftenfanatiker, alle.',
	'?' => 'Valiwas?'
	},
'de' => {
	'name' => 'Frames/Tabellen/CSS (Design-Elemente)',
	'main' => 2,
	'sub' => 1,
	'>' => 'CSS-Fanatiker. Tabellen sind böse, Frames gemeingefährlich.',
	']' => 'CSS!',
	'[' => 'Tabellen aus Bequemlichkeit.',
	'<' => 'Tabellen aus Überzeugung.',
	'/' => 'Framefreund',
	'µ' => 'Design? Da bin ich dagegen.',
	'?' => 'Keine Ahnung.'
	},
'zu' => {
	'name' => 'Zugänglichkeit',
	'main' => 2,
	'sub' => 2,
	'}' => 'Alle Webmaster sollten dazu verpflichtet werden, die UNO sollte es zum Menschenrecht machen.',
	')' => 'Wichtiges Ziel.',
	'|' => 'Sicher überlegenswert.',
	'(' => 'Naja...',
	'{' => 'Unsinn. Hauptsache, ich kann es sehen.',
	'$' => 'Mein Kunde bezahlt eben nicht dafür.',
	']' => 'Ich bin Chräcker Heller. Meine Meinung lässt sich nicht in einem Satz zusammenfassen.'
	},
'fl' => {
	'name' => 'Flash',
	'main' => 2,
	'sub' => 3,
	'}' => 'Die Lösung aller Probleme!',
	')' => 'Elegantes und effektives Werkzeug.',
	'|' => 'Es gibt viele sinnvolle Einsatzmöglichkeiten.',
	'(' => 'Flash-Skeptiker.',
	'{' => 'Ich hasse Flash. Es hat im Web nichts verloren, weg damit.'
	},
'js' => {
	'name' => 'JavaScript',
	'main' => 2,
	'sub' => 4,
	'}' => 'JavaScript und DHTML sind die besten Erfindungen seit HTML und jede Seite sollte ein aufklappbares DHTML-Menü haben.',
	')' => 'JavaScript ist cool.',
	'|' => 'Man kann viel sinnvolles mit JavaScript machen, man kann es aber auch mißbrauchen.',
	'(' => 'JavaScript wird zu oft mißbraucht, daher ist eher davon abzuraten.',
	'{' => 'JavaScript ist doch sowieso nur etwas für Klicki-Bunti-Webmons^Wmaster'
	},
'ss' => {
	'name' => 'Allgemein',
	'main' => 3,
	'sub' => 0,
	'}' =>  'Ich programmiere Online-Shops in zwei Stunden.',
	')' => 'Guter Programmierer.',
	'|' => 'Ich kann kleinere Probleme lösen, bin aber kein Experte.',
	'(' => 'Ich kann aber kaum programmieren.',
	'{' => 'Ich kenne immerhin den Begriff.',
	'?' => 'Was ist denn das schon wieder?'
	},
'ls' => {
	'name' => 'Lieblingssprache',
	'main' => 3,
	'sub' => 1,
	'>' => 'Perl (alles andere ist sowieso Kindergarten).',
	']' => 'Perl.',
	'[' => 'PHP.',
	'<' => 'PHP, Perl ist etwas für hochnäsige Angeber.',
	'$' => 'ASP.',
	'%' => 'Ruby.',
	'\\' => 'TCL',
	'µ' => 'Assembler.',
	'/' => 'JSP.',
	'\\' => 'Coldfusion.',
	'~' => 'andere.',
	'&' => 'Je nach Bedarf.',
	'#' => 'HTML.',
	'?' => 'Ähm...'
	}
};

my %bereich = (0 => 'Community', 1 => 'Browser', 2 => 'Religion', 3 => 'Serverseitige Sprachen');

#-- globale Variablen ---------------------------------------------------------

my $i=0;
my @user = ();

#-- Implementierung -----------------------------------------------------------

sub toHTML {
# codiert Sonderzeichen nach HTML
        my $str = shift;
        $str =~ s/&/&amp\;/g;
        $str =~ s/ä/\&auml\;/g;
        $str =~ s/ö/\&ouml\;/g;
        $str =~ s/ü/\&uuml\;/g;
        $str =~ s/Ä/\&Auml\;/g;
        $str =~ s/Ö/\&Ouml\;/g;
        $str =~ s/Ü/\&Uuml\;/g;
        $str =~ s/ß/\&szlig\;/g;
        $str =~ s/</\&lt\;/g;
        $str =~ s/>/\&gt\;/g;
        $str =~ s/\"/&quot\;/g;
        $str =~ s/µ/&micro\;/g;
        return $str;
}

sub decode {
# parst Selfcode string und speichert gefundene Code-Tokens in @user
	my $code = shift;
	while (1) {
		if ($code =~ m/((\w{2})[\t\ ]*:[\t\ ]*(.))/gc) {
			if (exists $selfcode->{$2}{$3}) {
				${ $user[ $selfcode->{$2}{'main'}] }[ $selfcode->{$2}{'sub'} ] = [$1, $2, $3];
			}
		} else { 
			last;
		}
	}
}

sub sortSelfcode {
# Vergleichsfunktion auf $selfcode (sotiert nach main und sub)
	if ($selfcode->{$a}{'main'} > $selfcode->{$b}{'main'}) {
		return 1;
	} elsif ($selfcode->{$a}{'main'} < $selfcode->{$b}{'main'}) {
		return -1;
	} else {
		return ($selfcode->{$a}{'sub'} > $selfcode->{$b}{'sub'}) ? 1 : -1;
	}
}

sub makeHead {
# schreibt Header
print <<'EOHTML';;
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<title>Selfcode Decoder</title>
		<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
		<link rel="Stylesheet" type="text/css" href="code.css">
	</head>
<body>
	<h1>Selfcode Decoder</h1>	
EOHTML
}

sub makeDefinition {
# gibt Selfcode aus
	my $mem = -1;
	&makeHead();
	print "<h2>Selfcode<\/h2>\n";
	print '<p><a href="http://peter.in-berlin.de/projekte/selfcode">zur&uuml;ck zur Eingabe</a></p>';
	foreach my $key ( sort sortSelfcode keys %{$selfcode} ) {
		print "<hr size=\"1px\" noshade=\"noshade\">\n";
		if ($selfcode->{$key}{'main'} > $mem) {
			$mem = $selfcode->{$key}{'main'};
			print "<h3>", &toHTML($bereich{$mem}), "<\/h3>\n";
		}
		print "<dl>\n<dt>", &toHTML($selfcode->{$key}{'name'}), ": ",&toHTML($key),"<\/dt>\n";
		while (my ($sym, $text) = each %{ $selfcode->{$key} }) {
			if ($sym eq 'sub' || $sym eq 'name' || $sym eq 'main') {
				next;
			}
			print "<dd><code>", &toHTML($sym), "<\/code> := ", &toHTML($text), "<\/dd>\n";
		}
		print "<\/dl>\n";
	}
	print "<\/body>\n<\/html>\n";
}

sub makeGenerateSelfcode {
# erzeugt Formular zur Generierung des Selfcodes
	my $main  = -1;
	&makeHead();
	print "<h2>Selfcode Encoder<\/h2>\n";
	print '<p><a href="http://peter.in-berlin.de/projekte/selfcode">zur&uuml;ck zur Eingabe</a></p>';
	print '<form action="http://peter.in-berlin.de/projekte/selfcode">';
	print '<input type="hidden" name="mode" value="showSelfcode">';
		foreach my $key ( sort sortSelfcode keys %{$selfcode} ) {
		if ($selfcode->{$key}{'main'} > $main) {
			$main = $selfcode->{$key}{'main'};
			print "<h3>", &toHTML($bereich{$main}), "<\/h3>\n";
		}
		print "<dl>\n<dt>", &toHTML($selfcode->{$key}{'name'}), "<\/dt>\n";
		my $sub = $selfcode->{$key}{'sub'};
		while (my ($sym, $text) = each %{ $selfcode->{$key} }) {
			if ($sym eq 'sub' || $sym eq 'name' || $sym eq 'main') {
				next;
			}
			print '<dd><input type="radio" name="', $main, ":", $sub, '" value="', &toHTML("$key:$sym"), ":" ,$sub, '">';
			print '<code>', &toHTML($sym), "<\/code> := ", &toHTML($text), "<\/dd>\n";
		}
		print "<\/dl>\n";
	}
	print '<input type="Reset" value="zur&uuml;cksetzen"><input type="Submit" value=" encode "></form>';
	print "<\/body>\n<\/html>\n";
}

sub makeShowSelfcode {
# berechnet Selfcode
	&makeHead();
	print "<h2>Selfcode Encoder<\/h2>\n";
	print '<p><a href="http://peter.in-berlin.de/projekte/selfcode">zur&uuml;ck zur Eingabe</a></p>';
	print '<code>';
	foreach my $name (CGI::param) {
		if ($name =~ m/^\d+:\d+$/) {
			my ($key, $sym) = split(/:/,CGI::param($name));
			print $key, ":", $sym, " ";
		}
	}
	print '</code>';
	print "<\/body><\/html>\n";
}

sub makeFormular {
# erzeugt Eingabe Formular
	&makeHead();	
print <<'EOHTML';;
<p>Bitte geben Sie in die Textbox unten den Selfcode ein und dr&uuml;cken Sie dann auf <i>decoden</i>.</p>
<div align="center">
<form action="http://peter.in-berlin.de/projekte/selfcode">
<textarea name="code" cols="40" rows="2"></textarea><br>
<input type="reset" value=" zur&uuml;cksetzen "><input type="submit" value=" decoden ">
</form>
</div>
<p>Der <a href="http://emmanuel.dammerer.at/selfcode.html">-&gt; Selfcode</a> wurde am 24. 02. 2003 von emu <a href="http://selfforum.teamone.de/archiv/2003/2/38870/#m212905">-&gt; im SelfHTML Forum vorgeschlagen</a>.</p>
<p>Der Quellcode des Scripts kann <a href="http://peter.in-berlin.de/projekte/selfcode/?mode=src">hier eingesehen werden</a>.</p>
<p>Viel Spa&szlig;, Peter &lt;<a href="mailto:mail@peter.in-berlin.de">mail@peter.in-berlin.de</a>&gt;.</p>
</body>
</html>
EOHTML
}

sub makeDecode {
# erzeugt Ausgabeseite
	my $code = shift;
	&decode($code);
	&makeHead();
	print '<p><a href="http://peter.in-berlin.de/projekte/selfcode">zur&uuml;ck zur Eingabe</a></p>';
	print "<code>",&toHTML($code),"<\/code>\n";
	foreach  (@user) {
		print "<h2>", &toHTML($bereich{$i++}), "<\/h2>\n";
		foreach (@{$_}) {
			if (defined $_) {
				print "<h4>", &toHTML( $selfcode->{ @{$_}[1] }{'name'} ), ":<\/h4>\n";
				print "  <code>", &toHTML(@{$_}[0]),"</code>\n";
				print "<p class=\"exp\">", &toHTML($selfcode->{@{$_}[1]}{@{$_}[2]}), "<\/p>\n";
			}
		}
		print "<hr size=\"1px\" noshade=\"noshade\">\n";
	}
	print "<\/body><\/html>\n";
}

sub makeSrc {
# erzeugt Quellcodeansicht des Scripts
	&makeHead();
print <<'EOHTML';;
<p><a href="http://peter.in-berlin.de/projekte/selfcode">zur&uuml;ck zur Eingabe</a></p>
<h2>Quellcode des Scripts</h2> 
<pre>
EOHTML
	open(FILE, "<selfcode.cgi") || die "can't open selfcode.cgi for reading\n";
	while (<FILE>) {
		print &toHTML($_);
	}
	close(FILE);
	print "<\/pre><\/body><\/html>\n";
}

sub main {
# ermittelt Betriebsmodus und verzweigt entsprechend
	my $code = CGI::param('code') || '';
	my $mode = CGI::param('mode') || '';
	if ($mode eq 'src') {
		&makeSrc();
	} elsif ($mode eq 'Selfcode') {
		&makeDefinition();
	} elsif ($mode eq 'encode') {
		&makeGenerateSelfcode();
	} elsif ($mode eq 'showSelfcode') {
		&makeShowSelfcode();
	} elsif ($code eq '') {
		&makeFormular();
	} else {
		&makeDecode($code);
	}
}

#-- main ---------------------------------------------------------------------- 

&main();