contents for reading

This commit is contained in:
sergeych committed 2026-05-25 20:37:32 +03:00
1 parent cde4d89eed
commit 7681590992
7 files changed
+301 -22

No files matched your search

@@ -665,16 +665,34 @@ private fun ReadingPosition.toFormatHintsJson(): String =
buildString {
append("""{"firstVisibleItemIndex":$itemIndex,"firstVisibleItemScrollOffset":$scrollOffset""")
readAloudSentenceIndex?.let { append(""","readAloudSentenceIndex":$it""") }
if (backStack.isNotEmpty()) {
append(""","backStack":[""")
append(backStack.take(MaxStoredReadingBackStack).joinToString(",") { it.toFormatHintsJson() })
append("]")
}
append("}")
}
private fun String.toReadingPosition(): ReadingPosition? {
val position = toReadingPositionObject() ?: return null
val backStackJson = Regex(""""backStack"\s*:\s*\[(.*)]""").find(this)?.groupValues?.getOrNull(1)
val backStack = backStackJson
?.let { ReadingPositionObjectRegex.findAll(it).mapNotNull { match -> match.value.toReadingPositionObject() }.toList() }
.orEmpty()
.take(MaxStoredReadingBackStack)
return position.copy(backStack = backStack)
}
private fun String.toReadingPositionObject(): ReadingPosition? {
val index = Regex(""""firstVisibleItemIndex"\s*:\s*(\d+)""").find(this)?.groupValues?.getOrNull(1)?.toIntOrNull()
val offset = Regex(""""firstVisibleItemScrollOffset"\s*:\s*(\d+)""").find(this)?.groupValues?.getOrNull(1)?.toIntOrNull()
val sentenceIndex = Regex(""""readAloudSentenceIndex"\s*:\s*(\d+)""").find(this)?.groupValues?.getOrNull(1)?.toIntOrNull()
return if (index != null && offset != null) ReadingPosition(index, offset, sentenceIndex) else null
}
private val ReadingPositionObjectRegex = Regex("""[{][^{}]*[}]""")
private const val MaxStoredReadingBackStack = 10
private fun String.toSearchPrefixes(): List<String> =
SearchPrefixRegex.findAll(lowercase()).map { it.value }.distinct().toList()