Internetforen gibt es wie Sand am Meer und es gibt ebenso viele Seiten, wo man Smilies finden kann, die man über die Forencodes oder HTML einbinden kann. Diese Seiten tauchen auf und verschwinden wieder, einige fordern sogar direkt dazu auf, die Smilies runterzuladen und auf den eigenen Webspace zu packen. Das ist nicht weiter schlimm, aber da liegen sie nun in den Untiefen in irgendeinem Unterordner der eigenen Domain. Will man einen Smiley verwenden, wühlt man sich lange durch Verzeichnisse und schreibt die URL des Bildchens zusammen mit den Forencodes mühsam von Hand zusammen.
Genauso ging es mir und daher hab ich mir ein Skript in PHP gebastelt, das mir nicht nur alle Smilies, die ich gesammelt habe, übersichtlich anzeigt, sondern auch gleich noch den Forencode mit der passenden URL dazu. Der brauch nur noch kopiert werden und schon hat man den eigenen besonders witzigen Smiley im Internetforum seiner Wahl eingefügt. Folgendes habe ich in ein Grundgerüst einer HTML-Seite eingefügt. Ich hab das einfach mal ein wenig getrennt hier, damit es sich leichter kommentieren lässt, später einfach wieder zusammenfügen…
<?php $extcounter = 0; function fileextension($filename) { $pospunkt = strrpos($filename,"."); return substr($filename, $pospunkt+1, strlen($filename) - $pospunkt); } function isimagefile($filename) { $extension = fileextension($filename); if( ($extension == "gif") OR ($extension == "jpg") OR ($extension == "jpeg") OR ($extension == "png") ) { return true; } else { return false; } }
In den beiden Funktionen passiert erstmal nichts spannendes. Die erste gibt von einem Dateinamen die Erweiterung, also den Teil nach dem letzten Punkt zurück. Die zweite Funktion bekommt so ein Ergebnis vorgesetzt und gibt wahr oder falsch zurück, je nachdem ob es die Erweiterung einer Bilddatei ist oder nicht.
function echodir($path = ".") { $counter = 1; global $extcounter; $dir = dir($path); while(false !== ($file = $dir->read())) { if(("." == $file) OR (".." == $file)) continue; if(is_dir($path."/".$file)) { echo "<h2>$file</h2>n"; echo "<p>n"; echo "<table>n"; echodir($path."/".$file); echo "</table>n"; echo "</p>n"; } else { if(isimagefile($file)) { if($counter%2) { echo "<tr>n"; } echo "<td><img src="".$path."/".$file.""/></td>"; echo "<td>[img]http://www.lespocky.de/smilies/" . substr($path,2,strlen($path)-2) . "/".$file."[/img]</td>n"; if(($counter+1)%2) { echo "</tr>n"; } $counter++; $extcounter++; } } } $dir->close(); }
Hier passiert das spannende. Vorweg sei gesagt, wie die Dateien organisiert sind. In dem Ordner, wo das Skript liegt, befinden sich keine Grafikdateien, sondern nur Ordner. In diesen Ordnern liegen dann direkt die Smilies. Tiefere Ordnerebenen gibt es nicht.
echodir() ist eine rekursiv aufgerufene Funktion. Wird kein Argument übergeben, so ist das aktuelle Verzeichnis zu durchsuchen. Da wird dann in der while-Schleife jeder Eintrag durchgegangen. Bei “.” und “..” passiert nix weiter, es geht zum nächsten Schleifendurchlauf. Dann passiert eine Unterscheidung, ob der Eintrag eine Datei oder ein weiteres Verzeichnis ist. Bei einem Verzeichnis wird eine neue Überschrift geschrieben und eine Tabelle begonnen. Die Smilies sollen in zwei Spalten angezeigt werden, damit nicht so viel Platz verschwendet wird. Nach Beginn der Tabelle, wird echodir selbst rekursiv aufgerufen.
In diesem Aufruf wird die Funktion wegen der oben erwähnten Organisation der Dateien, dann auch Dateien finden und diese dann zweispaltig eintragen. Um die Spalten zu erkennen und an den korrekten Stellen die tr-Tags zu öffnen und zu schließen, werden die Smilies in $counter mitgezählt und über den Modulo-Operator jeweils in linke oder rechte Spalte geschrieben. Ausgegeben wird nicht nur der Smilie selbst zum Angucken, sondern auch das fertige Foren-Tag zum Markieren und Kopieren.
Irgendwann gibt es dann keine Verzeichnisse und Dateien mehr zum lesen, alles Smilies sind ausgegeben und … ach ja, die Funktion ist ja erst definiert und erklärt, aufgerufen muss sie noch werden:
echodir(); echo "<hr /><p>Das waren ".$extcounter." Smilies..</p>n"; ?>
Die letzte Zeile ist noch ein bisschen Spielerei als Abschluss. Da die ganze Auflistung von dem PHP-Skript übernommen werden, brauchen neue Smilies nur auf den Webspace kopiert werden, fertig.
Die Angabe des dritten Parameters in substr ist überflüssig, da der Teilstring von der angegebenen Position bis zum Ende des Strings ausgeben wird. Dann kann man die ganze Sache auch recht einfach in einen Einzeiler verpacken.
Ebenso ist in der funktion isimagefile die if Konstruktion überflüssig. Hier genügt:
Könnte man anstatt
nicht einfach
schreiben, oder irre ich mich da jetzt total?
kann man als
zusammenfassen.
Logik und Syntaxfehler nicht ausgeschlossen.
Man könnte noch ein paar mehr dinge kürzen, aber dann verschlechtert sich die lesbarkeit des codes wieder.
Dankeschön für die guten Tipps, lässt sich im Prinzip alles so umsetzen. Ich hab im Zuge dessen auch gleich noch einen Bug gefunden. Wenn in einem Abschnitt eine ungerade Anzahl Smilies ausgegeben wurde und dann keine weiteren kamen, fehlte das <tr>-Tag. Komplett konform nach XHTML 1.0 Strict hab ich das verbesserte Skript mal auf meinem Webspace abgelegt: listsmilies.php.bz2
Oder man nutzt ksmile und bekommt damit Kolobok und meine Smilies direkt in den Browser:
http://www.greensmilies.com/2008/03/16/volle-smilies-fur-den-browser-breitseite/
PS: Kann man das Posten noch komplizierter als hier machen? Captcha, dann Code in Box, ohne JS geht gar nix,…
Das Captcha ist immer da und ich halte das für sinnvoll. Wenn JavaScript aktiviert ist, braucht man nur die Worte eingeben und auf “Post Your Comment” klicken. Die Methode, die Du beschreibst mit dem Code, der noch in die zweite Box übertragen werden muss, ist die ohne JavaScript und die funktioniert sehr wohl.
Der Sourcecode ist jetzt auch in unserem neuen Subversion-Repo verfügbar: Penguineering :D
Direktlink