From 49d19cdbdb1b51e5a290b4e05821697d1e4cdf11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D1=80=D0=BD=D0=B0=D1=82=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Tue, 17 Feb 2026 21:31:51 +0300 Subject: [PATCH] edit --- BookReader/Resources/Raw/wwwroot/index.html | 31 ++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/BookReader/Resources/Raw/wwwroot/index.html b/BookReader/Resources/Raw/wwwroot/index.html index f3e6367..b6e4f3f 100644 --- a/BookReader/Resources/Raw/wwwroot/index.html +++ b/BookReader/Resources/Raw/wwwroot/index.html @@ -195,7 +195,34 @@ } return buf; } + function calculateOptimalLocationSize() { + // 1. Получаем размеры видимой области + const width = window.innerWidth; + const height = window.innerHeight; + // 2. Получаем текущий размер шрифта (из состояния или напрямую из настроек) + // Если размер шрифта еще не задан, используем 18px по умолчанию + const fontSize = state.currentFontSize || 18; + + // 3. Эмпирический коэффициент: + // На 1 квадратный пиксель при 18-м шрифте приходится примерно 0.005 - 0.007 символа. + // Мы рассчитываем "площадь" одного символа. + // Чем больше шрифт, тем больше места занимает символ (квадратичная зависимость). + const charArea = (fontSize * fontSize) * 0.55; + + // 4. Рассчитываем общую вместимость экрана в символах + const screenArea = width * height; + let charactersPerScreen = Math.floor(screenArea / charArea); + + // 5. Ограничиваем значения для стабильности epub.js + // Минимум 400 (чтобы не плодить тысячи локаций на маленьких текстах) + // Максимум 1500 (чтобы избежать "залипания" на больших экранах) + const finalSize = Math.max(400, Math.min(1500, charactersPerScreen)); + + debugLog(`Расчет локации: Экран ${width}x${height}, Шрифт ${fontSize}px => Размер локации: ${finalSize}`); + + return finalSize; + } // ========== MESSAGE BRIDGE (Связь с приложением) ========== function sendMessage(action, data) { // Отправка данных в нативный код (C# / Swift / Kotlin) const message = JSON.stringify({ action, data: data || {} }); @@ -299,8 +326,10 @@ } else { debugLog("Кэша нет, считаем в фоне..."); // Используем setTimeout, чтобы не блокировать поток отрисовки + const dynamicSize = calculateOptimalLocationSize(); + // Запускаем генерацию с динамическим размером setTimeout(() => { - state.book.locations.generate(2000).then(() => { + state.book.locations.generate(dynamicSize).then(() => { state.totalPages = state.book.locations.length(); const locationsToSave = state.book.locations.save();