Docbook, html2text und Co.
Lange Monate habe ich nach einer Lösung gesucht, meine FAQs nur in einer Fassung zu pflegen, daraus aber mit wenig bis keinem Aufwand sowohl eine ansehnliche, in meine Homepage eingepaßte (X)HTML-Fassung wie eine brauchbare Nur-Text-Fassung für das Usenet zu generieren, die nicht nach "lynx —dump" aussieht, sondern Aufzählungen, ja ggf. auch Tabellen verstehen kann.
Der erste Ansatz, nämlich asc2html, erwies sich nach längerem Nachdenken als schlicht dämlich - warum sollte ich eine Textfassung pflegen, aus der ich dann mit viel Umstand und Hängen und Würgen eine HTML-Fassung generiere? Das ist ooch quasi zum Scheitern verurteilt, weil HTML mehr Informationsgehalt als die Textfassung hat, der dann interpoliert werden muß. Außerdem verbricht das Tool eine gar schauderbare Tagsoup. :-/
Der zweite Ansatz war dann Docbook. Monatelange Pause, fast ein Jahr, bis ich mich dann mal dazu aufraffen konnte, damit zu experimentieren. Zwei lange Abende und Nächte später, die ich mit Tutorials und Cygwin verbrachte, wurde mir dann klar: das ist auch nicht das, was ich will. Die Vorteile - alles mögliche daraus generieren zu können - brauche ich nicht wirklich; LaTEX und PDF sind ja fein, aber nicht das eigentliche Ziel. Und warum soll ich von SGML nach HTML und von da nach Text konvertieren?
Die Lösung: ich pflege einfach die HTML-Fassung und konvertiere die dann nach text/plain. Also kann ich die Suche nach diversen Varianten von sgmltools, die dann zufällig auch noch bei mir laufen, aufgeben, und nach brauchbaren html2text-Konverntern suchen.
Nicht, daß diese Suche erfolgreicher gewesen wäre. :-/
Am Ende bleibe ich bei html2text hängen: das macht seine Sache gut und ist recht weit konfigurierbar. Nur bringt mich da dann der Zeilenumbruch schier zur Verzweiflung: Zum einen werden selbst in <pre>-Bereichen zu lange Zeilen umgebrochen. Das ist aber Gift für die Header-FAQ, in der ich überlange Headerzeilen verarbeiten muß, die - für den Zweck des Usenet-Postings - bereits mit "|" und ">" am Anfang gequotet sind. Zum anderen trennt das doofe Ding bei allen nicht alphanumerischen Zeichen; ein Zeilenumbruch nach "-" oder gar nach "/" - in einer URL zum Beispiel - ist aber nicht brauchbar.
Verzweifeln hilft aber nichts, also reaktiviere ich meine rudimentären Perl-Kenntnisse und bearbeite das einfach noch einmal nach:
#!/usr/bin/perl
# wrap.pl < input.txt > output.txt
# (c) -thh 01/2005
use Text::Wrap qw(&wrap $columns);
$columns = 70;
while ( <> ) {
chomp;
# Zeile endet auf - oder /?
# dann Zeile schreiben und alles bis zur nächsten Leerzeile (=Absatz)
# einlesen, zusammenkleben, Zeilenumbrüche durch Leerzeichen ersetzen
# und durch Text::Wrap schieben
if (/[-\/]$/ and !/^[|>:]/) {
($zeile, $rest) = /(.+\s)(\S+)$/;
print "$zeile\n";
JOINLOOP: while ( <> ) {
$rest .= $_;
last JOINLOOP if (/^$/);
}
$rest =~ s/\n/ /g;
$_ = wrap('', '', $rest)."\n";
};
print $_;
# Zeile beginnt mit |, > oder :?
# dann solange Folgezeilen, die nicht mit einem dieser Zeichen beginnen,
# an das Ende der vorigen Zeile ankleben, bis eine Leerzeile folgt und
# den gequoteten Bereich beendet
if (/^[|>:]/) {
QUOTELOOP: while ( <> ) {
chomp;
if (/^$/) {
print "\n";
last QUOTELOOP;
} elsif (/^[|>:]/) {
print "\n$_";
} else {
print $_;
}
};
};
print "\n";
};
Noch ein kleines Shellscript, und dann wird alles gut:
wget http://th-h.de/faq/$1 -O output.html
html2text -nobs -width 70 -rcfile html2text.rc output.html > output.txt
./wrap.pl < output.txt > wrapped.txt
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
Thinker am :
Das Ding baut zumindest hier ein wenig Mist, hier krieg ich sowas:
<code> | Received: (qmail 1935 invoked by alias); 16 Sep 1998 15:36:06 - 0000 | Delivered-To: GMX delivery to karl-heinz@gmx.example | Received: (qmail 27698 invoked by uid 0); 16 Sep 1998 15:36:02 - 0000 | Received: from pbox.rz.rwth-aachen.example (137.226.144.252) | by mx3.gmx.example with SMTP; 16 Sep 1998 15:36:02 -0000 </code>
Thomas Hochstein am :
Hm, hier funktioniert es … Es war allerdings noch ein Bug drin, den ich gerade stillschweigend korrigiert haben, und es waren auch noch einige Fehler - und Inkompatibilitäten - im Markup.