Die Leser von Jekyll-Tricks und Fort von Typo3 wissen, dass ich ein engagierter Befürworter der statischen Generierung von Web-Bereichen bin. Über zwölf Jahre habe ich statische Generierung von Web-Bereichen mit Frame4-Tools betrieben. 2019 habe ich meine sowie die mir anvertrauten Web-Bereiche auf Jekyll (/Liquid) umgestellt.
Silbentrennung
Eine großzügige Dosis von von bedingten – oder “weichen” (soft) –
Trennstrichen ("­"
) kann das Erscheinungsbild eines
Webbereichs sehr verbessern insbesondere bei variablen Abmessungen und
abschaltbaren Menus. Andererseits ist das Einbringen der von “­s”
mühselig und fehlerträchtig, und es beeinträchtigt die Lesbarkeit für
Entwickler und Autoren. Ein bisschen Werkzeugunterstützung und Automatismen
wären willkommen.
Aber die Silbentrennung ist leider für viele Werkzeuge und Editoren ein
eher düsteres Kapitel – und das oft selbst dann, wenn die Sprache
bloß Englisch ist. Jekyll mach da keine Ausnahme.
Diese Beitrag zeigt ein Werkzeug, mit dem man die (markdown) Texte und
(html) layouts mit bedingten (“weichen” ­) Trennstrichen versehen
oder diese wieder entfernen kann.
Man benötigt lediglich ein aktuelles (implementation version >= 1.21.06) Frame4, am besten als “installed extension” unter Java8 sowie eine Definitionsdatei der gewünschten Trennungen in einer einfachen Syntax gemäß dieses Beispiels, passend zu Sprache und Themenbereichen Ihrer Texte.
Für alles Folgende brauchen Sie nur die Applikation
de.frame4j.FuR.
Falls Sie diese mit einem der folgenden Kommandos zum Angucken der Hilfe
starten können, haben Sie es.
java de.frame4j.FuR -help -de # show help in German (de)
java FuR -help -de # show help with comfort starter in English
Die Trennungsdatei
Der Auszug aus der aktuellen Trennungsdatei Beispieldatei zeigt die “ein Wort pro Zeile mit der gewünschten bedingten Trennung”-Grammatik:
---
# Definitions for [de-]hyphenation by de.frame4j.FuR
# A collection for German language for markdown texts and
# Jekyll web layouts. This file's encoding is UTF-8.
# Copyright 2021 Albrecht Weinert a-weinert.de
# $Revision: 58 $ # $Date: 2021-07-08 $)
---
Aus­bil­dungs­tag
Aus­dauer
aus­ge­nom­men
Be­rufs­wahl­messe
Blu­men­ge­stecke
dem­sel­ben
elek­tro­ni­sches
Ent­scheidungen
ent­wor­fen
er­hielt
Er­zie­hungs­be­rech­tigte
... und so weiter und so fort
Für eine bessere Lesbarkeit – und um die Datei der Germanistin Ihres
Vertrauens zur Korrektur zu geben – nutzen Sie das Tool FuR um
­
durch -
zu ersetzen.
D:\eclips...>java FuR hyphDef_de.txt -omitFrntM "­" "-"
D:\eclipse18-09WS\web-hansibo\factory\hyphDef_de.txt
157 occurrences of search texts
Der erste Parameter benennt die (in diesem Fall einzige) zu bearbeitende
Datei. Die Option -omitFrntM
sagt “Lass die Finger vom
sog. front matter”, während der zweite und dritte Parameter das
Suchmuster und und seinen Ersatz definieren. Das Ergebnis ist
---
# Definitions for [de-]hyphenation by de.frame4j.FuR
# A collection for German language for markdown texts and
# Jekyll web layouts. This file's encoding is UTF-8.
# Copyright 2021 Albrecht Weinert a-weinert.de
# $Revision: 58 $ # $Date: 2021-07-08 $)
---
Aus-bil-dungs-tag
Aus-dauer
aus-ge-nom-men
Be-rufs-wahl-messe
Blu-men-ge-stecke
dem-sel-ben
elek-tro-ni-sches
Ent-scheidungen
ent-wor-fen
er-hielt
Er-zie-hungs-be-rech-tigte
... und so weiter und so fort
Nach der in dieser Form durchgeführten Schlussredaktion vergessen Sie nicht die fürs Einfügen und Entfernen von bedingten Trennungen verwendbare From wieder herzustellen:
D:\eclips...>java FuR hyphDef_de.txt -omitFrntM "-" "­"
D:\eclipse18-09WS\web-hansibo\factory\hyphDef_de.txt
157 occurrences of search texts
Außer der Vertauschung von Suchmuster und Ersatz ist es dasselbe Kommando
wie eben. Nur so herum wird die Option -omitFrntM
wichtig, da
man sonst die Kommentare am Anfang verdirbt.
Das Trennen von Jekylls markdown Quelltexten
Um einen von Jekyll generierten Web-Bereich mit bedingten Trennungen zu
versehen, geht man am besten in’s Wurzelverzeichnis der betreffenden Quellen
mit beispielsweise
cd /D D:\eclipse18-09WS\web-hansibo\hansiboDE
In einem realistischen Beispiel würden wir zu allen Texten (Erweiterung
.md für markdown) ebenso wie zu allen Liquid templates (Erweiterung
.html oder .htm) bedingte Trennungen zufügen. Wir möchten dies auch in
allen Unterverzeichnissen tun, aber die Verzeichnisse
.jekyll-cache
, _data
and _site
und deren Unterverzeichnisse ausschließen.
Schritt 0: Alle bisherigen ­s entfernen
Bevor wir ­s gemäß unserer Definitionsdatei einfügen, mag man meist
das bisher “Handgemachte” entfernen. Im erwähnten Wurzelverzeichnis der
der Jekyll-Quellen macht
java FuR -r .md;.html;.htm -filUTF8 -OmitDirs _site;.jekyll-cache;_data -omitFrntM
­" -v
genau das.
FuR :
Die beliebtesten / am meisten genutzten
Frame4-Tools
haben eine Start-Applikation im unbenannten Verzeichnis. FuR
delegiert schlicht und einfach an
de.frame4j.FuR.
-r .md;.html;.htm -filUTF8 :
Rekursiv (vom aktuellen
Verzeichnis aus) besuche alle Dateien mit den gegebenen Endungen (Typen)
und nimm als deren Textkodierung UTF-8 an.
-OmitDirs _site;.jekyll-cache;_data :
Beim Besuchen des (Unter-)
Verzeichnisbaums (bei . beginnend) lass die benannten Verzeichnisse und
ihre Kinder aus.
-omitFrntM :
In den besuchten Textdateien ändere nichts an einem
ggf. “front matter” im Laufe des Findens und Ersetzens.
"­"
(und kein weiterer Parameter): Suche das Muster
­
und ersetze es durch nichts.
-v:
Ausführlichere Ausgaben (optional).
Schritt 1: Trennungen gemäß der Definitionsdatei
Unter Verwendung derselben Kriterien für Dateien und Verzeichnisse wie im
Beispiel “Schritt 0” ist der Befehl hierfür:
java FuR -r .md;.html;.htm -filUTF8 -OmitDirs _site;.jekyll-cache;_data -omitFrntM -hyphen ..\factory\hyphDef_de.txt
-hyphen ..\factory\hyphDef_de.txt
trenne alle betreffenden
Dateien bzw. Texte gemäß den Definitionen der nach der option genannten
Datei (hyphDef_de.txt</code im Beispiel)..
alle anderen Optionen und Parameter: Wie für den "Schritt 0" erklärt.
Für Trennungen in einer einzelnen Datei verwende:
java FuR -omitFrntM -hyphen C:\wherItIs\hyphDef_de.txt -filUTF8 singleFile.md
Technisch gesehen erzeugt jede Zeile in der “Trennungsdatei” ein Suchmuster
(jeweils ohne die ­
s) und einen Ersatztext (mit ihnen).
dann laufen im weitesten Sinne die gleichen Vorgänge ab, als hätte man mit
einer gesonderten .properties-Datei viele “Finde und ersetze”-Definitionen
vorgegeben – was über viele Jahre FuR’s Hauptbeschäftigung auf einigen
Servern war.
Anm. 1: Zur Zeit (19.07.2021) sind so bis 1024 Trennungsdefinitionen
möglich. (Könnte erhöht werden.)
Anm. 2: Diese früheren und neuen Aufgaben mit n Mustern * m Dateien, wobei
diese Zahlen in der Größenordnung 100 bzw. 1000 (und mehr) liegen, würden mit
Javas String-Suche nicht so gut laufen. Wie auch andere
Frame4-Tools
nutzt auch
de.frame4j.FuR
Frame4s
Implementierung der Rabin-Karp-Algorithmen. Rabin-Karp bringt die Suche
eines Sub-Texts in einem String von O(t*s) (naive String.indexOf()
und Konsorten) auf deutlich weniger als O(t), wobei t die Länge des Texts
und s die Länge des zu findenden Teiltexts ist.
Anm. 3: Schritt 1 ist der wichtigste Vorgang – hierfür wurde diese
Erweiterung gemacht. Wir generieren Web-Bereich auf einem SVN-Server mit
Jekyll im post commit hook und verbreiten (deploy) sie dann (mit FTP) zum
jeweiligen Web-Server. Dieser “Schritt 1” wird Teil dieser post commit hooks
werden.
Schritt 2: Die Trennungen (wieder) beseitigen
Mit einem ganz ähnlichen Kommando wie in “Schritt 1” kann FuR genau die dort
applizierten Trennungen entfernen:
java FuR -r .md;.html;.htm -filUTF8 -OmitDirs _site;.jekyll-cache;_data -omitFrntM -dehyphen ..\factory\hyphDef_de.txt
-dehyphen ..\factory\hyphDef_de.txt
beseitige die in der nach
Option genannten Trennungsdatei (hyphDef_de.txt
) definierten
Trennungen.
Alle anderen Optionen und Parameter: Wie in “Schritt 0” erklärt.
Für Beseitigung der Trennungen in einer einzelnen Datei verwende:
java FuR -omitFrntM -hyphen C:\wherItIs\hyphDef_de.txt -filUTF8 singleFile.md
Das Anwenden von “Schritt 1” und dann das Anwenden von “Schritt 2” auf einen von vornherein (oder nach “Schritt 0”) “trennungslosen” Satz von Dateien / Texten sollte diesen in den ursprünglichen Zustand zurück versetzen. Oder mit anderen Worten: die eine Operation ist die Inverse der anderen.
Anm. 4: Seien Sie sich gewisser “Abschattungseffekte” bewusst, insbesondere bei Wortverbindungen, wie runter, gekommen und runtergekommen, deren Trennungen beispielsweise so definiert würden:
run­ter­ge­kom­men
run­ter
ge­kom­men
kom­men
Wenn Sie hier die Reihenfolge ändern und beispielsweise
"kom­men"
nach vorne setzten, würde dies alle weiteren
Trennungen bei "gekommen"
und
"runtergekommen"
verhindern.
Anm. 5: Weil
de.frame4j.FuR
die Reihenfolge der “Finden-und-ersetzen”-Aufträge
bei -dehyphen
gegenüber derjenigen bei -hyphen
umkehrt, sollte die “inverse Operationen”-Eigenschaft zugesichert sein.
Anm. 6: Wenn Sie “Trennungsdateien” schreiben oder
bearbeiten, haben Sie immer -hyphen
auf dem Schirm.
Daumenregel: Zusammensetzungen und durch Vor- oder Nachsilben verlängerte
Worte nach vorn.
Mathematische Frage an die gelehrten Leser: Wäre ein Sortieren der
Trennungsdatei nach Wortlänge – ohne die &shs;
s genommen
– hinreichend?
Ich denke die Anzwort ist “Ja”. Seit dem 31.07.2021 (bzw. der
Implementation-Version 1.21.07) sortiert FuR die Trennungsdefinitionen vorher
entsprechend.
Anm. 7: Falls Sie diese oder eine neuere Version von
Frame4
haben (und diese Sortierung nicht abschalten), mögen Sie die Anmerkungen 4
und 6 ignorieren.
Glückliche (automatische) Trennung
Kommentare
Möchten Sie einen Kommentar abgeben — auch gerne auf Englisch? Besuchen Sie die issue-Seite auf GitHub.Zum Kommentieren benötigen Sie ein GitHub-Konto.