27. Januar 2026
Dieses Journal ist schon lange im Netz und hat schon viele Änderungen erfahren. Frühere Inhalte habe ich im Lauf der Zeit offline genommen, sie waren für das Teilen mit der Öffentlichkeit nicht mehr so relevant oder entsprachen nicht mehr meiner heutigen Sicht auf bestimmte Dinge.
Die heute hier laufende Fassung ist ein Eigenbau, dessen genaues Entstehungsdatum ich schon gar nicht mehr erinnere. Jedenfalls wollte ich damit den ganzen Ballast loswerden, den Webserver, Datenbanksysteme, Blogging-Plattformen und -Apps sowie Content Management Systeme jeweils erfordern.
Mein Gedanke war (und ist), dass ein Blog-Eintrag doch nichts weiter als eine Textdatei ist. Diese im Web anzuzeigen erfordert, sie nach HTML zu überführen, was auf ganz verschiedene Arten geschehen kann.
Ich habe mich letztlich dafür entschieden, einen Editor zu verwenden, der das Schreiben von Text im WYSIWYG-Modus erlaubt, aber den Text als HTML speichert und auch wieder aus dem HTML liest. Ich verwende ein selbst gebautes kleines CMS und darin TinyMCE, um Inhalte direkt dort zu erstellen und zu bearbeiten, wo sie später auch erscheinen. Es könnte auch jeder andere der zahllosen Editoren sein, die es so gibt und die in Javascript gebaut einfach im Browser laufen.
Zudem schreibe ich zunehmend offline, meist mit Obsidian und überlege schon, ob ich irgendwann einmal einen einfachen automatischen Konverter für die Markdown-Dateien hinter Obsidian hänge, der die dort geschriebenen Texte ins Journal schiebt.
Oder ich nehme auf dieselbe Weise gleich AsciiDoc, was mir lieber wäre und z.B. Zed als Editor. Am Ende werden das CMS und TinyMCE dann vielleicht obsolet, zumindest, was das Journal anbelangt. Mal sehen.
Es fehlt also nur eine Logik, nach der die Blog-Einträge auf der Platte abgelegt werden. Was liegt näher, als sie in Ordnern abzulegen, die den Entstehungszeitpunkt der Einträge nachbilden. Also habe ich mich für eine Ablagestruktur entschieden, die die Beträge in Ordnern ablegt, die Jahr/Monat heißen, also eine Struktur wie jjjj/mm/dateiname-des-beitrags.
Gibt es eine Funktion, die serverseitig diese Ablagestruktur nach Beiträgen durchsucht und sie chronologisch absteigend listet, ist das Journal auch schon so gut wie fertig.
Meine Journal-App nutzt dann noch meinen eigenen winzigen eingebetteten Webserver, so dass sie eigenständig laufen und Inhalte im Web ausliefern kann. Das tut sie hinter einem Reverse Proxy.
Dann enthält die Journal App noch Logik für das Archiv und die Ausgabe eines RSS-Feeds. Die Inhalte laufen serverseitig zudem durch eine Logik, die sie mit Mustache-Vorlagen verschmilzt, um die gewünschte Gestaltung der Ausgabe zu bekommen, alles ist äußerst leichtgewichtig.
Das läuft so seit Jahr und Tag sehr robust und überschaubar winzig.
Der einzige Stolperstein ist die Anzeige von Beitrags-Titeln und Bildern. Ich wollte unbedingt vermeiden, eine Datenbank oder zusätzliche Metadaten etwa für Titel oder Schlagworte zu jedem Beitrag anlegen und pflegen zu müssen, jeder Journal-Beitrag soll einfach eine Text- bzw. HTML-Datei sein.
Deshalb habe ich mich an die Konvention gehalten, in jedem Beitrag als allerersten Inhalt ein H1-Element zu schreiben. Das ist der Titel.
Aber wie kommt nun der Titel in die HTML-Datei? Jene erfordert den Titel als Meta-Angabe im HEAD-Element, steht aber im BODY-Element. Meine Journal-Logik löst das so, dass sie meinen eigenen XML-Parser nutzt, um den Beginn einer HTML-Datei zu parsen, bis sie den Inhalt des ersten H1-Elements gefunden hat und diesen Inhalt im HEAD-Element als TITLE-Element ausgibt, wieder mit Hilfe der Mustache-Vorlagen-Logik. Ebenso verfährt das Journal auch für die Extraktion von Bildern aus dem Beitragstext, um diese in der Beitragsübersicht darzustellen.
Allerdings wunderte ich mich schon die ganze Zeit, warum das mit dem Titel in der Anzeige der Journal-Beiträge funktioniert, aber nicht bei der Weitergabe der Journal-Inhalte und war mir sicher, es liegt an der Ausgabe des RSS-Feeds.
Nun hatte ich Zeit, den schon etwas angestaubten Code mal wieder anzufassen und habe schlussendlich die Stelle gefunden, wo der RSS-Feed entsteht. Flugs die beschriebene Parser-Logik für den Titel eingebaut und jetzt wird endlich der Titel aus dem Beitragstext auch als Titel im Feed ausgegeben.
Champagner!
Bild: Eine kleine Tour durch dieses Journal
Split, Oktober 2023
Kodak Portra 160, Summicron-M 28
© Ulrich Hilger
Copyright © Ulrich Hilger, alle Rechte vorbehalten.