<?php //Copyright 2004 Tai Gerstberger // This file is part of PiwiP (PiwiP isn't written in PHP). // PiwiP is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // PiwiP is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with PiwiP; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //Thanks for great ideas and great help to TOBIAS THALMEIER (http://tt-home.de). //ACHTUNG: DER BILDSERVER MUSS DIRECTORY LISTING AKTIVIERT HABEN (D.H. BEI AUFRUF //VON EXAMPLE.COM/USER27/GALLERY/ MUSS VOM BILDSERVER EINE AUTOMATISCH ERZEUGTE //HTML-DATEI, DIE DEN INHALT (VERZEICHNISSE UND (BILD-)DATEIEN) ZEIGT, AUSGEGEBEN //WERDEN), SONST KOENNEN DIE VERZEICHNISSE NICHT AUSGELESEN WERDEN //ACHTUNG: ES DUERFEN KEINE DATEIEN MIT NAMEN INDEX.HTML INNERHALB DER //BILDSERVER(UNTER)VERZEICHNISSE SEIN (EXAMPLE.COM/USER27/INDEX.HTML IST MOEGLICH, //EXAMPLE.COM/USER27/GALLERY/INDEX.HTML DARF NICHT SEIN, //EXAMPLE.COM/USER27/GALLERY/HOLIDAYS/EASTERN/INDEX.HTML DARF AUCH NICHT SEIN) !!! //Achtung: es kommt oefter der Begriff "directory listing" zu Gebrauch, in //folgenden Zusammenhaengen ist die vom Bildserver ausgegebene html-Seite (die //alle Verzeichnisnamen und/oder Bildnamen enthaelt) gemeint !!! //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //$initialurl MUSS ANGEPASST WERDEN, DIESE VARIABLE IST IN PIWIP.CONF ZU FINDEN! //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //in der Datei piwip.conf werden die Einstellungen vorgenommen include ("./include/piwip.conf"); //Ausgabe einer Fehlermeldung mit Apache 2 sobald $align leer (nicht gesetzt) //ist; es wird geprueft, ob $align gesetzt ist und wenn nicht, wird $align //mit dem Wert "landscape" belegt if (isset($align)) { //nichts machen } else { $align = "landscape"; } //Sicherheitshalber eine analoge if-Abfrage wie bei $align if (isset($subdir)) { //nichts machen } else { $subdir = ""; } //folgender Abschnitt (bis ksort($replace_with_rfc1738);) legt die Variablen //fest, damit Zeichen, die nach RFC 1738 kodiert sind, zu den entsprechenden //Sonderzeichen (und andersherum) verwandelt werden können //Gibt eine Zeichenkette zurück, in der die nach RFC 1738 kodierten Zeichen //(Prozent-Zeichen (%), gefolgt von einer 2-stelligen hexadezimalen Zahl) in //Sonderzeichen (Leerzeichen, Ae, ae, Oe, oe, Ue, ue und Scharfes S) ersetzt //worden sind. Die Kodierung nach RFC 1738 dient zum Schutz von Zeichen, die //als spezielle URL-Zeichen zu interpretieren sind. $search_rfc1738[0] = "/%20/"; $search_rfc1738[1] = "/%C4/"; $search_rfc1738[2] = "/%E4/"; $search_rfc1738[3] = "/%D6/"; $search_rfc1738[4] = "/%F6/"; $search_rfc1738[5] = "/%DC/"; $search_rfc1738[6] = "/%FC/"; $search_rfc1738[7] = "/%DF/"; $replace_with_specialcharacter[0] = " "; $replace_with_specialcharacter[1] = "Ä"; $replace_with_specialcharacter[2] = "ä"; $replace_with_specialcharacter[3] = "Ö"; $replace_with_specialcharacter[4] = "ö"; $replace_with_specialcharacter[5] = "Ü"; $replace_with_specialcharacter[6] = "ü"; $replace_with_specialcharacter[7] = "ß"; ksort($search_rfc1738); ksort($replace_with_specialcharacter); //Gibt eine Zeichenkette zurück, in der die Sonderzeichen (Leerzeichen, Ae, //ae, Oe, oe, Ue, ue und Scharfes S) durch ein Prozent-Zeichen (%), gefolgt //von einer 2-stelligen hexadezimalen Zahl, ersetzt worden sind. Dies ist //die Kodierung nach RFC 1738 zum Schutz von Zeichen, die als spezielle //URL-Zeichen zu interpretieren sind. $search_specialcharacter[0] = "/ /"; $search_specialcharacter[1] = "/Ä/"; $search_specialcharacter[2] = "/ä/"; $search_specialcharacter[3] = "/Ö/"; $search_specialcharacter[4] = "/ö/"; $search_specialcharacter[5] = "/Ü/"; $search_specialcharacter[6] = "/ü/"; $search_specialcharacter[7] = "/ß/"; $replace_with_rfc1738[0] = "%20"; $replace_with_rfc1738[1] = "%C4"; $replace_with_rfc1738[2] = "%E4"; $replace_with_rfc1738[3] = "%D6"; $replace_with_rfc1738[4] = "%F6"; $replace_with_rfc1738[5] = "%DC"; $replace_with_rfc1738[6] = "%FC"; $replace_with_rfc1738[7] = "%DF"; ksort($search_specialcharacter); ksort($replace_with_rfc1738); //sofern lokal ein Webserver (z.B. Apache) laeuft, kann zu Testzwecken eine //lokale Kopie des ausgegebenen directory listing des Bildservers gespeichert //werden (im Browser die Seite des Bildservers aufrufen (z.B. //http://example.com/Gallery/Holidays/Eastern) und die ausgegebene Seite //lokal als IndexBildserverBilderseite.html speichern [unter SuSE Linux 8.2 //Professional z.B. /srv/www/htdocs/test/IndexBildserverBilderseite.html]); //zu Testzwecken kann folgende Zeile auskommentiert werden: #$url = "http://localhost/test/IndexBildserverBilderseite.html"; $url = $initialurl; //$initalurl stammt aus piwip.conf $url = $url.$subdir; $url = preg_replace($search_specialcharacter, $replace_with_rfc1738, $url); //zu Testzwecken auskommentieren, um $url zu pruefen #echo "<br>\$url: ".$url."\n"; //herausloesen des hintersten Verzeichnisses //(bei http://example.com/Gallery/Holidays/Eastern/ ist dies "Eastern"); wird //nur fuer den Titel der HTML-Seite (genaugenommen fuer die Variable $htmltitle) //benoetigt: $pattern_url = "/(\/)([^\/]+[^\/])(\/$)/isU"; preg_match_all($pattern_url, $url, $hit_url); //zu Testzwecken auskommentieren, um die Treffer zu sehen: #echo "<br>\$hit_url[0][0]: ".$hit_url[0][0]."\n"; #echo "<br>\$hit_url[1][0]: ".$hit_url[1][0]."\n"; #echo "<br>\$hit_url[2][0]: ".$hit_url[2][0]."\n"; #echo "<br>\$hit_url[3][0]: ".$hit_url[3][0]."\n"; //$showngallerydirectory ist das hinterste Verzeichnis aus $url und wird nur //fuer den HTML-Titel benoetigt $showngallerydirectory = $hit_url[2][0]; $showngallerydirectory = preg_replace($search_rfc1738, $replace_with_specialcharacter, $showngallerydirectory); //Einfuegen des HTML-Headers include ($includepath."html_header.inc"); //Einfuegen der Logos, je nach Geschmack #include ($includepath."logos.inc"); //Einfuegen eines Absatzes; macht Sinn wenn auch die Logos angezeigt werden #include ($includepath."break.inc"); //Funktionen (OpenTable und CloseTable) verfuegbar machen include ($includepath."table_functions.inc"); OpenTable(); //der Counter wird spaeter benoetigt, damit die Bilder korrekt nebeneinander //dargestellt werden $counter = 1; //oeffnen einer Verbindung zum Bildserver $fp = fopen ("$url","rb"); if ($fp) { while (!feof($fp)) { //$subject ist der später zu durchsuchende Text (in diesem Fall das vom //Bildserver ausgegebene directory listing) $subject = fread($fp,200000); //zu Testzwecken auskommentieren, um $subject anzusehen: #echo "<br>\$subject: ".$subject."\n"; //hier gehts an die regulaeren Ausdruecke (Regular Expressions) //nur zum Verstaendnis in folgenden zwei Zeilen ein Ausschnitt (eine //Zeile) aus dem directory listing: //<img SRC="/icons/image2.gif" ALT="[IMG]"> <a HREF= //"im001382.jpg">im001382.jpg</a> 29-Jun-2004 23:02 37k //der Bildname im001382.jpg wird spaeter aus dem Abschnitt //jpg">im001382.jpg</a> genommen //Festlegung des Suchmusters (pattern), um die Bildnamen (z.B. //im001382.jpg) aus dem directory listing herauszuloesen //(Suchmuster muss bei anders aussehendem directory listing //angepasst werden): $search_pic_before = "(jpg|png|gif|bmp).>"; $search_pic = ".*?\.(jpg|png|gif|bmp)"; $search_pic_after = "<\/a>"; $pattern_pic = "/($search_pic_before)($search_pic)($search_pic_after)/im"; //herausloesen der Bildnamen (z.B. im001382.jpg) aus dem directory //listing: preg_match_all($pattern_pic, $subject, $hit_pic); for ($i=0; $i< count($hit_pic[0]); $i++) { //zu Testzwecken auskommentieren, damit man sieht ob die richtigen //Bildnamen gefunden wurden: #echo "<br>\$hit[3][\$i]: ".$hit[3][$i]."\n"; //Bildausrichtung $pictureinfo = getimagesize($url.$hit_pic[3][$i]); $width = $pictureinfo[0]; $height = $pictureinfo[1]; //zu Testzwecken auskommentieren, damit man sieht ob die richtige //Bildausrichtung uebergeben wurde #echo "<br>\$align: ".$align."\n"; if ($align == "portrait") { //Festlegung, welcher Wert spaeter bei der if-Abfrage groesser //sein muss (bei Hochformat natuerlich die Hoehe) $align1 = $height; $align2 = $width; } else { //Festlegung, welcher Wert spaeter groesser sein muss (bei Quer- //format die Breite) $align1 = $width; $align2 = $height; } //tatsaechliche Auswahl des Bildes, wenn es die "richtige" Bildaus- //richtung hat; //Achtung: quadratische Bilder werden sowohl als Hochformat als auch //als Querformat angezeigt! if ($align1 >= $align2) { $image_with_full_path = $url.$hit_pic[3][$i]; $image_with_full_path = preg_replace($search_specialcharacter, $replace_with_rfc1738, $image_with_full_path); //Einfuegen des Bildziels (die Url des Bildes) in die HTML-Tabelle echo "<img src='$image_with_full_path'>"; //der Nenner ist die Anzahl der Bilder, die nebeneinander dargestellt //werden; sollen z.B. sieben Bilder nebeneinander dargestellt werden //muss es ...$counter/7)) heissen if (is_integer($counter/2)) { echo "</td></tr><tr><td>"; } else { echo "</td><td>"; } $counter++; } } } fclose($fp); } CloseTable(); //Einfuegen des HTML-Fusses (meist </body></html>) include ($includepath."html_foot.inc"); ?>