diff --git a/lib/Epub/Epub.cpp b/lib/Epub/Epub.cpp index 28ab94f9..9eb96a09 100644 --- a/lib/Epub/Epub.cpp +++ b/lib/Epub/Epub.cpp @@ -336,6 +336,7 @@ void Epub::parseCssFiles() const { // load in the meta data for the epub file bool Epub::load(const bool buildIfMissing, const bool skipLoadingCss) { LOG_DBG("EBP", "Loading ePub: %s", filepath.c_str()); + tocReliabilityState = -1; // Initialize spine/TOC cache bookMetadataCache.reset(new BookMetadataCache(cachePath)); @@ -794,6 +795,18 @@ BookMetadataCache::TocEntry Epub::getTocItem(const int tocIndex) const { return {}; } + if (syntheticTocFallbackEnabled && !hasReliableToc()) { + const int spineCount = bookMetadataCache->getSpineCount(); + if (tocIndex < 0 || tocIndex >= spineCount) { + LOG_DBG("EBP", "getTocItem synthetic index:%d is out of range", tocIndex); + return {}; + } + + const auto spine = bookMetadataCache->getSpineEntry(tocIndex); + return BookMetadataCache::TocEntry("Section " + std::to_string(tocIndex + 1), spine.href, "", 1, + static_cast(tocIndex)); + } + if (tocIndex < 0 || tocIndex >= bookMetadataCache->getTocCount()) { LOG_DBG("EBP", "getTocItem index:%d is out of range", tocIndex); return {}; @@ -807,6 +820,10 @@ int Epub::getTocItemsCount() const { return 0; } + if (syntheticTocFallbackEnabled && !hasReliableToc()) { + return bookMetadataCache->getSpineCount(); + } + return bookMetadataCache->getTocCount(); } @@ -817,6 +834,14 @@ int Epub::getSpineIndexForTocIndex(const int tocIndex) const { return 0; } + if (syntheticTocFallbackEnabled && !hasReliableToc()) { + if (tocIndex < 0 || tocIndex >= bookMetadataCache->getSpineCount()) { + LOG_ERR("EBP", "getSpineIndexForTocIndex synthetic tocIndex %d out of range", tocIndex); + return 0; + } + return tocIndex; + } + if (tocIndex < 0 || tocIndex >= bookMetadataCache->getTocCount()) { LOG_ERR("EBP", "getSpineIndexForTocIndex: tocIndex %d out of range", tocIndex); return 0; @@ -831,7 +856,66 @@ int Epub::getSpineIndexForTocIndex(const int tocIndex) const { return spineIndex; } -int Epub::getTocIndexForSpineIndex(const int spineIndex) const { return getSpineItem(spineIndex).tocIndex; } +bool Epub::hasReliableToc() const { + if (tocReliabilityState != -1) { + return tocReliabilityState == 1; + } + + if (!bookMetadataCache || !bookMetadataCache->isLoaded()) { + tocReliabilityState = 0; + return false; + } + + const int spineCount = bookMetadataCache->getSpineCount(); + const int tocCount = bookMetadataCache->getTocCount(); + + if (spineCount <= 0 || tocCount <= 0) { + tocReliabilityState = 0; + return false; + } + + // If a larger book only exposes one TOC entry, treat TOC as unusable for chapter UX. + if (spineCount >= 8 && tocCount <= 1) { + tocReliabilityState = 0; + return false; + } + + std::vector spineReferenced(static_cast(spineCount), false); + int distinctSpinesReferenced = 0; + for (int i = 0; i < tocCount; i++) { + const auto toc = bookMetadataCache->getTocEntry(i); + if (toc.spineIndex >= 0 && toc.spineIndex < spineCount) { + const size_t idx = static_cast(toc.spineIndex); + if (!spineReferenced[idx]) { + spineReferenced[idx] = true; + distinctSpinesReferenced++; + } + } + } + + // Require at least 25% spine coverage from TOC references. + const bool reliable = (distinctSpinesReferenced * 4 >= spineCount); + tocReliabilityState = reliable ? 1 : 0; + return reliable; +} + +int Epub::getTocIndexForSpineIndex(const int spineIndex) const { + if (!bookMetadataCache || !bookMetadataCache->isLoaded()) { + LOG_ERR("EBP", "getTocIndexForSpineIndex called but cache not loaded"); + return -1; + } + + if (spineIndex < 0 || spineIndex >= bookMetadataCache->getSpineCount()) { + LOG_ERR("EBP", "getTocIndexForSpineIndex: spineIndex %d out of range", spineIndex); + return -1; + } + + if (syntheticTocFallbackEnabled && !hasReliableToc()) { + return spineIndex; + } + + return bookMetadataCache->getSpineEntry(spineIndex).tocIndex; +} size_t Epub::getBookSize() const { if (!bookMetadataCache || !bookMetadataCache->isLoaded() || bookMetadataCache->getSpineCount() == 0) { diff --git a/lib/Epub/Epub.h b/lib/Epub/Epub.h index 768d9458..77d52a04 100644 --- a/lib/Epub/Epub.h +++ b/lib/Epub/Epub.h @@ -29,6 +29,10 @@ class Epub { std::unique_ptr cssParser; // CSS files std::vector cssFiles; + // -1 unknown, 0 unreliable, 1 reliable + mutable int tocReliabilityState = -1; + // Library-level option: app code can override this per-book instance. + bool syntheticTocFallbackEnabled = false; bool findContentOpfFile(std::string* contentOpfFile) const; bool parseContentOpf(BookMetadataCache::BookMetadata& bookMetadata); @@ -69,6 +73,8 @@ class Epub { int getTocItemsCount() const; int getSpineIndexForTocIndex(int tocIndex) const; int getTocIndexForSpineIndex(int spineIndex) const; + bool hasReliableToc() const; + void setSyntheticTocFallbackEnabled(bool enabled) { syntheticTocFallbackEnabled = enabled; } size_t getCumulativeSpineItemSize(int spineIndex) const; int getSpineIndexForTextReference() const; diff --git a/lib/I18n/translations/catalan.yaml b/lib/I18n/translations/catalan.yaml index 29130ac9..a585019f 100644 --- a/lib/I18n/translations/catalan.yaml +++ b/lib/I18n/translations/catalan.yaml @@ -81,6 +81,7 @@ STR_SCREEN_MARGIN: "Marge de pantalla del lector" STR_PARA_ALIGNMENT: "Alineació de paràgrafs del lector" STR_HYPHENATION: "Partició de mots" STR_TIME_TO_SLEEP: "Temps per entrar en repòs" +STR_SHOW_HIDDEN_FILES: "Mostra fitxers ocults" STR_REFRESH_FREQ: "Freqüència de refresc" STR_KOREADER_SYNC: "Sincronització del KOReader" STR_CHECK_UPDATES: "Comprova si hi ha actualitzacions" diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index 6ab0b93f..5ee9e768 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -70,6 +70,7 @@ STR_IMAGES: "Images" STR_IMAGES_DISPLAY: "Display" STR_IMAGES_PLACEHOLDER: "Placeholder" STR_IMAGES_SUPPRESS: "Suppress" +STR_CREATE_FALLBACK_FOR_INVALID_TOC: "Create fallback for invalid TOC" STR_SHORT_PWR_BTN: "Short Power Button Click" STR_ORIENTATION: "Reading Orientation" STR_SIDE_BTN_LAYOUT: "Side Button Layout (reader)" diff --git a/lib/I18n/translations/french.yaml b/lib/I18n/translations/french.yaml index cecf85d2..f91e46f4 100644 --- a/lib/I18n/translations/french.yaml +++ b/lib/I18n/translations/french.yaml @@ -66,6 +66,10 @@ STR_SLEEP_COVER_MODE: "Mode écran de veille" STR_HIDE_BATTERY: "Masquer % batterie" STR_EXTRA_SPACING: "Espacement paragraphes" STR_TEXT_AA: "Lissage du texte" +STR_IMAGES: "Images" +STR_IMAGES_DISPLAY: "Affichage" +STR_IMAGES_PLACEHOLDER: "Espace réservé" +STR_IMAGES_SUPPRESS: "Masquer" STR_SHORT_PWR_BTN: "Appui court alim." STR_ORIENTATION: "Orientation de lecture" STR_SIDE_BTN_LAYOUT: "Boutons latéraux" @@ -77,6 +81,7 @@ STR_SCREEN_MARGIN: "Marges du lecteur" STR_PARA_ALIGNMENT: "Alignement du texte" STR_HYPHENATION: "Césure" STR_TIME_TO_SLEEP: "Mise en veille auto" +STR_SHOW_HIDDEN_FILES: "Afficher les fichiers cachés" STR_REFRESH_FREQ: "Fréquence rafraîchissement" STR_KOREADER_SYNC: "Synchro KOReader" STR_CHECK_UPDATES: "Mise à jour" @@ -180,6 +185,7 @@ STR_BACK: "« Retour" STR_EXIT: "« Quitter" STR_HOME: "« Accueil" STR_SELECT: "OK" +STR_SELECTED: "Sélectionné" STR_TOGGLE: "Modifier" STR_CONFIRM: "Confirmer" STR_CANCEL: "Annuler" @@ -189,6 +195,8 @@ STR_DOWNLOAD: "Télécharger" STR_RETRY: "Réessayer" STR_YES: "Oui" STR_NO: "Non" +STR_SHOW: "Afficher" +STR_HIDE: "Masquer" STR_STATE_ON: "ON" STR_STATE_OFF: "OFF" STR_NOT_SET: "Non défini" @@ -199,6 +207,21 @@ STR_DIR_DOWN: "Bas" STR_OK_BUTTON: "OK" STR_SLEEP_COVER_FILTER: "Filtre écran de veille" STR_FILTER_CONTRAST: "Contraste" +STR_CUSTOMISE_STATUS_BAR: "Personnaliser la barre d'état" +STR_CHAPTER_PAGE_COUNT: "Nombre de pages du chapitre" +STR_BOOK_PROGRESS_PERCENTAGE: "Pourcentage de progression" +STR_PROGRESS_BAR: "Barre de progression" +STR_PROGRESS_BAR_THICKNESS: "Épaisseur de la barre" +STR_PROGRESS_BAR_THIN: "Fine" +STR_PROGRESS_BAR_MEDIUM: "Moyenne" +STR_PROGRESS_BAR_THICK: "Épaisse" +STR_BOOK: "Livre" +STR_CHAPTER: "Chapitre" +STR_EXAMPLE_CHAPTER: "Chapitre 21" +STR_EXAMPLE_BOOK: "Titre du livre" +STR_PREVIEW: "Aperçu" +STR_TITLE: "Titre" +STR_BATTERY: "Batterie" STR_UI_THEME: "Thème interface" STR_THEME_CLASSIC: "Classique" STR_THEME_LYRA: "Lyra" @@ -231,6 +254,7 @@ STR_GO_HOME_BUTTON: "Retour Accueil" STR_SYNC_PROGRESS: "Synchro progression" STR_DELETE_CACHE: "Supprimer cache livre" STR_DELETE: "Supprimer" +STR_DISPLAY_QR: "Afficher la page en QR" STR_CHAPTER_PREFIX: "Chapitre : " STR_PAGES_SEPARATOR: " pages | " STR_BOOK_PREFIX: "Livre : " @@ -260,4 +284,9 @@ STR_UPLOAD: "Envoyer" STR_BOOK_S_STYLE: "Style du livre" STR_EMBEDDED_STYLE: "Style intégré" STR_OPDS_SERVER_URL: "URL serveur OPDS" +STR_FOOTNOTES: "Notes de bas de page" +STR_NO_FOOTNOTES: "Aucune note sur cette page" +STR_LINK: "[lien]" STR_SCREENSHOT_BUTTON: "Capture d'écran" +STR_AUTO_TURN_ENABLED: "Tourne-page auto : " +STR_AUTO_TURN_PAGES_PER_MIN: "Tourne-page auto (pages par minute)" diff --git a/lib/I18n/translations/german.yaml b/lib/I18n/translations/german.yaml index cd1ba2cd..b53ff494 100644 --- a/lib/I18n/translations/german.yaml +++ b/lib/I18n/translations/german.yaml @@ -98,6 +98,11 @@ STR_AUTH_SUCCESS: "Erfolgreich authentifiziert!" STR_KOREADER_AUTH: "KOReader-Auth" STR_SYNC_READY: "KOReader-Synchronisierung bereit" STR_AUTH_FAILED: "Authentifizierung fehlg." +STR_REGISTER: "Registrieren" +STR_REGISTERING: "Registrierung..." +STR_REGISTER_SUCCESS: "Konto erfolgreich erstellt!" +STR_REGISTER_FAILED: "Registrierung fehlgeschlagen" +STR_USERNAME_TAKEN: "Benutzername bereits vergeben" STR_DONE: "Erledigt" STR_CLEAR_CACHE_WARNING_1: "Alle Buch-Caches werden geleert." STR_CLEAR_CACHE_WARNING_2: "Lesefortschritt wird gelöscht!" @@ -250,6 +255,7 @@ STR_SYNC_PROGRESS: "Fortschritt synchronisieren" STR_DELETE_CACHE: "Buch-Cache leeren" STR_DISPLAY_QR: "Seite als QR anzeigen" STR_DELETE: "Löschen" +STR_REMOVE: "Entfernen" STR_CHAPTER_PREFIX: "Kapitel:" STR_PAGES_SEPARATOR: " Seiten | " STR_BOOK_PREFIX: "Buch: " diff --git a/lib/I18n/translations/polish.yaml b/lib/I18n/translations/polish.yaml index d669ec27..c5d9fed1 100644 --- a/lib/I18n/translations/polish.yaml +++ b/lib/I18n/translations/polish.yaml @@ -81,6 +81,7 @@ STR_SCREEN_MARGIN: "Marginesy ekranu" STR_PARA_ALIGNMENT: "Wyjustowanie paragrafów" STR_HYPHENATION: "Dzielenie wyrazów" STR_TIME_TO_SLEEP: "Czas do uśpienia" +STR_SHOW_HIDDEN_FILES: "Pokaż ukryte pliki" STR_REFRESH_FREQ: "Częstotliwość odświeżania" STR_KOREADER_SYNC: "KOReader Sync" STR_CHECK_UPDATES: "Sprawdź uaktualnia" diff --git a/lib/I18n/translations/romanian.yaml b/lib/I18n/translations/romanian.yaml index 64631807..27ec6e4a 100644 --- a/lib/I18n/translations/romanian.yaml +++ b/lib/I18n/translations/romanian.yaml @@ -12,7 +12,7 @@ STR_SETTINGS_TITLE: "Setări" STR_CONTINUE_READING: "Continuă lectura" STR_NO_OPEN_BOOK: "Nicio carte deschisă" STR_START_READING: "Începeţi lectura" -STR_NO_FILES_FOUND: "Nu s-au găsit fișiere" +STR_NO_FILES_FOUND: "Nu s-au găsit fişiere" STR_SELECT_CHAPTER: "Selectaţi capitolul" STR_NO_CHAPTERS: "Niciun capitol" STR_END_OF_BOOK: "Sfârşitul cărţii" @@ -66,6 +66,10 @@ STR_SLEEP_COVER_MODE: "Mod ecran de repaus cu copertă" STR_HIDE_BATTERY: "Ascunde procentul bateriei" STR_EXTRA_SPACING: "Spaţiere suplimentară între paragrafe" STR_TEXT_AA: "Anti-Aliasing text" +STR_IMAGES: "Imagini" +STR_IMAGES_DISPLAY: "Afişare" +STR_IMAGES_PLACEHOLDER: "Substituent" +STR_IMAGES_SUPPRESS: "Suprimare" STR_SHORT_PWR_BTN: "Apăsare scurtă întrerupător" STR_ORIENTATION: "Orientare lectură" STR_SIDE_BTN_LAYOUT: "Aspect butoane laterale (lectură)" @@ -77,6 +81,7 @@ STR_SCREEN_MARGIN: "Margine ecran lectură" STR_PARA_ALIGNMENT: "Aliniere paragrafe reader" STR_HYPHENATION: "Silabisire" STR_TIME_TO_SLEEP: "Timp până la repaus" +STR_SHOW_HIDDEN_FILES: "Afişează fişierele ascunse" STR_REFRESH_FREQ: "Frecvenţă reîmprospătare" STR_KOREADER_SYNC: "Sincronizare KOReader" STR_CHECK_UPDATES: "Căutaţi actualizări" @@ -190,7 +195,7 @@ STR_DOWNLOAD: "Descarcă" STR_RETRY: "Reîncercare" STR_YES: "Da" STR_NO: "Nu" -STR_SHOW: "Afișează" +STR_SHOW: "Afişează" STR_HIDE: "Ascunde" STR_STATE_ON: "Pornit" STR_STATE_OFF: "Oprit" @@ -249,7 +254,7 @@ STR_GO_HOME_BUTTON: "Acasă" STR_SYNC_PROGRESS: "Progres sincronizare" STR_DELETE_CACHE: "Ştergere cache cărţi" STR_DELETE: "Ştergeți" -STR_DISPLAY_QR: "Afișați pagina ca cod QR" +STR_DISPLAY_QR: "Afişați pagina ca cod QR" STR_CHAPTER_PREFIX: "Capitol: " STR_PAGES_SEPARATOR: " pagini | " STR_BOOK_PREFIX: "Carte: " diff --git a/lib/I18n/translations/russian.yaml b/lib/I18n/translations/russian.yaml index 0cda986e..82a1c188 100644 --- a/lib/I18n/translations/russian.yaml +++ b/lib/I18n/translations/russian.yaml @@ -66,6 +66,10 @@ STR_SLEEP_COVER_MODE: "Режим обложки сна" STR_HIDE_BATTERY: "Скрыть % батареи" STR_EXTRA_SPACING: "Доп. интервал абзаца" STR_TEXT_AA: "Сглаживание текста" +STR_IMAGES: "Изображения" +STR_IMAGES_DISPLAY: "Показать" +STR_IMAGES_PLACEHOLDER: "Заглушки" +STR_IMAGES_SUPPRESS: "Скрыть" STR_SHORT_PWR_BTN: "Короткое нажатие PWR" STR_ORIENTATION: "Ориентация чтения" STR_SIDE_BTN_LAYOUT: "Боковые кнопки" @@ -77,6 +81,7 @@ STR_SCREEN_MARGIN: "Поля экрана" STR_PARA_ALIGNMENT: "Выравнивание абзаца" STR_HYPHENATION: "Перенос слов" STR_TIME_TO_SLEEP: "Сон через" +STR_SHOW_HIDDEN_FILES: "Показать скрытые файлы" STR_REFRESH_FREQ: "Частота обновления" STR_KOREADER_SYNC: "Синхронизация KOReader" STR_CHECK_UPDATES: "Проверить обновления" @@ -212,6 +217,7 @@ STR_PROGRESS_BAR_MEDIUM: "Средний" STR_PROGRESS_BAR_THICK: "Толстый" STR_BOOK: "Книга" STR_CHAPTER: "Глава" +STR_EXAMPLE_CHAPTER: "Глава 21" STR_EXAMPLE_BOOK: "Название книги" STR_PREVIEW: "Предпросмотр" STR_TITLE: "Заглавие" @@ -223,6 +229,9 @@ STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_SUNLIGHT_FADING_FIX: "Компенсация выцветания" STR_REMAP_FRONT_BUTTONS: "Переназначить передние кнопки" STR_OPDS_BROWSER: "OPDS браузер" +STR_FOOTNOTES: "Примечания" +STR_NO_FOOTNOTES: "На данной странице нет примечаний" +STR_LINK: "[ссылка]" STR_COVER_CUSTOM: "Обложка + Свой" STR_MENU_RECENT_BOOKS: "Недавние книги" STR_NO_RECENT_BOOKS: "Нет недавних книг" @@ -279,3 +288,5 @@ STR_BOOK_S_STYLE: "Стиль книги" STR_EMBEDDED_STYLE: "Встроенный стиль" STR_OPDS_SERVER_URL: "URL OPDS сервера" STR_SCREENSHOT_BUTTON: "Сделать снимок экрана" +STR_AUTO_TURN_ENABLED: "Авто-поворот включён: " +STR_AUTO_TURN_PAGES_PER_MIN: "Авто-поворот (Страниц в минуту)" diff --git a/lib/I18n/translations/swedish.yaml b/lib/I18n/translations/swedish.yaml index 3d6e76f0..c5e577e3 100644 --- a/lib/I18n/translations/swedish.yaml +++ b/lib/I18n/translations/swedish.yaml @@ -78,9 +78,10 @@ STR_FONT_FAMILY: "Eboksläsarens typsnittsfamilj" STR_FONT_SIZE: "Eboksläsarens typsnittsstorlek" STR_LINE_SPACING: "Eboksläsarens linjemellanrum" STR_SCREEN_MARGIN: "Eboksläsarens skärmmarginal" -STR_PARA_ALIGNMENT: "Eboksläsarens paragraflinjeplacering" +STR_PARA_ALIGNMENT: "Eboksläsarens paragrafjustering" STR_HYPHENATION: "Avstavning" STR_TIME_TO_SLEEP: "Tid för att gå i vila" +STR_SHOW_HIDDEN_FILES: "Visa dolda filer" STR_REFRESH_FREQ: "Uppdateringsfrekvens" STR_KOREADER_SYNC: "KOReader-synkronisering" STR_CHECK_UPDATES: "Kolla efter uppdateringar" @@ -142,7 +143,7 @@ STR_X_LARGE: "Extra stor" STR_TIGHT: "Smal" STR_NORMAL: "Normal" STR_WIDE: "Bred" -STR_JUSTIFY: "Rättfärdiga" +STR_JUSTIFY: "Justerad" STR_ALIGN_LEFT: "Vänster" STR_CENTER: "Mitten" STR_ALIGN_RIGHT: "Höger" @@ -224,7 +225,7 @@ STR_BATTERY: "Batteri" STR_UI_THEME: "Användargränssnittstema" STR_THEME_CLASSIC: "Klassisk" STR_THEME_LYRA: "Lyra" -STR_THEME_LYRA_EXTENDED: "Lyra Extended" +STR_THEME_LYRA_EXTENDED: "Lyra utökad" STR_SUNLIGHT_FADING_FIX: "Fix för solskensmattning" STR_REMAP_FRONT_BUTTONS: "Ändra frontknappar" STR_OPDS_BROWSER: "OPDS-webbläsare" diff --git a/lib/I18n/translations/ukrainian.yaml b/lib/I18n/translations/ukrainian.yaml index 16b69760..9eefa022 100644 --- a/lib/I18n/translations/ukrainian.yaml +++ b/lib/I18n/translations/ukrainian.yaml @@ -66,6 +66,10 @@ STR_SLEEP_COVER_MODE: "Режим обкладинки екрана сну" STR_HIDE_BATTERY: "Приховати % батареї" STR_EXTRA_SPACING: "Додатковий інтервал між абзацами" STR_TEXT_AA: "Згладжування тексту" +STR_IMAGES: "Зображення" +STR_IMAGES_DISPLAY: "Показати" +STR_IMAGES_PLACEHOLDER: "Заглушка" +STR_IMAGES_SUPPRESS: "Приховати" STR_SHORT_PWR_BTN: "Коротке натискання кнопки живлення" STR_ORIENTATION: "Орієнтація читання" STR_SIDE_BTN_LAYOUT: "Розташування бічних кнопок (читач)" @@ -81,6 +85,7 @@ STR_REFRESH_FREQ: "Частота оновлення" STR_KOREADER_SYNC: "Синхронізація KOReader" STR_CHECK_UPDATES: "Перевірити оновлення" STR_LANGUAGE: "Мова" +STR_SHOW_HIDDEN_FILES: "Показати приховані файли" STR_CLEAR_READING_CACHE: "Очистити кеш читання" STR_USERNAME: "Ім'я користувача" STR_PASSWORD: "Пароль" diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index b5bb2bfd..cfcf11ec 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -202,6 +202,8 @@ class CrossPointSettings { uint8_t showHiddenFiles = 0; // Image rendering mode in EPUB reader uint8_t imageRendering = IMAGES_DISPLAY; + // Enable synthetic TOC fallback for malformed/sparse TOC books (1 = enabled, 0 = disabled) + uint8_t syntheticTocFallback = 1; ~CrossPointSettings() = default; diff --git a/src/SettingsList.h b/src/SettingsList.h index 6df517b2..1d9bca0a 100644 --- a/src/SettingsList.h +++ b/src/SettingsList.h @@ -67,6 +67,8 @@ inline const std::vector& getSettingsList() { SettingInfo::Enum(StrId::STR_IMAGES, &CrossPointSettings::imageRendering, {StrId::STR_IMAGES_DISPLAY, StrId::STR_IMAGES_PLACEHOLDER, StrId::STR_IMAGES_SUPPRESS}, "imageRendering", StrId::STR_CAT_READER), + SettingInfo::Toggle(StrId::STR_CREATE_FALLBACK_FOR_INVALID_TOC, &CrossPointSettings::syntheticTocFallback, + "syntheticTocFallback", StrId::STR_CAT_READER), // --- Controls --- SettingInfo::Enum(StrId::STR_SIDE_BTN_LAYOUT, &CrossPointSettings::sideButtonLayout, {StrId::STR_PREV_NEXT, StrId::STR_NEXT_PREV}, "sideButtonLayout", StrId::STR_CAT_CONTROLS), diff --git a/src/activities/reader/ReaderActivity.cpp b/src/activities/reader/ReaderActivity.cpp index 2164a7f6..6a62cb70 100644 --- a/src/activities/reader/ReaderActivity.cpp +++ b/src/activities/reader/ReaderActivity.cpp @@ -37,6 +37,7 @@ std::unique_ptr ReaderActivity::loadEpub(const std::string& path) { } auto epub = std::unique_ptr(new Epub(path, "/.crosspoint")); + epub->setSyntheticTocFallbackEnabled(SETTINGS.syntheticTocFallback != 0); if (epub->load(true, SETTINGS.embeddedStyle == 0)) { return epub; }