
RSS mit Umwegen
Bootstrap Studio hat zwar ein neues Blog Feature, aber keine native Implementation von RSS. Wie ich mir den Standard beigebracht habe und wie PowerShell mir den Allerwertesten rettet.
Zwei Geständnisse
Zugegeben, ich habe mich vorher noch nie mit RSS auseinandergesetzt. Für mich war es immer eine Begleiterscheinung des Internets in den frühen 2000ern bis 2010ern, wo man in Windows 7 noch diese Minianwendungen auf dem Desktop platzieren konnte. Da war ein kleiner RSS-Feed, den man mit Adressen füttern konnte. Zuletzt habe ich RSS auf der Arbeit entdeckt, um mir aktuelle und wichtige Meldungen vom Hannoveraner Pressemitteilungs-Abdruckdienst heise.de direkt in mein Outlook geben zu lassen. Damit ist die Bedeutung für mich aber auch wieder verblasst.
Das zweite Geständnis? Ich kann kein Frontend. Um meine Seiten zu bauen, benutze ich Bootstrap Studio, ein WYSIWYG Baukasten ähnlich wie Jimdo oder Wix. Für mich ist es ein schneller Weg, Prototypen zu bauen, zu polishen und dann schnell abzuliefern, ohne dass ich Hosting bezahlen muss. Die Software selbst kostet zwar auch etwas, aber ich bekomme die Lizenz gerade vom GitHub Student Developer Pack gestellt.
Bootstrap Studio (ich sage ab jetzt BSS) hat letztens ein neues Feature veröffentlicht: die Blog-Funktion. Damit bringt man zum ersten Mal Dynamik in die Gestaltung der Seite. Elemente werden jetzt automatisch beim Export mit Inhalt gefüllt, ohne dass ich mir Sorgen darum machen muss. Ein echt cooles Feature ohne Backend-Shenanigans. Und doch mag der geneigte Leser sagen: "Ja schön, kann es aber RSS?" Das bringt mich zum heutigen Artikel. Leider haben die netten Entwickler aus Bulgarien noch keine Implementation dafür. Verständlich, die wollen sich auf die wichtigen Sachen fokussieren und BSS besser machen, anstatt Nischenprodukte zu bedienen. Ist RSS ein Nischenprodukt? Darüber diskutiere ich heute mal nicht.
Nachsitzen
Ich habe mich also vor w3schools.com gesetzt und mir die volle Dröhnung RSS gegeben. Eigentlich ist das Format relativ simpel. Ein RSS-Feed ist im Grunde eine XML-Datei. Im unteren Bild habe ich mir großzügig das Beispiel von den Kollegen von W3S genommen. Ein Channel-Element umfasst zunächst einen Titel und einen Link zur allgemeinen Seite. Es folgt eine Beschreibung, die den Channel allgemein zusammenfasst. Danach folgen die Item-Elemente. Jedes Item steht dabei für einen Artikel, der wieder aus einem Titel, einem Link und einer Beschreibung besteht.
Nun soll dieses Konstrukt automatisch generiert werden. In dem Fall ist PowerShell meine Waffe der Wahl. Ich kann PowerShell nicht besonders gut, aber es ist eine native Möglichkeit, um mein Ziel zu erreichen. BSS ermöglicht es dir nämlich, bei einem Export ein Skript auszuführen. Bisher habe ich das nur dazu benutzt, um die Änderungen in eine private Git Repo zu schieben, damit Cloudflare Pages daraus eine statische Seite bauen kann.
Also muss ich nur eine neue Zeile hinzufügen, die ein weiteres Script callt. Der geneigte Leser merkt bestimmt auch, dass da bereits ein Skript ausgeführt wird. BSS überschreibt bei einem Export zwar Dateien, löscht aber nicht die, die nicht mehr in einem Export vorhanden sind. Ich prüfe also auf alle Dateien, die nach dem Export älter als 20 Sekunden sind. Alles, was da herausfällt, wird gelöscht. Der Rest ist nahezu selbsterklärend: Ich hole mir einmal den aktiven Branch und pushe die Änderungen. Alles Weitere macht eine GitHub Action von Cloudflare.
Du bist meins mit PS1
Der Plan: Die Ordner nach dem Export durchgehen, Informationen mit Regexes auslesen, eine XML bauen und den Spaß in die Git Repo verschiffen. Das habe ich dann mit diesem Skript gelöst.
Sieht nach viel aus, oder? Es ist tatsächlich nicht so schlimm, wie man vielleicht denkt. Zunächst definiere ich die Channels mit ihren Eigenschaften. Damit kann ich das Skript ohne viel Aufwand anpassen, wenn weitere Sub-Blogs oder so dazukommen sollten. Danach führen uns verschachtelte Schleifen zum Erfolg. Ich hole mir aus jedem Ordner alle Dateien und aus jeder Datei mit Regular Expressions die Attribute. Die schreibe ich dann in Objekte und schiebe sie großzügig in eine Liste. Aus diesen Listen baue ich dann die Items für einen Channel und mit denen dann den Channel selbst. Alles wird in eine XML verpackt und dann in den Ordner des eigentlichen Blogs gelegt.
Dieses Skript hat aber zwei Probleme, von denen ich (noch) nicht weiß, wie ich sie lösen kann. Einerseits erscheinen Artikel immer pünktlich um Mitternacht! BSS stellt eine genaue Zeitangabe leider nicht bereit. Das stört aber nicht groß, oder? Das zweite Problem ist, dass man bei BSS die Möglichkeit hat, Blogseiten schon zu veröffentlichen, aber noch nicht im sogenannten Loop anzuzeigen. Der Loop ist die Übersicht aus Artikeln, die auf der Hauptseite (/blog-de.html) zu sehen ist. Dieser Switch wird allerdings nur beim Export ausgelesen, um den Loop aufzubauen, und nicht als eigener Datenpunkt gesichert. Das heißt, dass RSS-Leser schon früher an Artikel kommen könnten. Ein Workaround wäre, diese Artikel zunächst in einen anderen Ordner zu verschieben, der nicht gescannt wird. Andererseits könnte man auch den Loop selbst parsen, aber das hebe ich mir für ein anderes Mal auf.
Intermezzo: Ein bescheuerter Standard
Ich musste den RSS-Standard lernen, um ihn zu implementieren. Dabei ist mir das Channel-Element besonders ins Auge gefallen. Ich habe großzügig angenommen, dass man mehrere Channel in einen Feed definieren kann. Pustekuchen! Kannste nicht! Wieso gibt es dann überhaupt das Element?! Dir kommt das nicht in den Sinn, dass es nur eins davon geben kann. Und jetzt, wo ich fertig bin, lese ich etwas von Atom. Zugegeben etwas komplexer, aber vielleicht erweitere ich das Skript um den Atom-Standard (und baue dabei den Loop Parser ein). Versprechen tue ich aber nichts.
Ein Ausblick
Das ist mein zweiter und doch letzter Blog-Post in diesem Jahr. Ich freue mich darauf, von mehr Erfahrungen und Projekten zu berichten. Mastodon ist irgendwie nicht der richtige Platz für den Long-Form-Content, auf den ich manchmal Bock habe. Freut euch auf mehr technischen Kram und bisschen mehr Furry, 'kay?
Kommt stabil ins neue Jahr!
Finnley
Herzlichen Dank an Steffo für eine Runde Korrekturlesen und für alle Verbesserungsvorschläge.