尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Inoffizielle Browser-Erweiterung für den Katalog der Stadtbibliothek Köln: Bestand in der Trefferliste, ISBN-Suche, Mehr laden.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Ungepackte Browser-Erweiterung (Manifest V3) für den Katalog der Stadtbibliothek Köln. Sie verbessert ausschließlich die Darstellung und Interaktion im Browser. Der Katalog, das Benutzerkonto und die Daten der Bibliothek bleiben unverändert. Dieses private Projekt ist kein offizielles Angebot der Stadtbibliothek Köln.檢視完整 README ↗
Ungepackte Browser-Erweiterung (Manifest V3) für den Katalog der Stadtbibliothek Köln. Sie verbessert ausschließlich die Darstellung und Interaktion im Browser. Der Katalog, das Benutzerkonto und die Daten der Bibliothek bleiben unverändert.
Dieses private Projekt ist kein offizielles Angebot der Stadtbibliothek Köln.
Die Oberfläche des Katalogs ist funktional, wirkt bei Suche, Filtern und Formularen aber unnötig technisch. Diese Erweiterung modernisiert genau diese Stellen clientseitig: ohne Zugang zu Bibliotheksdaten, ohne eigenen Server und ohne Änderung am Katalog selbst.
Die Trefferliste des Portals zeigt nur Titel, Verfasser, Signatur, Jahr, Auflage, Sprache und Verlag, aber nicht, ob und wo ein Titel ausleihbar ist. Bisher musste man jeden Treffer einzeln öffnen, den Bestand prüfen und wieder zurücknavigieren.
Jede Trefferzeile bekommt darum eine Schaltfläche „Bestand anzeigen“ (oder „Bestand für alle Treffer laden“ über der Liste). Nach dem Laden erscheint direkt (auch ohne Aufklappen) in der Zeile ein Status-Badge:
| Badge | Bedeutung |
|---|---|
| „1 von 3 verfügbar“ (grün) | Mindestens ein Exemplar ausleihbar |
| „Alle 5 Exemplare entliehen“ + frühestes Rückgabedatum (orange) | Derzeit nichts frei |
| „Kein Bestand“ | z. B. reines E-Medium ohne physische Exemplare |
Ein zweiter Klick auf „Bestand je Zweigstelle“ klappt die Details auf: je Zweigstelle Signatur und Status der einzelnen Exemplare. Zweigstellen mit verfügbaren Exemplaren stehen oben.
Standardmäßig lädt die Erweiterung den Bestand aller Treffer der Seite sofort im Hintergrund (Schalter „Bestand automatisch laden“ im Popup). Wer das nicht möchte, schaltet es im Popup aus; dann erscheinen nur die Schaltflächen, und der Bestand wird erst per Klick geladen.
Technisch: Der Permalink eines Titels (APS_ZONES?fn=ViewNotice&q=<ID>) liefert den Bestand aller Zweigstellen bereits im HTML, ohne Session und von derselben Origin. src/holdings.js holt ihn per fetch (höchstens 4 parallel) und liest die Blöcke stock_header_<code> / stock_content_<code> aus.
Eine blank eingegebene ISBN findet im Katalog nichts, weder 9783551557414 noch 978-3-551-55741-4. Erst der Index-Präfix isbn= (klein geschrieben; ISBN= wird als Wort behandelt) führt zum Titel.
src/query.js erkennt ISBN-10 und ISBN-13 inklusive Prüfsumme und schreibt die Eingabe vor dem Absenden um, und zwar in beide Schreibweisen, damit auch Titel gefunden werden, die nur mit der jeweils anderen ISBN erfasst sind:
978-3-551-55741-4 → isbn=9783551557414 or isbn=3551557411
Bereits qualifizierte Anfragen (au=, ti=, isbn= …) bleiben unangetastet, ebenso Zahlen, die keine gültige ISBN sind. Landet man trotzdem auf einer Nulltrefferseite (etwa über ein Lesezeichen oder die erweiterte Suche), erscheint dort ein Hinweis mit dem Link „Als ISBN suchen“.
Das Portal liefert fest 10 Treffer pro Seite; ein PageSize in der URL wird ignoriert. 2026 Treffer bedeuten 203 Seitenaufrufe.
Unter der Trefferliste steht darum „Weitere 10 Treffer laden“ samt Zähler („Treffer 1–20 von 2026“). src/loadmore.js ruft Method=PageDown gegen das Session-Handle der laufenden Suche auf und hängt die Zeilen an die Liste an. Weil dieser Aufruf den serverseitigen Cursor vorrückt, wird die Seitenanzeige des Portals mitgeschrieben. Dessen eigene Blätter-Links bleiben damit stimmig und benutzbar.
Die Facetten („Einschränken der Suche“) liegen als Kacheln in einem Raster über der Trefferliste:
×-Schaltfläche zum Entfernen.Unabhängig von den Funktionen oben modernisiert die Komfort-Ansicht die Darstellung:
Bei ausgeschalteter Komfort-Ansicht werden alle injizierten Styles und Ergänzungen entfernt. Der Katalog steht wieder im Original da.
Nach der Installation erscheint das Erweiterungs-Symbol in der Werkzeugleiste. Per Klick öffnet sich ein Popup.
Ganz oben sitzt ein Suchfeld: Eingabe + Enter öffnet die Trefferliste direkt in einem neuen Tab; ohne Eingabe (oder über „Katalog öffnen“) landet man in der Schnellsuche. Eine ISBN wird dabei wie im Katalog-Suchfeld umgeschrieben, sofern ISBN-Suche erkennen an ist. Das Suchfeld funktioniert auch bei ausgeschaltetem Komfort-Design.
Darunter die Schalter:
| Schalter | Vorgabe | Wirkung |
|---|---|---|
| Komfort-Design aktivieren | an | Hauptschalter. Aus = alle injizierten Styles und Funktionen werden entfernt, der Katalog steht wieder im Original da. |
| Dunkles Design | aus | Dunkles Farbschema (Beta). Greift nur bei aktivem Komfort-Design. |
| Bestand in der Trefferliste | an | Schaltflächen und Bestandsanzeige je Treffer. |
| Bestand automatisch laden | an | Lädt den Bestand aller Treffer sofort, ohne Klick. |
| „Mehr laden“ statt Blättern | an | Leiste unter der Trefferliste. |
| ISBN-Suche erkennen | an | Umschreibung der Eingabe und Hinweis auf Nulltrefferseiten. |
Die Einstellungen liegen in chrome.storage.local. Änderungen greifen sofort auf offenen Katalogseiten; sollte etwas nicht stimmen, die Seite hart neu laden (⌘+Shift+R / Strg+Shift+R).
Typografie und Farben weiterhin zentral in styles/tokens.css anpassbar.
Einfach über den Chrome Web Store installieren: ein Klick, kein Entwicklermodus nötig.
Benötigt wird Chrome bzw. Chromium ab 105 (die Styles nutzen :has()).
chrome://extensions.manifest.json auswählen.Optional: Release-ZIP entpacken und denselben Ordner wählen.
Firefox ab 121 unterstützt die verwendeten Selektoren. Die Erweiterung lässt sich für lokale Tests temporär über about:debugging laden. Für eine dauerhafte Installation benötigt Firefox eine signierte Erweiterung.
npm run pack
Erzeugt eine ZIP-Datei mit manifest.json, content.js, src/, popup/, styles/, icons/, README.md.
Voraussetzungen: Node.js, npm und Playwright Chromium.
npm install
npx playwright install chromium
npm test
Zusätzlich gibt es Offline-Prüfungen, die ohne den Katalog laufen:
npm run test:unit # Vitest: ISBN-Logik, Bestands-Parser, Reverter, Manifest-/Storage-Verträge
npm run test:lint # ESLint + Stylelint
npm run lint:webext # web-ext: Manifest- und Paketprüfung
Die Tests laufen gegen den echten Katalog:
tests/selectors.spec.ts prüft den Serververtrag ohne Browser: Selektoren, Parameter und HTML-Strukturen, von denen die Erweiterung abhängt.tests/features.spec.ts prüft Bestand, Nachladen, ISBN, Facetten, Konto, Schnellsuche und Vormerkung mit geladener Erweiterung.tests/smoke.spec.ts deckt Schnellsuche, Trefferliste und den Einstieg unter /Zones2/ ab.Die Unit-Tests in tests/unit/ (Vitest) laufen dagegen offline: Die reine Logik (ISBN-Prüfsummen, Bestands-Parsing) lebt in src/logic.js und wird gegen Fixtures geprüft; Verträge zwischen content.js, Manifest und Popup sind als Paritätstests gesichert.
Die Tests starten Chromium mit sichtbarem Fenster, weil Erweiterungen im Headless-Modus nicht zuverlässig unterstützt werden. Der externe Katalog antwortet bei vielen schnellen Aufrufen gelegentlich mit 503; deshalb ist ein Wiederholungsversuch konfiguriert und zwischen Feature-Tests liegt eine kurze Pause.
Für jede Zeile: Seite laden, ohne Überlappungen und mit bedienbaren Links/Buttons; bei Bedarf DevTools-Konsole auf Fehler prüfen.
| # | Szenario |
|---|---|
| 1 | Zones2 (/Zones2/): Katalog im iframe, Navigation, Schnellsuche sichtbar |
| 2 | Direkt …/alswww2.dll/APS_ZONES?fn=QuickSearch&Style=Portal3 |
| 3 | Suchergebnisseite: Suchbegriff mit vielen Treffern; Zeile „Ergebnisse (n)“; Sortierung ändern; Pagination (nächste Seite); mindestens eine Facette öffnen und schließen, ohne dass die Trefferliste springt |
| 4 | Bestand: einzelne Zeile aufklappen; „Bestand für alle Treffer laden“; ein Titel ohne physischen Bestand (E-Medium) zeigt „Kein Bestand“ |
| 5 | Mehr laden: zweimal nachladen, Zähler stimmt, Blätter-Links des Portals funktionieren weiterhin |
| 6 | ISBN: ISBN mit und ohne Bindestriche im Suchfeld; Nulltrefferseite direkt aufrufen → Hinweis erscheint |
| 7 | Facetten: „Autor“ öffnen, filtern, leeren; einen Filter setzen und über das × wieder entfernen |
| 8 | Popup: Design aus, Seite neu laden → Originaldarstellung; wieder an → modernisiert; Funktionsschalter einzeln prüfen |
| 9 | Desktop ca. 1280px und schmal ca. 390px: keine horizontale Scrollleiste, bedienbare Aktionen |
| 10 | Mein Konto: Felder, PIN-Hinweise, „Geheimnummer vergessen?“ und beide Aktionen prüfen |
| 11 | Vormerken: Medienangaben, Abholbibliothek, Hinweis zum Entgelt und Bestätigen/Abbrechen prüfen |
| 12 | Mobile vs. klassisch: Footer-Link zur mobilen Ansicht bzw. zurück, Layout brauchbar |
| 13 | Optional: Drucken der Liste: Inhalt sichtbar, geladener Bestand wird mitgedruckt |
manifest.json: MV3, Content-Scripts mit all_frames: true; Styles per web_accessible_resources nur bei „an“content.js: Bootstrap: Styles einhängen, Theme setzen, Module anwenden, DOM beobachtensrc/logic.js: reine Logik ohne DOM: ISBN-Erkennung, Such-URLs fürs Popup und Bestands-Parsing (auch für Node-Tests)src/util.js: gemeinsame Helfer: DOM-Knoten, Viewport, Reverter für reversible Eingriffe, fetch mit DOMParser und Parallelitätsbegrenzungsrc/facets.js: Kachel- und Panel-Layout für Facetten, Suchfelder und entfernbare Filter-Chipssrc/holdings.js, src/loadmore.js, src/query.js: Bestand, weitere Treffer und ISBN-Erkennungsrc/account.js: Konto-Login mit reversiblen semantischen Ergänzungensrc/pages.js: Schnellsuche und Vormerkung mit reversiblen Seitenmarkernpopup/: Katalogsuche und Schalter im Toolbar-Popupstyles/tokens.css: Design-Tokens; alle Farben der Komfort-Ansicht, dunkles Schema überschreibt nur Tokens (theme-dark.css)styles/base.css … components.css, results.css, pages.css, features.css, print.css: aufeinander aufbauende Overrides; pages.css für Konto/Quicksearch/Vormerkungicons/: fertige Icons (16/32/48/128 px)tests/: Playwright-Tests gegen den Live-Katalog (*.spec.ts) und Vitest-Unit-Tests offline (unit/)content.js liest die Einstellungen und ruft je Modul mount(settings) oder unmount() auf. Die Module sind idempotent: Ein zweiter mount() fügt nichts doppelt ein. unmount() stellt den ursprünglichen DOM wieder her; eigene Knoten tragen data-stbib-own.
Ein MutationObserver hält das synchron, denn Teile der Seite kommen erst nach document_idle: jQuery sortiert Facettenlisten um, Dialoge werden nachgeladen, und „Mehr laden“ hängt neue Trefferzeilen an, die ebenfalls Bestands-Schaltflächen brauchen. Eigene Einfügungen erkennt der Observer an data-stbib-own und ignoriert sie, damit er sich nicht selbst triggert.
Der Katalog selbst wird von der Stadtbibliothek Köln betrieben (Software: MondoIn Zones). Diese Erweiterung ist kein offizielles Angebot der Bibliothek. Sie sendet keine Daten an Dritte; alle Abfragen gehen ausschließlich an katalog.stbib-koeln.de, also an dieselbe Adresse, die der Browser beim normalen Blättern im Katalog aufruft. Details stehen in PRIVACY.md.
Fehler oder Vorschläge bitte als Issue auf GitHub oder per Mail an [email protected].
MIT, siehe LICENSE.