Location: PHPKode > scripts > PiwiP > piwip/index.php
<?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");
#echo "<br>\$initialurl: ".$initialurl."\n";
#echo "<br>\$includepath: ".$includepath."\n";
#echo "<br>\$backgroundcolor: ".$backgroundcolor."\n";
//wenn $htmltitle einem Verzeichnisnamen entspricht, so ist diese Variable zu
//diesem Zeitpunkt noch nicht gesetzt
#echo "<br>\$htmltitle: ".$htmltitle."\n";
//wenn $tabletitle einem Verzeichnisnamen entspricht, so ist diese Variable zu
//diesem Zeitpunkt noch nicht gesetzt
#echo "<br>\$tabletitle: ".$tabletitle."\n";
#echo "<br>\$tabletitlealternative: ".$tabletitlealternative."\n";


//Ausgabe einer Fehlermeldung mit Apache 2 sobald $subdir leer (nicht gesetzt)
//ist; es wird geprueft, ob $subdir gesetzt ist und wenn nicht, wird $subdir mit
//einem leeren Wert belegt
if (isset($subdir)) {
   //nichts machen
} else {
   $subdir = "";
}

//folgende Zeile auskommentieren, um zu sehen welches Unterverzeichnis übergeben
//wurde (wenn überhaupt eines übergeben wurde):
#echo "<br>\$subdir: ".$subdir."\n";


//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);


//folgender Abschnitt (bis #echo "<br>\$subdir (korrigiert mit /): ".$subdir."\n";)
//prueft, ob bei einem uebergebenem Unterverzeichnis ($subdir) der Schraeg-
//strich (Zeichen /) hinter dem Unterverzeichnis fehlt; wenn ja wird der
//Schraegstrich ergaenzt

   $pattern1_subdir = "|\/$|isU";
   $test1_subdir = preg_match_all($pattern1_subdir, $subdir, $hit1_subdir);

   $pattern2_subdir = "|.*?|isU";
   $test2_subdir = preg_match_all($pattern2_subdir, $subdir, $hit2_subdir);

   //zu Testzwecken auskommentieren, um die Treffer zu sehen ($hit1_subdir[0][0]
   //ist bei Treffer ein Schraegstrich (Zeichen /), $hit2_subdir[0][0] ist bei
   //Treffer der Name des Unterverzeichnisses (falls ein Schraegstrich vorhanden
   //ist, wird dieser mit angezeigt))
   #echo "<br>\$hit1_subdir[0][0]: ".$hit1_subdir[0][0]."\n";
   #echo "<br>\$hit2_subdir[0][0]: ".$hit2_subdir[0][0]."\n";

   $subdir = preg_replace($search_rfc1738, $replace_with_specialcharacter, $subdir);
   $shownsubdir = $subdir;
   $subdir = preg_replace($search_specialcharacter, $replace_with_rfc1738, $subdir);

   if ($hit1_subdir[0][0]=="/") {
      //nichts machen, der benötigte Schraegstrich (Zeichen /) ist hinter dem
      //Unterverzeichnis ($subdir) vorhanden
   } else {
      if ($hit2_subdir[0][0]=="") {
         //nichts machen, da $subdir leer ist (d.h. es wurde kein
	 //Unterverzeichnis uebergeben)
      } else {
         //es wurde ein Unterverzeichnis ($subdir) uebergeben, aber es fehlt
	 //der Schraegstrich (Zeichen /) hinter dem Unterverzeichnis
         $subdir = $subdir."/";
      }
   }
   //zu Testzwecken auskommentieren, um zu sehen ob $subdir nun korrekt (d.h.
   //mit Schraegstrich am Ende) dargestellt wird:
   #echo "<br>\$subdir (korrigiert mit /): ".$subdir."\n";


$url = $initialurl; //$initalurl stammt aus piwip.conf
$url = $url.$subdir;

//zu Testzwecken auskommentieren, um $url zu pruefen
#echo "<br>\$url: ".$url."\n";

//herausloesen des hintersten Verzeichnisses aus der url (im Beispiel
//http://www.example.com/Gallery/Holidays/Eastern/ ist dies "Eastern"):
$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";

//$gallerydirectory ist das hinterste Verzeichnis aus $url
$gallerydirectory = $hit_url[2][0];
$gallerydirectory = preg_replace($search_rfc1738, $replace_with_specialcharacter, $gallerydirectory);
//$showngallerydirectory wird zur Anzeige in der "Uebersichts"tabelle benoetigt
$showngallerydirectory = $gallerydirectory;
$gallerydirectory = preg_replace($search_specialcharacter, $replace_with_rfc1738, $gallerydirectory);
$url = preg_replace($search_specialcharacter, $replace_with_rfc1738, $url);

//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://www.example.com/Gallery/) und die ausgegebene Seite lokal als
//IndexBildserver.html speichern [unter SuSE Linux 8.2 Professional z.B.
// /srv/www/htdocs/test/IndexBildserver.htm]);
//zu Testzwecken koennen folgende Zeilen auskommentiert werden:
#$url = "http://localhost/test/IndexBildserver.html";
#$gallerydirectory = "Gallery";
#echo "<br>\$url: ".$url."\n";
#echo "<br>\$subdir: ".$subdir."\n";
#echo "<br>\$gallerydirectory: ".$gallerydirectory."\n";


//piwip.conf muss erneut eingelesen werden, wenn fuer den html-Titel und/oder
//Tabellentitel die Variable $showngallerydirectory gesetzt ist
include ($includepath."piwip.conf");

//Einfuegen des HTML-Headers
include ($includepath."html_header.inc");

//Einfuegen der Logos
include ($includepath."logos.inc");

//Einfuegen eines Absatzes
include ($includepath."break.inc");


//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);


      //$comparedirectory (wird gesetzt nachdem nachfolgende if-Bedingung
      //abgearbeitet wurde) wird benoetigt, weil der PHP-Server den Inhalt von
      //$subject eigenmaechtig zerstueckelt hat (zuwenig zugeteilter Arbeits-
      //speicher???)
      if ($comparedirectory == $gallerydirectory)
      {
         //nichts machen, der PHP-Server liest gerade den zweiten (oder dritten
         //oder vierten) Teil eines eigenmaechtig zerstueckelten $subject,
         //der fuer die Abarbeitung wichtige erste Teil wurde schon gelesen (in
         //der nun folgenden else-Bedingung)
      } else {

         //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_pic), 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";

         //Festlegung, ob mindestens ein Bild existiert (wenn ja hat $test_pic
	 //den Wert "1"):
         $test_pic = preg_match($pattern_pic, $subject);

         //zu Testzwecken auskommentieren, um zu sehen ob mindestens ein Bild
	 //vorhanden ist:
         #echo "<br>\$test_pic: ".$test_pic."\n";

         //Einfuegen des Tabellen-Headers
         include ($includepath."table_header.inc");

            //Pruefung, ob mindestens ein Bild existiert (wenn ja hat $test_pic
	    //den Wert "1")
         if ($test_pic==0) {
            //nichts machen
         } else {
            //falls das Verzeichnis mindestens ein Bild enthaelt soll dieses
	    //Verzeichnis mit Verlinkung zu den Bildern angezeigt werden
            //Achtung: es wird bei mindestens einem vorhandenen Bild IMMER zu
	    //"Bilder Hochformat" UND "Bilder Querformat" verlinkt, auch wenn
	    //alle Bilder in nur einem Format sind !!!
            //Achtung: ein quadratisches Bild wird in der eigentlichen Bilder-
	    //galerie (gallery.php) sowohl bei Hochformat als auch bei Quer-
	    //format angezeigt (siehe dazu Datei "gallery.php") !!!
            echo "<tr><td>";
            echo "<font size=\"+1\"><span style=\"font-weight: bold;\">";
            echo $showngallerydirectory;
            echo "</span></td>";

            echo "<td></td>";

            echo "<td>";
            echo "<a href=\"gallery.php?subdir=".$subdir."&align=portrait\">Bilder Hochformat</a>";
            echo "</td>";

            echo "<td>";
            //align=landscape wird in folgender Zeile nicht benoetigt
            echo "<a href=\"gallery.php?subdir=".$subdir."\">Bilder Querformat</a>";
            echo "</font>";
            echo "</td></tr>";

         }

         //regulaere Ausdruecke (Regular Expressions), hier um
	 //(Unter)Verzeichnisse ausfindig zu machen

         //zum Verstaendnis in folgenden zwei Zeilen ein Ausschnitt (eine
	 //Zeile) aus dem directory listing:
         //<img src="folder.gif" alt="[DIR]"> <a href=
	 //"20040626/">20040626/</a>      29-Jun-2004 23:09   -  <br>
         //das Verzeichnis 20040626 wird spaeter aus dem Abschnitt
	 // /">20040626/</a>  genommen

         //Festlegung des Suchmusters (pattern), um die Verzeichnisse (z.B.
	 //20040626) aus dem directory listing herauszuloesen (Suchmuster
	 //muss bei anders aussehendem directory listing angepasst werden):
         $search_dir_before = "\/\">";
         $search_dir = ".*?";
         $search_dir_after = "\/<\/a>";
         $pattern_dir = "/($search_dir_before)($search_dir)($search_dir_after)/imU";

         //herausloesen der Verzeichnisse (z.B. 20040626) aus dem directory
	 //listing:
         preg_match_all($pattern_dir, $subject, $hit_dir);

         //zu Testzwecken auskommentieren, um die Treffer zu sehen
         #echo "<br>\$hit_dir[2][0]: ".$hit_dir[2][0]."\n";
         #echo "<br>\$hit_dir[2][1]: ".$hit_dir[2][1]."\n";
         #echo "<br>\$hit_dir[2][2]: ".$hit_dir[2][2]."\n";
         #echo "<br>\$hit_dir[2][3]: ".$hit_dir[2][3]."\n";

         //zu Testzwecken auskommentieren, um die Anzahl der gefundenen
	 //Unterverzeichnisse zu sehen:
         #echo "<br>count(\$hit_dir[0]): ".(count($hit_dir[0]))."\n";

         for ($i = 0; $i < count($hit_dir[0]); $i++)
         {

            $newdirectory = $hit_dir[2][$i];
            $shownnewdirectory = $newdirectory;
            $newdirectory = preg_replace($search_specialcharacter, $replace_with_rfc1738, $newdirectory);

            //zu Testzwecken auskommentieren, damit man sieht ob die richtigen
	    //Verzeichnisnamen gefunden wurden:
            #echo "<br>\$newdirectory: ".$newdirectory."\n";
            #echo "<br>\$shownnewdirectory: ".$shownnewdirectory."\n";

            //Ausgabe der eigentlichen Tabelle (1. Spalte; Name des
	    //Unterverzeichnisses)
            echo "<tr><td>";
            echo "<font size=\"+1\"><span style=\"font-weight: bold;\">";
            echo $shownnewdirectory;
            echo "</span></td>";

            $urlsubdirectory = $url.$newdirectory;
            $urlsubdirectory = preg_replace($search_specialcharacter, $replace_with_rfc1738, $urlsubdirectory);

            //eine lokale Kopie des ausgegebenen directory listing des
	    //Bildservers (zu Testzwecken kann darueberliegende Zeile
	    //kommentiert und dafuer folgende Zeilen auskommentiert werden):
            #$urlsubdirectory = "http://localhost/test/IndexSubdirectory.htm";
            #echo "<br>\$urlsubdirectory: ".$urlsubdirectory."\n";


            //oeffnen einer Verbindung zum Unterverzeichnis des Bildservers
            $fpsubdirectory = fopen ("$urlsubdirectory","r");

            if ($fpsubdirectory)
            {
               while (!feof($fpsubdirectory))
               {
                  //$subjectsubdirectory ist der später zu durchsuchende Text
                  $subjectsubdirectory = fread($fpsubdirectory,200000);

                  //$comparedirectory (wird gesetzt nachdem nachfolgende
		  //if-Bedingung abgearbeitet wurde) wird benoetigt, weil
		  //der PHP-Server den Inhalt von $subjectsubdirectory
		  //eigenmaechtig zerstueckelt hat (zuwenig zugeteilter
		  //Arbeitsspeicher???)
                  if ($comparedirectory == $newdirectory)
                  {
                     //nichts machen, der PHP-Server liest gerade den zweiten
		     //(oder dritten oder vierten) Teil eines eigenmaechtig
		     //zerstueckelten $subjectsubdirectory, der fuer die
		     //Abarbeitung wichtige erste Teil wurde schon gelesen (in
                     //der nun folgenden else-Bedingung)
                  } else {

                     //zu Testzwecken auskommentieren, um $subjectsubdirectory
		     //anzusehen:
                     #echo "<br>\$subjectsubdirectory: ".$subjectsubdirectory."\n";

                     //erneute Suche, um zu sehen ob das bestimmte Verzeichnis
		     //weitere Unterverzeichnisse hat:

                     //Festlegung, ob mindestens ein Unterverzeichnis existiert
		     //(wenn ja hat $test_dir den Wert "1"):
                     $test_dir = preg_match($pattern_dir, $subjectsubdirectory);

                     //zu Testzwecken auskommentieren, um zu sehen ob mindestens
		     //ein Unterverzeichnis vorhanden ist:
                     #echo "<br>\$test_dir: ".$test_dir."\n";

                     //Ausgabe der Tabelle (2. Spalte; bei vorhandenen weiteren
                     //Unterverzeichnissen "Verzeichnis ansehen"-Dialog anzeigen)

                     //Pruefung, ob mindestens ein Unterverzeichnis existiert
		     //(wenn ja hat $test_dir den Wert "1")
                     if ($test_dir==0) {
                        echo "<td></td>";
                     } else {
                        echo $shownsubdir;
                        echo "<td><a href=\"index.php?subdir=".$subdir.$newdirectory."/\">Verzeichnis ansehen</a></td>";
                     }


                     //Suche um herauszufinden, ob das entsprechende Verzeichnis
		     //Bilder (z.B. im001382.jpg) enthält:

                     //Festlegung, ob mindestens ein Bild existiert (wenn ja
                     //hat $test_pic den Wert "1"):
                     $test_pic = preg_match($pattern_pic, $subjectsubdirectory);

                     //zu Testzwecken auskommentieren, um zu sehen ob mindestens
		     //ein Bild vorhanden ist:
                     #echo "<br>\$test_pic: ".$test_pic."\n";


                     //Ausgabe der Tabelle (3. und 4. Spalte; bei vorhandenen
		     //Bildern Link zur eigentlichen Galerie [3. Spalte: Galerie
		     //mit Bildern in Hochformat; 4. Spalte: Galerie mit Bildern
		     //in Querformat] anzeigen)

                     if ($test_pic==0) {
                        echo "<td></td><td></td>";
                     } else {
                        //falls das Verzeichnis mindestens ein Bild enthaelt
			//soll dieses Verzeichnis mit Verlinkung zu den Bildern
			//angezeigt werden
                        //Achtung: es wird bei mindestens einem vorhandenen Bild
			//IMMER zu "Bilder Hochformat" UND "Bilder Querformat"
			//verlinkt, auch wenn alle Bilder in nur einem Format
			//sind !!!
                        //Achtung: ein quadratisches Bild wird sowohl bei
			//Hochformat als auch bei Querformat angezeigt (siehe
			//Datei "gallery.php") !!!
                        echo "<td>";
                        echo "<a href=\"gallery.php?subdir=".$subdir.$newdirectory."/&align=portrait\">Bilder Hochformat</a>";
                        echo "</td>";
                        echo "<td>";
                        echo "<a href=\"gallery.php?subdir=".$subdir.$newdirectory."/\">Bilder Querformat</a>";
                        echo "</td>";
                     }

                  }//Ende if ($comparedirectory == $newdirectory)
                  $comparedirectory = $newdirectory;

                   }//Ende while (!feof($fpsubdirectory))

                   fclose($fpsubdirectory);

            }//Ende if ($fpsubdirectory)

         }//Ende for ($i=0; $i< count($hit2[0]); $i++)

         //Einfuegen des Tabellen-Fusses
         include ($includepath."table_foot.inc");

      }//Ende if ($comparedirectory == $gallerydirectory)
      $comparedirectory = $gallerydirectory;

   }//Ende while (!feof($fp))

   fclose($fp);

}//Ende if ($fp)

//Einfuegen des HTML-Fusses (meist </body></html>)
include ($includepath."html_foot.inc");

?>
Return current item: PiwiP