Refactoring Schritt 2: app.js nach Bereichen in static/js/app/ aufgeteilt; sw v106
32 klassische Skripte in der alten Reihenfolge (01-core … 99-init), ohne
Änderung am Code darin: geschnitten nur zwischen Anweisungen, je Datei
'use strict' wie vorher für die ganze Datei. Geprüft (acorn): kein Code, der
beim Laden läuft, braucht einen Namen aus einer späteren Datei. Globale
Funktionen und let/const bleiben global, die App-Schichten (native.js,
native-eink.js, …) umhüllen sie wie bisher. Template und sw.js-SHELL listen
die Dateien; diora-android build_web nimmt static/js rekursiv.
Getestet: 14 Browser-Tests (e2e), Desktop-App (Buch, Lesestand, Leiste im
Reader, Hell/Dunkel).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:30:43 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
// Reader settings
|
|
|
|
|
let readerSettings = { fontSize: 16, lineHeight: 1.8, maxWidth: 65, theme: 'dark',
|
|
|
|
|
fontFamily: 'serif', noBold: false, fontWeight: null,
|
PDF: öffnet an der gespeicherten Seite, Leserfarben, Seitenzahlen wie im Buch (sw CACHE v166)
Der Lesestand wird gleich beim Öffnen erfragt (parallel zur Datei), ein PDF zeichnet zuerst
die Seite, an der es weitergeht, statt Seite 1; Titel, Inhaltsverzeichnis und Seitenzahlen
kommen nebenher und halten das Öffnen nicht mehr auf. Eine Zeichnung, die schon läuft, wird
abgewartet statt neu begonnen.
„Leserfarben“ (neben Originalfarben und Invertieren): die Seite in den Farben des Lesers
(Dunkel, Sepia) per SVG-Filter, Bilder darüber wie gedruckt (ihre Lage aus den
Zeichenbefehlen); ein Bild, das die halbe Seite füllt, ist ein Scan und wird mit umgefärbt.
pdf.js' eigene pageColors färben die Bilder mit um. Ein anderes Design ändert nur die Farben
des Filters.
Seitenzahlen des Buchs (PageLabels: „iv“, „A-3“) im Kopf mit der Seite der Datei daneben,
eingeben lässt sich beides; Lesezeichen und der Zurück-Knopf nennen sie. Das Test-PDF hat
dafür Seitenzahlen und ein farbiges Bild bekommen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:42:26 +01:00
|
|
|
pdfZoom: 100, pdfInverted: false, pdfPageColors: false, pdfPaginated: false, pdfSpread: false };
|
Refactoring Schritt 2: app.js nach Bereichen in static/js/app/ aufgeteilt; sw v106
32 klassische Skripte in der alten Reihenfolge (01-core … 99-init), ohne
Änderung am Code darin: geschnitten nur zwischen Anweisungen, je Datei
'use strict' wie vorher für die ganze Datei. Geprüft (acorn): kein Code, der
beim Laden läuft, braucht einen Namen aus einer späteren Datei. Globale
Funktionen und let/const bleiben global, die App-Schichten (native.js,
native-eink.js, …) umhüllen sie wie bisher. Template und sw.js-SHELL listen
die Dateien; diora-android build_web nimmt static/js rekursiv.
Getestet: 14 Browser-Tests (e2e), Desktop-App (Buch, Lesestand, Leiste im
Reader, Hell/Dunkel).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:30:43 +02:00
|
|
|
let readerSettingsPanelOpen = false;
|
|
|
|
|
let currentPdfDoc = null;
|
|
|
|
|
let currentPdfBuffer = null;
|
|
|
|
|
|
|
|
|
|
// Bookmarks
|
|
|
|
|
let currentBookmarks = [];
|
|
|
|
|
let bookmarksDirty = false;
|
|
|
|
|
|
|
|
|
|
// Highlights
|
|
|
|
|
let currentHighlights = [];
|
|
|
|
|
let highlightsDirty = false;
|
|
|
|
|
let currentHighlightPopover = null;
|
|
|
|
|
|
|
|
|
|
// Search
|
|
|
|
|
let searchMatches = [];
|
|
|
|
|
let searchMatchIndex = -1;
|
|
|
|
|
let searchOriginalContent = null;
|
|
|
|
|
let readerSearchOpen = false;
|
|
|
|
|
|
|
|
|
|
// PDF paginated
|
|
|
|
|
let pdfCurrentPage = 1;
|
|
|
|
|
let pdfTotalPages = 0;
|
|
|
|
|
let _pdfPageTextBoxCache = {};
|
|
|
|
|
let _pdfRenderGen = 0;
|
|
|
|
|
let _touchStartX = 0;
|
|
|
|
|
let _readerScrollInterval = null;
|
|
|
|
|
let _readerScrollDir = 0;
|
|
|
|
|
let _readerScrollLastTs = 0;
|
|
|
|
|
const READER_SCROLL_SPEED = 1200; // constant px/s, no ramp-up
|
|
|
|
|
const READER_SCROLL_TICK_MS = 20; // fixed cadence, independent of the
|
|
|
|
|
// display's refresh rate — rAF runs at
|
|
|
|
|
// that rate (120/144/165Hz on plenty of
|
|
|
|
|
// laptops), which was driving 2-3x more
|
|
|
|
|
// scrollBy + scroll-listener work per
|
|
|
|
|
// second than intended and read as lag.
|
|
|
|
|
function _readerScrollTick() {
|
|
|
|
|
const now = performance.now();
|
|
|
|
|
const dt = now - _readerScrollLastTs;
|
|
|
|
|
_readerScrollLastTs = now;
|
|
|
|
|
$('reader-content')?.scrollBy({top: Math.round(_readerScrollDir * READER_SCROLL_SPEED * dt / 1000)});
|
|
|
|
|
}
|
|
|
|
|
let _pinchStartDist = 0;
|
|
|
|
|
let _pinchStartZoom = 100;
|
|
|
|
|
let _isPinching = false;
|
|
|
|
|
|
|
|
|
|
if (typeof pdfjsLib !== 'undefined') {
|
|
|
|
|
pdfjsLib.GlobalWorkerOptions.workerSrc = '/static/js/pdf.worker.min.js';
|
|
|
|
|
}
|