Wörterbuchbasierte HTML Silbentrennung
Bei Verwendung von Blocksatz können Seiten besonders auf kleinen Bildschirmen (Smartphones) manchmal
sehr zerrissen aussehen. Einige Browser wie z.B. Firefox führen zwar eine Silbentrennung durch (die
leider auch nicht immer ganz korrekt ist, so trennt er z.B. Sicher-ung
statt korrekt Siche-rung
), der z.Zt. am häufigsten eingesetzte Browser (Google Chrome)
beherrscht dies jedoch nicht. So ist es unumgänglich, Trennvorschläge (Soft Hyphens
, ­) zumindest
bei längeren Worten in die HTML-Seiten mit einzubauen.
Bisher habe ich das immer von Hand getan während oder nach dem Schreiben der Inhalte. Später entschied ich mich dafür, ein kleines Perl-Skript zu schreiben, das die Silbentrennung durchführt.
hyphenateHTML
Dieses Skript realisiert eine wörterbuchbasierte Silbentrennung für HTML-Dateien. Dazu wird die Datei zunächst eingelesen und dann der normalerweise im Browser sichtbare Text anhand eines Wörterbuchs mit Trennvorschlägen versehen. Damit wird verhindert, versehentlich Tags oder Attribute zu trennen was die Datei praktisch unbrauchbar machen würde. Lesen und Schreiben der Datei erfolgt mit dem Perl-Modul HTML::TreeBuilder, was recht problemlos möglich war.
Allerdings müssen Sie die Option ignore_unknown(0) setzen, da es sonst math-Tags entfernt, da es diese offensichtlich (immer noch) nicht kennt.
Voraussetzungen
hyphenateHTML benötigt folgende Perl-Module, die Sie, sofern noch nicht vorhanden, auf den meisten Systemen mit cpan install <name> installieren können:
- HTML::TreeBuilder
- IO::HTML
- File::Copy
- Getopt::Long
Installation
Kopieren Sie das Skript nach /usr/local/bin und die Wörterbücher nach /usr/local/etc. Wenn Sie wollen können Sie den Pfad für die Wörterbücher im Skript mit der Variable $dictpath anpassen.
Einsatz
Wenn Sie hyphenateHTML -h eingeben erhalten Sie eine ausführliche Beschreibung der verfügbaren Optionen. Ich verwende
aus dem Root-Directory der Site für den täglichen Einsatz, allerdings (aus anderen Gründen) immer nur in einer Kopie davon. Durch die I-Option (In-Place
) wird die Originaldatei überschrieben. Dabei gab es bisher keine Probleme. Schlimmstenfalls kann man alle ­ wieder entfernen. Wenn Sie vorsichtiger sein wollen, nehmen Sie
Damit wird vor dem Schreiben die Originaldatei in .bak umbenannt.
Der Aufruf mit
ist gut zum Verfeinern des Wörterbuchs. So bleibt die Originaldatei erhalten und eine neue Datei <name.html.hyp.html> wird erstellt. Diese können Sie dann wieder und wieder im Browser oder einem Editor testen.
Speziell bei Verwendung großer Wörterbücher (wie Werners Liste
vom Dante-Projekt mit fast einer halben Million Einträgen) dauert das Einlesen des Wörterbuchs deutlich länger als die eigentliche Trennung. Deshalb gibt es eine --recursive-Option, so dass man die ganze Website trennen kann und trotzdem das Wörterbuch nur einmal einlesen muss.
Wörterbücher
Ich habe ein deutschsprachiges Wörterbuch sowie eine Ignore-Liste (Worte die nicht getrennt werden können oder sollen), natürlich hauptsächlich mit Worten, die auf meiner Site vorkommen, erstellt. Bei den enthaltenen Wörtern war ich mir entweder sicher oder ich habe sie im Duden nachgeschlagen. Es kann also durchaus auch Fehler enthalten. Das Format ist hier übrigens das gleiche wie im Duden, Sie können die Trennung mit Copy-And-Paste übernehmen.
Mein Skript führt keine Grammatik-Überprüfung durch. Soll heißen, Wörter wie ähnlich
, die normalerweise klein geschrieben werden, müssen auch groß geschrieben existieren falls sie mal am Satzanfang vorkommen.
Dies erklärt aber nur teilweise die 2600+ Einträge meines Wörterbuchs, die Aspell nicht kennt...
Format
Das Wörterbuch enthält ein Wort pro Zeile. Mögliche Trennstriche sind als senkrechter Strich (|
) zu setzen.
Die Reihenfolge der Wörter spielt keine Rolle. Ich sortiere die Datei gelegentlich der Lesbarkeit wegen aber es ist nicht erforderlich.
Inzwischen wird auch das Dante-Format (siehe Downloads) unterstützt. Es unterscheidet zwischen verschiedenen Arten von Trennstellen, wobei unschöne Trennstellen (wie bein-halten
oder Urin-stinkt
) entfernt werden.
Bekannte Probleme
Worte mit hervorgehobenen Teilen (wie z.B. Approximation
), die also ein Tag innerhalb eines Wortteils haben, werden nicht als ganzes erkannt, erzeugen einen Fehler und werden entsprechend auch nicht korrekt getrennt.
Die Lösung scheint aufwändig, der Erfolg eher gering. Auf meiner Homepage sind davon z.Zt. drei Worte davon betroffen, die Motivation sie zu implementieren ist also eher gering :-)
Ein Workaround könnte sein, diese Worte manuell zu trennen und die ‑k-Option (‑‑keepshy) zu verwenden.
Downloads
- Das Perl-Skript hyphenateHTML.
- Mein bescheidenes deutschsprachiges Wörterbuch.
- Meine Ignore-Liste. Dabei handelt es sich einfach nur um ein Wörterbuch, nur ohne Trennstriche und sie wird auch als solches geladen.
- Im Dante-Projekt gibt es eine sehr umfangreiche Wortliste.