General fixes (#102)

* Improved PDF embedded annotation hit detection logic

* Updated EPUB and PDF reader logic to improve position tracking and TTS stability.

Key changes:
- Refined CFI and locator handling in `EpubReaderScreen` with improved initialization.
- Updated `BookPaginator` to more accurately calculate text offsets in chunks and improve CFI matching logic.
- Modified `TtsPlaybackManager` to insert media items at the correct index, ensuring proper playback order.
- Simplified `EpubReaderTts` page scrolling by removing conditional checks for backward jumps.
- Disabled OCR fallback in `PdfViewerScreen` during text extraction for TTS.

* Updated extractTextWithCfiFromTop to use getBoundingClientRect for identifying the starting block
This commit is contained in:
Aryan 2026-03-21 11:49:27 +05:30 committed by GitHub
parent ddcd253c7b
commit fbe8e7aa56
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 95 additions and 184 deletions

View file

@ -884,11 +884,15 @@ fun EpubReaderHost(
var chapterHead by remember(currentChapterIndex) { mutableStateOf("") }
var isChapterParsing by remember(currentChapterIndex) { mutableStateOf(true) }
var cfiToLoad by remember { mutableStateOf<String?>(null) }
var cfiToLoad by remember { mutableStateOf(initialCfi) }
var fragmentToLoad by remember { mutableStateOf<String?>(null) }
var isInitialCfiLoad by remember(initialLocator) { mutableStateOf(initialLocator != null) }
var bookmarkPageMap by remember { mutableStateOf<Map<String, Int>>(emptyMap()) }
LaunchedEffect(Unit) {
Timber.tag("POS_DIAG").d("Reader Opening: initialLocator=$initialLocator, initialCfi=$initialCfi")
}
var initialScrollTargetForChapter by rememberSaveable(epubBook.title) {
mutableStateOf(if (initialLocator != null) null else ChapterScrollPosition.START)
}
@ -1175,8 +1179,8 @@ fun EpubReaderHost(
var foundIdx = -1
for (i in chunks.indices) {
val c = chunks[i]
val cPath = c.sourceCfi.substringBefore(":")
val bPath = baseCfi.substringBefore(":")
val cPath = com.aryan.reader.paginatedreader.CfiUtils.getPath(c.sourceCfi)
val bPath = com.aryan.reader.paginatedreader.CfiUtils.getPath(baseCfi)
if (cPath == bPath && startOffset >= c.startOffsetInSource && startOffset < c.startOffsetInSource + c.text.length) {
foundIdx = i
break
@ -2550,10 +2554,9 @@ fun EpubReaderHost(
showDictionaryUpsellDialog = true
},
onCfiGenerated = { cfi ->
Timber.tag("PosSaveDiag").d("EpubReaderScreen: onCfiGenerated callback triggered with CFI: '$cfi'")
Timber.tag("POS_DIAG").d("JS generated CFI: '$cfi'")
if (cfi.isBlank() || !cfi.startsWith('/')) {
Timber.tag("PosSaveDiag").w("EpubReaderScreen: onCfiGenerated received an invalid CFI, aborting save: '$cfi'")
if (isSavingAndExiting) {
isSavingAndExiting = false
onNavigateBack()
@ -2562,7 +2565,6 @@ fun EpubReaderHost(
}
scope.launch {
Timber.tag("PosSaveDiag").d("EpubReaderScreen: Requesting locator conversion for chapter $latestChapterIndex")
val locator =
locatorConverter.getLocatorFromCfi(
epubBook,
@ -2570,8 +2572,6 @@ fun EpubReaderHost(
cfi
)
Timber.tag("PosSaveDiag").d("EpubReaderScreen: Locator conversion returned: $locator")
if (locator != null) {
lastKnownLocator = locator
@ -2639,8 +2639,7 @@ fun EpubReaderHost(
} else {
0f
}
Timber.d("CFI received for saving: $cfi. Progress: $progress%"
)
Timber.tag("POS_DIAG").i("Saving Position: Chapter=$latestChapterIndex, CFI=$cfi, Progress=$progress%")
onSavePosition(locator, cfi, progress)
} else {
Timber.w("Failed to convert CFI to Locator: $cfi."