Seit ich vor drei Jahren mit der Webseite begonnen habe, kam auch immer wieder die Frage nach einem RSS-Feed von verschiedenen Leuten. Leider führt meine Form der Nutzung von ikiwiki dazu, dass die erstellten RSS-Feeds Müll sind. Ich habe die Texte in einem git-Archiv liegen und durch Wechseln zwischen verschiedene Versionsständen ändern sich die Zeitstempel der Dateien, was die Erstellung des RSS-Feeds durcheinander bringt. Außerdem lasse ich immer wieder die komplette Webseite neu erstellen, wodurch auch die Zeitangaben in den Seiten nicht stimmen.

gitlog2rss

Deshalb war meine Idee, aus der git-Historie die Dateien für den RSS-Feed zu generieren. Aber weil ich dafür keine fertige Lösung gefunden habe, habe ich mir selbst das Programm gitlog2rss in Rust geschrieben. Von der Nutzung her ist es sehr auf meine Bedürfnisse abgestimmt, aber ich habe auch versucht, es so weit zu abstrahieren, dass es allgemein genutzt werden kann.

Ich habe das Projekt bei gitlab und github veröffentlicht. Wer Interesse hat, kann sich also den Quelltext holen und ihn mit cargo b übersetzen. Aber Vorsicht, ich habe die Nightly-Version verwendet und auch ein Nightly-Feature genutzt.

Der Einsatz ist recht leicht: gitlog2rss -c config.yaml '*.md' > feed.rss. Ich habe noch einige Optionen eingebaut (z. B. -d für Debugmeldungen und -y für schönere Ausgaben), aber die wichtigsten Informationen liegen in der Konfigurationsdatei.

Für einige Feeds auf meiner Seite muss ich die Konfiguration dynamisch erzeugen, weshalb gitlog2rss mit -c - die Konfiguration von der Standardeingabe liest, womit es möglich ist, Einträge an die Konfiguration anzuhängen und andere damit zu ersetzen. In den Feeds für einzelne Seiten soll der Link zur Seite verwendet und der Titel entsprechend angepasst werden.

Auf diese Weise kann ich den Hauptfeed unter /rss generieren und für die einzelnen Seiten einen Feed mit der Endung rss statt html. Im Rakefile nutze ich dann noch viel sed, um die HTML-Dateien entsprechend anzupassen, weil die Einbindung der dynamisch erstellten Felder im <head> mit ikiwiki nicht möglich ist.

Content-Type bei Nginx überschreiben

Bei Nginx musste ich für den Feed unter /rss explizit den Content-Type angeben, weil diese Datei keine Endung hat und daher als application/octet-stream ausgeliefert wurde.

location ~ /rss$ {
  types { }
  default_type "application/rss+xml; charset=utf-8";
}

Symbol für RSS

Damit die Verfügbarkeit eines RSS-Feeds auf der Seite auch kenntlich wird, habe ich auf den Seiten, für die es einen RSS-Feed gibt, in der Kopfzeile ein Symbol eingefügt. Dieses Symbol sollte wie das Twitter-Symbol in SVG sein, damit es sauber skaliert. Bei Wikicommons habe ich zwar zwei Symbole (Rss Shiny Icon, RSS - The Noun Project) gefunden, aber beide waren nicht das, was ich mir vorgestellt hatte. Deshalb habe ich am Ende mit Inkscape ein eigenes Bild gebastelt und dabei die Möglichkeiten von SVG kennengelernt.

Ziel war es, eine Fläche zu haben, bei der die Striche »transparent« gefüllt sind, so dass der Hintergrund durchscheint. Beim Twitter-Symbol funktionierte es ja und der Trick ist, dass man die Pfade in unterschiedlicher Richtung zeichnet. Man kann bei SVG Löcher in Flächen schneiden, indem man die Fläche im Uhrzeigersinn und die Löcher gegen den Uhrzeigersinn zeichnet – oder umgekehrt. Mit Inkscape kann man mit dem Menüpunkt Pfad, Umkehren genau diese Richtung beeinflussen. Für kompliziertere Schnitte kann man mit der Eigenschaft fill-rule die Löcher noch genauer definieren, aber für mein Bild genügten die Standardeinstellungen. Die Einstellung fill-rule für einen Pfad kann in Inkscape im Dialog Füllung und Kontur, Füllung mit den Knöpfen umschaltet werden; siehe den Tooltip.

Um einen zusammengesetzten Pfad in dieser Weise mit Inkscape zu erstellen, erstellt man die Einzelpfade, wählt alle im Dialog Objekte gleichzeitig aus und vereinigt sie mit dem Menüpunkt Pfad, kombinieren. Für Veränderungen kann man den Pfad mit dem Menüpunkt Pfad, zerlegen auch wieder auftrennen und die Teile bearbeiten.

Für diesen zusammengesetzten Pfad habe ich auch die Füllung entfernt (Knopf mit Fragezeichen im Dialog Füllung und Kontur, Füllung), da man bei eingebettetem SVG innerhalb des HTMLs auch die Attribute mittels CSS steuern kann. Das SVG-Bild definiert dann nur die Form und mit CSS kann man Farbe und Größe bestimmen, womit diese auch in den Entwicklerwerkzeugen des Browsers zum leichteren Experimentieren anpassbar sind.

#pageheader svg {
  height: 3.5ex;
  margin-left: 0.25em;
  vertical-align: middle;
}

#pageheader svg path {
  fill: #f2f2f2;
}

Bei Inkscape kann man Dateien auch im Format optimiertes SVG abspeichern und kann damit eine sehr kleine Variante der Datei erzeugen, die sich wunderbar in die HTML-Datei einbetten lässt. Für das optimierte SVG muss bei Debian das Paket python3-scour installiert sein. Zusätzlich kann man noch selbst prüfen, ob Einträge unnötig sind und in Inkscape diese mit dem XML-Editor entfernen.

Art