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>
54 lines
1.9 KiB
JavaScript
54 lines
1.9 KiB
JavaScript
'use strict';
|
|
|
|
// Reader settings
|
|
let readerSettings = { fontSize: 16, lineHeight: 1.8, maxWidth: 65, theme: 'dark',
|
|
fontFamily: 'serif', noBold: false, fontWeight: null,
|
|
pdfZoom: 100, pdfInverted: false, pdfPageColors: false, pdfPaginated: false, pdfSpread: false };
|
|
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';
|
|
}
|