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();