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/&/&\;/g;
$str =~ s/ä/\ä\;/g;
$str =~ s/ö/\ö\;/g;
$str =~ s/ü/\ü\;/g;
$str =~ s/Ä/\Ä\;/g;
$str =~ s/Ö/\Ö\;/g;
$str =~ s/Ü/\Ü\;/g;
$str =~ s/ß/\ß\;/g;
$str =~ s/</\<\;/g;
$str =~ s/>/\>\;/g;
$str =~ s/\"/"\;/g;
$str =~ s/µ/µ\;/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ü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ü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ü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ü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ü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ücksetzen "><input type="submit" value=" decoden ">
</form>
</div>
<p>Der <a href="http://emmanuel.dammerer.at/selfcode.html">-> Selfcode</a> wurde am 24. 02. 2003 von emu <a href="http://selfforum.teamone.de/archiv/2003/2/38870/#m212905">-> 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ß, Peter <<a href="mailto:mail@peter.in-berlin.de">mail@peter.in-berlin.de</a>>.</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ü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ü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();