Content Management System
Das Content Management System (CMS) ermöglicht die direkte Bearbeitung der Datenbank. Dies umfasst das Erstellen, Löschen und Bearbeiten von Inhalten via ein übersichtliches Interface. Ohne das CMS müsste man direkt die Dateien mit entsprechender Syntax beschreiben oder via Import-Script arbeiten. Das CMS ist über admin.arthistory.piogino.ch erreichbar und mit einem Login geschützt.
Funktionen
- Durchsuchen: Jede Datenbank lässt sich nach ihren Einträgen durchsuchen, und mit "Search everything…" auch alle Datenbanken zusammen. Die Suche verzeiht Tippfehler (Fuzzy Search). Auch die Auswahlfelder in den Formularen (zum Beispiel für die Künstlerin eines Werks oder das Ziel einer Beziehung) machen beim Tippen Vorschläge und verzeihen Tippfehler: "hirosige" findet Hiroshige, "vangog" findet Van Gogh. Bei einer Beziehung wie "lived in" werden nur Orte vorgeschlagen. Liegt die Übereinstimmung nicht im Titel, wird angezeigt, wo sie liegt: Die Suche nach "wood" ergibt alle Kunstwerke, die ein "woodblock print" sind, und ein Kunstwerk aus dem Material "wood", jeweils mit der passenden Angabe. Die Liste der Kunstwerke findet auch Werke über ihre Künstler:innen: zuerst die Treffer im Titel, dann "Works by a matching artist". Facharbeit-1791142743758.webp
- Bearbeiten: Erstellen, Bearbeiten und Löschen von Einträgen ist das zentrale Feature des CMS. Die Formulare werden aus derselben Beschreibung der Felder erzeugt, die auch der Import verwendet, sodass beide gleich prüfen. Das Formular passt sich teilweise an den Eintrag an, etwa bei Werkgruppen (siehe Werkgruppen) oder bei Quellen.
- Beziehungen: Zu allen Einträgen lassen sich unlimitiert viele Beziehungen festhalten. Die Auswahl fasst Arten mit derselben Bezeichnung zusammen (etwa "depicts" für einen Ort, eine Person oder ein Werk); welche Art gespeichert wird, ergibt sich aus dem Ziel. Die Reihenfolge lässt sich per Drag and Drop ändern. In Firefox liess sich eine Zeile anfangs nur um eine Position verschieben, weil die gezogene Zeile selbst verschoben wurde und dabei den Mauszeiger verlor. Seit 2026-10-09 wird eine Kopie der Zeile bewegt und erst beim Loslassen verschoben.
- History: Jede Änderung in der Datenbank wird in Postgres festgehalten. Dabei wird dokumentiert, wer welche Änderung zu welchem Zeitpunkt gemacht hat, mit dem vollständigen Eintrag vor und nach der Änderung. Diese History ist weder editier- noch löschbar. Jede Änderung lässt sich daraus rückgängig machen (siehe History und Rückgängigmachen).
- Sichere Löschung: Vor jeder Löschung erscheint eine Bestätigungsseite, die zeigt, welche Beziehungen damit verloren gehen. Hat der Eintrag keine Beziehungen, steht dort "It has no relationships.", gelöscht wird aber erst nach einem Klick auf "Delete". Löschungen, die nicht möglich sind (etwa eine Künstlerin, auf die noch Kunstwerke verweisen), werden mit einer verständlichen Meldung abgelehnt. Und jede Löschung lässt sich über die History rückgängig machen.
- Gleichzeitige Bearbeitung: Ursprünglich wurde eine Änderung abgelehnt, wenn derselbe Eintrag in der Zwischenzeit an einem anderen Gerät gespeichert worden war. Ich wünschte mir eine Live-Vorschau noch nicht gespeicherter Änderungen und einen deutlichen Hinweis, wenn ein anderer Account denselben Eintrag bearbeitet. Seit der Woche vom 28. September werden Eingaben automatisch gespeichert und alle Bearbeitenden sehen sich gegenseitig (siehe Gleichzeitiges Bearbeiten).
Beschreibungsfeld
Das Beschreibungsfeld erwartet Markdown. Das Feld besitzt eine Live-Vorschau, wie man es von beispielsweise Obsidian kennt: **fett** erscheint beim Tippen fett, die Markierungen bleiben aber blass sichtbar, sodass genau das gespeichert wird, was man sieht. Zudem funktionieren die geläufigen Keyboard Shortcuts. So wird ein Inhalt fett formatiert, wenn die entsprechende Stelle ausgewählt und Ctrl+B gedrückt wird. Ein Knopf "Preview" zeigt den Text genau so, wie ihn die Website darstellen wird. Der Editor basiert auf CodeMirror 6.
Seit 2026-10-14 erkennt die Rechtschreibprüfung beim Tippen, ob ein Text deutsch oder englisch ist. In Firefox schien das zuerst nicht zu funktionieren; es fehlte nur das deutsche Wörterbuch im Browser.
Seit 2026-10-20 hat der Editor eine grosse Bandbreite an Werkzeugen, wenn die Syntax gerade nicht auswendig im Kopf ist:
- Links auf Einträge und auf Websites
- Überschriften, nummerierte Listen und offene Punkte
- Markierungen und Spoiler
- Hinweisboxen wie in Obsidian
- Tabellen und Trennlinien
- Suchen und Ersetzen
Diese Formen erscheinen auch in allen Beschreibungen und Biografien auf der Website.
Projektinternes Verlinken
Mit dem Glossar wurde ein System eingerichtet, welches das Verlinken in Bildbeschreibungen oder Biografien sehr einfach und intuitiv gestaltet, ohne jedes Mal eine URL einzufügen. Die Verlinkung funktioniert wie bei der Software Obsidian: Der zu verlinkende Begriff wird in doppelte eckige Klammern gesetzt [[WORT]], und [[contrapposto|die Pose]] zeigt die Verlinkung auf dem eigenen Wort "die Pose". Seit 2026-10-06 funktioniert das für alle Arten von Einträgen. Per Default ist ein Glossarbegriff gemeint. Soll eine andere Datenbank angesteuert werden, beispielsweise Künstler:innen oder Orte, wird diese mit dem Datenbanknamen und einem Schrägstrich angegeben. In der Regel muss man das aber nicht eingeben, da beim Schreiben zwischen den Klammern automatisch Vorschläge erscheinen. Jeder Eintrag zeigt zudem, welche anderen Einträge auf ihn verlinken. Auf der Website zeigen diese Links beim Darüberfahren mit der Maus eine kleine Vorschau des Eintrags, ähnlich wie bei Wikipedia.
| Ich schreibe | Es wird |
|---|---|
[[artist/katsushika-hokusai]] |
ein Link auf dem Wort "Katsushika Hokusai" |
[[artwork/the-great-wave|the Wave]] |
ein Link auf dem eigenen Wort "the Wave" |
[[contrapposto]] |
der Glossarbegriff auf dem Wort "contrapposto" |
Karte im CMS
Die Karte für die Koordinaten von Einträgen im CMS läuft über Leaflet mit OpenStreetMap-Kacheln und nicht über MapTiler, da es unnötig ist, dafür das Gratis-Kontingent zu verwenden. Auf der Karte kann direkt ein Punkt oder eine Fläche für ein Objekt gewählt werden. Damit muss die Eingabe nicht von Hand über die Koordinaten gemacht werden, sondern gestaltet sich intuitiver und ist direkt auf der Karte nachvollziehbar. Für Flächen sind verschiedene Tools über Geoman (Leaflet Drawing and Editing Plugin Documentation | Geoman) verfügbar, um Polygone zu erstellen und zu bearbeiten. Über eine Suche lassen sich Orte finden und, wo OpenStreetMap einen Umriss kennt, dieser als Fläche übernehmen. Gezeichnete Flächen, deren Ränder sich kreuzen, werden vor dem Speichern von PostGIS repariert, damit Flächen- und Distanzberechnungen zuverlässig bleiben. Damit können künftig auch historische politische Gebiete wie das Osmanische Reich oder das Gebiet der Han-Dynastie gezeichnet werden. Eine ausgereiftere Lösung für solche Gebiete gibt es noch nicht; OpenStreetMap zeigt die heutigen Grenzen, die nur ein Ausgangspunkt sein können. Eine kleine Anekdote: Kurz nach dem Einrichten zeigte die Karte im CMS nur noch ein Bild mit "Access blocked". OpenStreetMap verlangt, dass jede Anfrage angibt, von welcher Website sie kommt. Genau diese Angabe hatte ich aus Datenschutzgründen für alle Seiten des CMS abgeschaltet. Nun wird sie nur für die Kartenkacheln mitgeschickt.
History und Rückgängigmachen
Jede Änderung wird mit dem vollständigen Eintrag vor und nach der Änderung gespeichert. Darauf aufbauend kann jede Änderung aus der History rückgängig gemacht werden ("revert…"), und ein Eintrag kann auf einen früheren Stand zurückgesetzt werden ("restore this version…"). Beides geschieht nie sofort, sondern zeigt zuerst eine Vorschau. Für jedes Feld werden drei Werte verglichen: der Wert vor der Änderung, der Wert nach der Änderung und der heutige Wert. Hat seit der Änderung niemand das Feld angefasst, wird es automatisch zurückgesetzt. Wurde es später nochmals geändert, ist das ein Konflikt, und ich entscheide, ob der heutige Wert bleibt oder der alte zurückkommt. Felder, die die Änderung nicht betroffen hat, werden nie verändert. Bei längeren Texten wie Biografien werden die Änderungen Wort für Wort zusammengeführt, nach demselben Prinzip, das auch Git für Dateien verwendet: Rückgängig gemacht werden nur die Wörter, die diese Änderung geschrieben hat, spätere Änderungen an anderen Stellen bleiben erhalten. Die History zeigt Textänderungen ebenfalls Wort für Wort: Gelöschte Wörter sind rot durchgestrichen, neue grün. Gelöschte Einträge kommen mit ihrer ursprünglichen ID zurück, sodass ihre Beziehungen und ihre ganze History wieder verbunden sind. Die Vorschau führt das Rückgängigmachen tatsächlich aus und macht es danach wieder rückgängig, sodass alles, was die Datenbank ablehnen würde, schon vor der Bestätigung sichtbar wird. Auch ein Rückgängigmachen erscheint in der History und kann selbst wieder rückgängig gemacht werden.
Gleichzeitiges Bearbeiten
Damit keine Eingaben verloren gehen und mehrere Personen gleichzeitig arbeiten können, wurde das CMS in zwei Schritten erweitert:
- Anwesenheit und Entwürfe: Ein kleiner Hinweis unten rechts zeigt, ob die Verbindung steht und wann der Entwurf zuletzt gespeichert wurde. Wer gerade denselben Eintrag ansieht oder bearbeitet, wird angezeigt, bis hin zum Feld, in dem die andere Person gerade schreibt. Eingaben werden alle 1,5 Sekunden auf dem Server gesichert und bei einer unterbrochenen Verbindung im Browser zwischengespeichert, bis die Verbindung wieder steht. Bei einem Absturz einer Session gehen so keine Daten verloren.
- Gemeinsame Arbeitskopie: Alle, die einen Eintrag bearbeiten, arbeiten an derselben Arbeitskopie und sehen die Eingaben der anderen live, in Texten sogar Zeichen für Zeichen mit dem Cursor der anderen Person. Grundlage dafür ist Yjs, ein sogenannter CRDT: Jede Kopie, die dieselben Änderungen erhalten hat, hat denselben Inhalt, unabhängig von der Reihenfolge, in der sie eingetroffen sind. Deshalb lassen sich auch Änderungen zuverlässig zusammenführen, die offline gemacht wurden. Aus "Speichern" wurde "Publish": Erst die Veröffentlichung prüft die Eingaben und erzeugt einen Eintrag in der History.
Getestet wurde das mit zwei Benutzer:innen in zwei Browsern gleichzeitig, auch während eines Neustarts des Servers. Aktuell ist weiterhin nur ein Account erstellt, da es ein Soloprojekt ist. Am 2026-10-18 meldete das CMS bei Kunstwerken "Someone saved this record while you were editing", obwohl niemand sonst den Eintrag bearbeitet hatte. Das ist behoben.
Datenqualität
Die Seite "Quality" im CMS listet auf, was falsch oder unvollständig aussieht. Die Regeln sind Abfragen in Postgres, die vor allem mit Zeiträumen rechnen. Beispiele:
- Fehler: eine Person, die sich ausserhalb ihrer Lebenszeit irgendwo aufhält; ein Kunstwerk, das nach dem Tod der Künstlerin entstanden ist; Lehrer und Schüler, die nie gleichzeitig gelebt haben; eine Inventarnummer ohne Institution.
- Warnungen: zwei Wohnorte zur selben Zeit; ein Ort ausserhalb des Umrisses seiner übergeordneten Region; wahrscheinliche Duplikate; Bilder ohne Lizenz.
- Hinweise: Aufenthalte ohne Datum, Einträge ohne Beschreibung, ohne Wikidata-ID oder ohne Webseite des Werks, fehlende Teile einer Werkgruppe.
Weil mit Zeiträumen gerechnet wird, gelten ungenaue Daten erst dann als Widerspruch, wenn sie sich gar nicht überschneiden können: "ca. 1480" widerspricht "1482" nie. Eine Meldung kann mit einer Begründung als "OK" markiert werden (etwa "posthumer Bronzeguss") und erscheint dann nicht mehr. Seit 2026-10-21 werden die Prüfungen nur noch für die Einträge neu berechnet, die eine Änderung betrifft (siehe Skalierung). Ein Wunsch war von Anfang an, dass meine Seite Widersprüche selbst entdeckt. Ein Beispiel ist Gauguins Werk Tournesols: Es wird auf 1901 datiert, Gauguin war 1901 aber auf Tahiti oder in Atuona, und das Werk wurde zwischen 1901 und 1904 in Paris gekauft. Seit 2026-10-16 zieht die Provenienz Schlüsse aus den Lebensdaten und Aufenthalten der Besitzer:innen, etwa "Paul Gauguin was in Atuona then: the work travelled to Paris, ≈ 14,393 km", und widersprüchliche Angaben erscheinen als Qualitätsmeldung (siehe Provenienz).