#!/usr/bin/perl -w ################################################################################ # Programm: findhtml.pl # # Autor : Ingo Strauch # The_One_Brack@Bigfoot.Com # http://come.to/Brack # # Datum : 17.04.2000 (22:56 CET) Version 1.1.2 # # Nutzen : Dieses Programm erstellt ein HTML-Dokument mit einer Inhaltsübersicht # über die HTML-Dateien in vorher angegebenen Verzeichnissen. Zu jedem # Verzeichnis wird eine Tabelle erstellt, in der die Dateien sortiert # angezeigt werden. # Sehr gut geeignet ist das Programm, wenn sich in mehreren Verzeichnissen # die Dateien oft ändern oder häufig neue hinzukommen. # # Planung : Das Suchmuster soll wählbar werden, so daß man später auch # nach anderen Dateitypen suchen kann. # Eine Sicherung muß eingebaut werden, wenn das Konfiguration-File # nicht die korrekte Struktur hat. # # Updates: Gegenüber Version 0.8.1 werden die Funktionen jetzt mit Parametern # aufgerufen. Da dies etwas schwieriger als gedacht war, befinden sich # noch eine Menge auskommentierter Kontrollschleifen im Script. # # Gegenüber Version 1.0.1 wurden die Arrays @gefiltert und @SortHtml # weggelassen. Außerdem wird die Datei, in die geschrieben wird, nicht # mehrfach geöffnet und wieder geschlossen, sondern am Stück erstellt. # # Gegenüber Version 1.0.2 werden die zu scannenden Verzeichnisse und # die Datei, in die geschrieben wird, jetzt aus einer Konfigurations- # datei gelesen (neue Funktion readconf). Außerdem wurden die Fehler- # meldungen intuitiver gestaltet. # # Gegenüber Version 1.1.1 wurde die Sortier-Routine wesentlich verein- # facht. Jetzt sind keine Tricks mehr nötig seitdem ich weiß, wie man # den Sortieralgorithmus für 'sort' spezifiziert ################################################################################ ################################################################################ # In @VERZEICHNIS stehen alle Verzeichnisse gespeichert, die nach HTML-Dateien # durchsucht werden sollen. # In $WRITE_TO wird die Datei angegeben, in die das Suchergebnis gespeichert wird # Diese beiden Variablen werden aus einer Konfigurationsdatei eingelesen. # In @Eintraege werden die Dateinamen eines zu scannenden Verzeichnisses abge- # legt und danach gefiltert und sortiert. ################################################################################ my @VERZEICHNIS=(""); my $WRITE_TO=""; my @Eintraege = (""); ##################################### Start########################################### print "\n"; @VERZEICHNIS = &readconf; # liest die Konfigurationsdatei $WRITE_TO = shift(@VERZEICHNIS); # erster Eintrag ist die zu speicherne Datei &anlegen($WRITE_TO); # erstellt die zu speichernde Datei for(@VERZEICHNIS) { $VERZEICHNIS = $_; @Eintraege = &oeffnen($VERZEICHNIS); # öffnet das Verzeichnis # for($j = 0 ; $j < scalar(@Eintraege) ; $j++) # { # print $Eintraege[$j], "\n"; # } # print "Ende der Einträge!\n"; @Eintraege = &filtern(@Eintraege); # filtert Dateien mit den passenden Endungen heraus # for($j = 0 ; $j < scalar(@Html) ; $j++) # { # print $Html[$j], "\n"; # } # print "Ende der Gefilterten!\n"; @Eintraege = &sortieren(@Eintraege); # sortiert die Dateien &speichern($VERZEICHNIS, @Eintraege); # erstellt eine Tabelle im Inhaltsverzeichnis print "Erfolgreich die Dateien in " , $VERZEICHNIS , " gescannt.\n"; } &schliessen; # schließt das Inhaltsverzeichnis korrekt ab print "\nDie Übersicht befindet sich jetzt in '$WRITE_TO'.\n\n"; ######################################## Prozeduren ############################# ################################################################################ # readconf: Öffnet die Konfigurationsdatei, in der die Datei, in die gespeichert # werden soll, und die zu scannenden Verzeichnisse angegeben sind. # Es wird zuerst nach ".findhtml.conf", dann nach "~/.findhtml.conf" # und zuletzt nach "/usr/local/etc/findhtml.conf" gesucht. Existiert # keine dieser Dateien, bricht das Programm ab. # # Parameter: kein Parameter # # liefert: Array, dessen erster Eintrag den Dateinamen und dessen restliche # Einträge die Verzeichnisse enthalten. ################################################################################ sub readconf { my @gefiltert; if (open(CONF, ".findhtml.conf")) { } else { if (open(CONF, "$ENV{'HOME'}/.findhtml.conf")) { } else { open(CONF, "/usr/local/etc/findhtml.conf") || die "\nKonnte Konfigurationsdatei nicht öffnen!\nBitte schauen Sie in der Dokumentation nach.\n\n"; } } my @Zeilen = ; close(CONF); foreach $zeile (@Zeilen) { if (!($zeile =~ /^\#/) && !($zeile =~/^\n/)) { $zeile =~ s/\n| //g; push (@gefiltert, $zeile); } } return (@gefiltert); } ################################################################################ # oeffnen: Liest den Inhalt des Verzeichnisses, welches als Parameter übergeben # wird. # # Parameter: ein (absoluter) Verzeichnisname in einem String. # # liefert: Array mit den Einträgen des Verzeichnisses ################################################################################ sub oeffnen { # print "Öffne Directory $_[0]\n"; opendir(DIR, "$_[0]") || die "Konnte Directory $_[0] nicht öffnen!\n"; my @Zeilen = readdir(DIR); closedir(DIR); return @Zeilen; } ################################################################################ # filtern: Filtert aus einer Dateiliste die HTML-Dateien heraus, berücksichtigt # *.html, *.htm, *.shtml # # Parameter: Ein Array mit Dateinamen # # liefert: Array mit den HTML-Dateien aus der übergebenen Liste ################################################################################ sub filtern { my @gefiltert = (""); my @Zeilen = @_; # for($j = 0 ; $j < scalar(@Zeilen) ; $j++) # { # print $Zeilen[$j], "\n"; # } # print "Der Funktion filtern übergeben!\n\n"; for($j = 0 ; $j < scalar(@Zeilen) ; $j++) { if($Zeilen[$j] =~ /\.htm/) { push(@gefiltert, $Zeilen[$j]); } else { if($Zeilen[$j] =~ /\.shtm/) { push(@gefiltert, $Zeilen[$j]); } } } # for($j = 0 ; $j < scalar(@gefiltert) ; $j++) # { # print $gefiltert[$j], "\n"; # } # print "Ergebnis der Funktion filtern!\n\n"; shift(@gefiltert); # Gott weiß wieso, aber das erste Element ist leer... # Muß abgetrennt werden! return(@gefiltert); } ################################################################################ # sortieren: Sortiert die Dateiliste, dabei wird nicht auf Groß- und Klein- # schreibung geachtet. # Parameter: Ein unsortiertes Array mit Namen. # # liefert: Array mit den sortierten Namen (case insensitive) ################################################################################ sub sortieren { my @sorted; @sorted = sort { uc($a) cmp uc($b)} @_; return @sorted; } ################################################################################ # ausgeben: Gibt die Elemente eines Arrays oder einen String aus, zur Überprüfung # deren Inhalte. # # Parameter: String oder Array von Strings # # liefert: keine Rückgabe ################################################################################ sub ausgeben { for(@_) { print $_ , "\n"; } } ################################################################################ # anlegen: Legt die Datei an, in die die gefundenen HTML-Dateinamen eingetragen # werden, wobei zunächst nur ein Rumpf erstellt wird. Eine bereits # bestehende Datei mit diesem Namen wird ohne Warnung überschrieben! # # Parameter: String mit Dateinamen, unter dem gespeichert werden soll. # # liefert: keine Rückgabe ################################################################################ sub anlegen { open(DATEI, ">$_[0]") || die "Fehler beim Erstellen von $_[0]!"; print DATEI "\n\n"; # HTML-Datei schreiben print DATEI "HTML-Dateien\n"; print DATEI "\n\n"; } ################################################################################ # speichern: Speichert die Namen in einem Array als Tabelle in ein HTML-Dokument. # # Parameter: String mit dem Verzeichnisnamen, aus dem die zu speichernden Dateien # stammen. # Array der abzuspeichernden Dateinamen. # # liefert: keine Rückgabe ################################################################################ sub speichern { my $VERZEICHNIS = shift(@_); my @sorted = @_; # for($j = 0 ; $j < scalar(@sorted) ; $j++) # { # print $sorted[$j], "\n"; # } print DATEI "

\n

Dateien im Ordner " , $VERZEICHNIS , "

\n"; print DATEI "\n\n"; for($i = 0 ; $i < scalar(@sorted) ; $i++) { if(!($i%5)) { print DATEI "\n"; } print DATEI "
", $sorted[$i] , "\n"; } print DATEI "
\n"; } ################################################################################ # schliessen: Hängt noch die nötigen Schluß-Tags an das Inhaltsverzeichnis. # # Parameter: kein Parameter # # liefert: keine Rückgabe ################################################################################ sub schliessen { print DATEI "\n\n\n"; close (DATEI); }