#!/usr/bin/perl -w

# This program is under the GPL 

# Written by Matthias Kabel <gutenberg@tyche.de>
# No warranty

# Ok, code starts here, very fast hack, very ugly feel free to do better

use Getopt::Std;
use LWP::Simple;

# Kommandozeile lesen und auswerten, oder erklären wie es geht.
%option = ();
getopts("u:vhop:", \%option);

if ($option{h}) { using();}



if ($option{o}) {
  $outfile = $option{o};
}
else {
  $outfile = "gutenberg.html";
}

if($option{l}) {
  $localfile = $option{l};
}
else
  {
    $localfile = "/tmp/gutenberg.html";
  }

if ($option{u}) {
  $url = $option{u};
}
else {
  if ($option{h}) {
    exit(0);
  }
  else {
#    print "Was soll ich denn holen? Bitte doch so: $0 -u START_URL\n";
    using();
    exit (0);
  }
}

$url =~ /(.*\/)(.*)/;
$base_url = $1;
$datei_url = $2;

$vorige_datei = "";

$HTML_END = "\n</body>\n</html>\n";
$folge_datei = 0;

open(OUTFH, ">$outfile") || die ("Konnte Ausgabedatei nicht öffnen");

# Prüfen, ob es sich um die Druckversion handelt
# wenn nicht, holen wir diese
druckversion();

# Schleife, bis alle Dateien bei Gutenberg abgearbeitet sind
while ($url ne $vorige_datei) {

# Sicherheitshalber, falls es keine nächste Datei gibt
  $vorige_datei = $url;

# Jetzt holen wir die aktuelle Datei und speichern sie
  print "Holen der Datei $url\n";

   LWP::Simple::getstore($url, $localfile);

# Zunächstmal wollen wir nichts rausschreiben, da uns die ganze
# Werbung nicht interessiert
  $flag = 0;

# Abarbeiten der gespeicherten Datei
  open(INFH, "<$localfile") || die ("Eingabedatei nicht gefunden!");

  print "Verarbeiten\n";

  while(<INFH>) {
    chomp $_;
	
# Fortschrittsanzeige	
    print ".";

# Jetzt wird es ernst:
# Prüfen, welche Kopfeinträge wir wann brauchen

# Wir holen immer die Druckversion, so müssen wir nicht
# nach einer Kopfgrafik der normalen Seiten suchen
    if ($folge_datei == 0)  {
      $flag = 1;
    }

# Bei einer Folgedatei haben wir schon den Titel
    if ($folge_datei == 1 and $flag == 0) {
# Wir suchen also nach dem <BODY>
      if ($_ =~ /<BODY>/) {
	$flag = 1;
	next;
      }
    }

# Aber wir wollen nie das </BODY> oder </HTML>
      if ($_ =~ /<\/HTML>/) {
	$flag = 0;
      }
      if ($_ =~ /<\/BODY>/) {
	$flag = 0;
      }

# Ende des Textabschnittes, Schaltfläche zurück
    if ($_ =~ /bwd.gif/) {
      $vorige_datei = $url;
# Der hilft uns auch nichts, also weiter
      next;
    }

# Wir suchen den Vorwärts-Knopf
# suchen uns den Link und
      if($_ =~ /fwd.gif/){
	$_ =~ /(.*)(HREF=\")(.*htm)(\".*)/;
	$url = $base_url.$3;
	$datei_url = $3;
# prüfen auf die Druckversion
	druckversion();
# Dem Programm mitteilen, daß wir uns in einer Folgedatei befinden
	$folge_datei = 1;
	$flag = 0;
	next;
      }

# Ok, wir haben den eigentlichen Text und können ihn ausgeben
    if ($flag ==1){
      print OUTFH "$_\n";
    }

# Alles nach der Fußzeile entfernen	

    if ($_ =~ /<hr/) {$flag = 0;}
  }
}

  close (INFH);


# Die HTML-Datei sauber abschließen
 print OUTFH $HTML_END;
close(OUTFH);

print "\nDas war's scheinbar\n";
print "Der Text steht nun in $outfile zu Verfügung\n";
print "Und Tschüß\n";

# Wenn plucker laufen soll, dann aufrufen
if ($option{p}) {
  invoke_plucker();
}
exit(0);

#######################

sub druckversion {

  if ($url =~ /Druckversion/) {
    print "Sehr aufmerksam, schon die Druckversion angegeben.\n";
  }
  else {
    print "\nVorschlag Gutenberg: $url\n";
    $url = $base_url."Druckversion_".$datei_url;
    print "\nWir wollen aber die Druckversion:\n $url\n\n";
  }
}


############################

sub using {

  print "Kurzanleitung gutenberg.pl:\n";
  print "\ngutenberg.pl -u URL -h  -v -o \n\n";
  print "-u URL; Start-URL\n";
  print "-h help\n"; 
  # print    "-v verbose\n";
  print "-o outputfile\n";
  print "-l tempfile : Pfad und Name für die temporäre Speicherung, wenn nicht angegeben,\n";
  print "                   dann /tmp/gutenberg.html. Sollte unter Windows immer angegeben werden.\n";
  print "-p dateiname : ruft  plucker auf\n"; 
  print "\nBeispiel: gutenberg.pl -u  http://gutenberg.spiegel.de/heine/bachrach/bachrach.htm -o bacherach  -p bacherach\n";
}

#######################

sub invoke_plucker {

  print "Starte plucker\n";
  system ("plucker-build -f $option{p} --zlib-compression --stayonhost file:$outfile")

}


#######################################
# Doku
#######################################

=pod Doku

=head1 gutenberg.pl

gutenberg.pl holt Dateien vom deutschen Gutenbergprojekt und setzt sie zusammen

=head1 Syntax

-h: gibt eine Kurzanleitung aus

-u Start-URL: URL, von der das Programm sich die Folgedateie sucht.

-l tempfile: Datei zum Zwischenspeichern, sollte unter Windows immer angegeben werden.

-v: verbose

-p Dateiname: ruft plucker auf und erzeugt ein Dateiname.pdb für den Palmreader,
 dabei wird die Option --zlib-compression benutz, da diese bessere Ergebnisse erzeugt
 als die normale doc-Kompression, weitere Optionen werden hart gesetzt
 --stayonhost
 Alles andere muß in .pluckerrc gesetzt werden.

=head1 Beispiel

gutenberg.pl -u http://gutenberg.spiegel.de/heine/bachrach/bachrach.htm -o bacherach -p bacherach

Sucht sich die Druckversion der oben genannten URL, speichert sie
unter bacherach und ruft anschließend plucker-build -f bacherach ... auf.

=head1 TODO

Manchmal gibt es neben den üblichen fwd.gif auch andere links zu den weiterführendne Dateien
diese werden noch nicht erkannt.

Auch Inhaltsverzeichnisse zeigen nach dem Zusammensetzen ins Leere.

=cut

=cut


