diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..62f7085 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,107 @@ +# CLAUDE.md + +Zwei eigenstaendige Userscripts, die die phpBB-Seiten von `cs.rin.ru` fuer +Safari auf iOS in eine mobile Ansicht umbauen. Kein Build, keine +Abhaengigkeiten, kein `package.json` — die `.user.js`-Dateien sind das Produkt. + +| Datei | Greift auf | Zweck | +|---|---|---| +| `rin-mobile.user.js` | `*://cs.rin.ru/forum/*` | Themenlisten als Karten | +| `rin-thread.user.js` | `*://cs.rin.ru/forum/viewtopic.php*` | Thread als Beitragsstrom + Navigationsleiste | +| `dev/*.dev.user.js` | zusaetzlich `localhost:*` | Loader, binden per `@require file:///` die echten Scripts ein | +| `dev/viewtopic.php` | — | Fixture: gespeicherter Thread, 1114 Seiten | + +## Gemeinsames Muster beider Scripts + +Beide sind nach demselben Schema gebaut, Aenderungen am einen sind oft auch am +anderen faellig: + +1. IIFE mit `'use strict'`, `DEBUG`-Flag und `log`-Array ganz oben +2. Viewport-Meta setzen (idempotent ueber `[data-rm]`) +3. Kompletter Style-Block als Template-Literal, **bedingungslos** injiziert +4. `build()` liest das Original-DOM, baut ein neues `div.rm-root` +5. Alle bisherigen `body`-Kinder bekommen `.rm-hidden`, dann wird `root` + angehaengt +6. `run()` haengt bei `DEBUG` das gruene Overlay oben an +7. Start ueber `DOMContentLoaded`, falls `readyState === 'loading'` + +## Fallen, die nicht aus dem Code hervorgehen + +**Beide Stylesheets sind auf Threadseiten gleichzeitig aktiv.** +`rin-mobile` matcht `*://cs.rin.ru/forum/*`, also auch `viewtopic.php`. Sein +`build()` steigt dort zwar aus, der Style-Block wird aber vorher injiziert. +Gleich benannte Klassen kollidieren mit identischer Spezifitaet, entschieden +wird nach Ladereihenfolge der Userscripts — und die ist nicht garantiert. + +- Nur bewusst geteilt: `.rm-root`, `.rm-hidden`, `.rm-dbg` +- **Offene Kollision:** `.rm-root` hat in `rin-mobile` `padding:0 !important`, + in `rin-thread` `padding:0 0 64px 0 !important`. Laedt `rin-mobile` spaeter, + faellt die Freihaltung hinter der fixierten Leiste weg. Noch nicht behoben. +- Neue Klassen im Thread-Script gegen `rin-mobile.user.js` gegenpruefen. + `.rm-goto` und `.rm-grid` heissen genau deshalb so — `.rm-jump` und + `.rm-pages` waren dort schon belegt. + +**Was nach `body` soll, muss nach der Ausblend-Schleife angehaengt werden.** +Die Schleife markiert *alle* vorhandenen `body`-Kinder mit `.rm-hidden`. Das +Sheet im Thread-Script wird deshalb erst beim ersten Antippen gebaut — das +loest das Problem nebenbei mit. + +**`Page X of Y` steht als `Page 1 of 1114` +im Markup.** Ein Grep im Roh-HTML nach `Page 1 of` findet nichts, die Regex auf +`txt(document.body)` greift trotzdem. Nicht vorschnell fuer kaputt halten. + +**`per_page` kommt aus der `jumpto()`-Funktion der Seite** +(`var per_page = '15';`). Nur damit lassen sich Seiten-URLs als +`start = (Seite - 1) * per_page` selbst bauen. Die gerenderten Seitenlinks +taugen nicht als Quelle — phpBB zeigt bei 1114 Seiten nur `1, 2, 3, 4, 5 … 1114`. +Ohne `per_page` degradiert die Leiste auf erste Seite plus die +Original-Zurueck/Weiter-Links, das Sheet verschwindet. + +**`postRow()` steigt bewusst mehrere `tr` hoch.** Der Beitragstext liegt in +einer verschachtelten Tabelle, `closest('tr')` trifft die innere Zeile ohne +Autor- und Profilspalte. + +**`DEBUG` steht in beiden Dateien auf `true`** und muss vor dem Ausliefern in +beiden auf `false`. Die Versionsnummer steht ebenfalls doppelt: im +`@version`-Header und im Text des Debug-Overlays. + +## Testen + +Es gibt keine Testsuite. Bewaehrt hat sich ein Wegwerf-Harness mit jsdom im +Scratchpad (nicht im Repo ablegen — das Projekt soll abhaengigkeitsfrei +bleiben): + +```js +const dom = new JSDOM(html, { url: 'https://cs.rin.ru/forum/viewtopic.php?f=10&t=68689&start=45' }); +``` + +Drei Stolpersteine dabei: + +- JSDOM parst asynchron fertig. Nach `eval(src)` rund 60 ms warten, sonst hat + das Script noch auf `DOMContentLoaded` gewartet und nichts gebaut. +- `location.href` ist in JSDOM nicht ueberschreibbar. Fuer Navigationstests im + eingelesenen Quelltext `location.href = u;` durch einen Hook ersetzen. +- `requestAnimationFrame` und `scrollIntoView` fehlen und muessen gestubbt + werden. + +Sinnvolle Faelle: erste Seite, zweite Seite, Mitte, letzte Seite, dazu die +Degradation ohne `per_page` und ein Thread ohne Paginierung. Fixture-Eckdaten: +`f=10&t=68689`, `per_page = 15`, 1114 Seiten, letzte Seite `start=16695`. + +Am Geraet zu pruefen bleibt, was Blink nicht zeigt: `env(safe-area-inset-*)`, +fixierte Leisten gegen Safaris ein- und ausfahrende Toolbar, +`-webkit-backdrop-filter`, Schriftskalierung. Details und die +Tampermonkey-Einrichtung stehen in der README. + +## Konventionen + +- **ES5-Stil im Script-Code:** `var`, `function`, keine Arrow Functions, kein + `let`/`const`. Template-Literals und `Set` sind in Gebrauch. Keine + Transpilation, kein Linter. +- **Kommentare deutsch, Umlaute als `ae`/`oe`/`ue` transliteriert.** Echte + Umlaute nur in Strings und Regexes, die im UI landen. +- Kommentare begruenden, warum etwas so gebaut ist (welche DOM-Eigenheit von + phpBB dahintersteckt), nicht was der Code tut. +- CSS-Klassen durchgaengig mit `rm-` praefixiert. +- Neue nutzersichtbare Funktionen in der README dokumentieren — zweisprachig, + siehe globale Anweisung.