From fefeecd6500996a842fda067793edfc3bc26437a Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:33:40 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20Always=20show=20chapter?= =?UTF-8?q?s=20in=20Reader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In all file formats (except EPUB) using first line as chapter title (which is usually book title) --- .../book_story/data/parser/fb2/Fb2TextParser.kt | 15 ++++++++++++--- .../data/parser/html/HtmlTextParser.kt | 17 ++++++++++++++--- .../book_story/data/parser/pdf/PdfTextParser.kt | 15 ++++++++++++--- .../book_story/data/parser/txt/TxtTextParser.kt | 15 ++++++++++++--- .../data/repository/BookRepositoryImpl.kt | 5 +---- .../data/repository/FileSystemRepositoryImpl.kt | 5 +---- .../screens/reader/data/ReaderViewModel.kt | 2 +- 7 files changed, 53 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2TextParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2TextParser.kt index dffc7d89..0ce16f31 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2TextParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/fb2/Fb2TextParser.kt @@ -8,10 +8,11 @@ import org.w3c.dom.Element import org.w3c.dom.NodeList import ua.acclorite.book_story.R import ua.acclorite.book_story.data.parser.TextParser +import ua.acclorite.book_story.domain.model.Chapter import ua.acclorite.book_story.domain.model.ChapterWithText import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.domain.util.UIText -import ua.acclorite.book_story.presentation.core.constants.Constants +import ua.acclorite.book_story.presentation.core.util.clearMarkdown import java.io.File import javax.inject.Inject import javax.xml.parsers.DocumentBuilderFactory @@ -114,15 +115,23 @@ class Fb2TextParser @Inject constructor() : TextParser { yield() - if (formattedLines.isEmpty()) { + if (formattedLines.size < 2) { return Resource.Error(UIText.StringResource(R.string.error_file_empty)) } + val title = formattedLines.first().clearMarkdown() + formattedLines.removeAt(0) + Log.i(FB2_TAG, "Successfully finished FB2 parsing.") Resource.Success( listOf( ChapterWithText( - chapter = Constants.EMPTY_CHAPTER, + chapter = Chapter( + index = 0, + title = title, + startIndex = 0, + endIndex = formattedLines.lastIndex + ), text = formattedLines ) ) diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlTextParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlTextParser.kt index e01a8c34..3de45970 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlTextParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/html/HtmlTextParser.kt @@ -10,6 +10,7 @@ import ua.acclorite.book_story.domain.model.Chapter import ua.acclorite.book_story.domain.model.ChapterWithText import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.domain.util.UIText +import ua.acclorite.book_story.presentation.core.util.clearMarkdown import java.io.File import javax.inject.Inject @@ -23,20 +24,30 @@ class HtmlTextParser @Inject constructor( Log.i(HTML_TAG, "Started HTML parsing: ${file.name}.") return try { - val lines = documentParser.run { Jsoup.parse(file).parseDocument() } + val lines = documentParser.run { + Jsoup.parse(file).parseDocument() + }.toMutableList() yield() - if (lines.isEmpty()) { + if (lines.size < 2) { Log.e(HTML_TAG, "Could not extract text from HTML.") return Resource.Error(UIText.StringResource(R.string.error_file_empty)) } + val title = lines.first().clearMarkdown() + lines.removeAt(0) + Log.i(HTML_TAG, "Successfully finished HTML parsing.") Resource.Success( listOf( ChapterWithText( - chapter = Chapter(title = "", startIndex = 0, endIndex = 0), + chapter = Chapter( + index = 0, + title = title, + startIndex = 0, + endIndex = lines.lastIndex + ), text = lines ) ) diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt index 898e5129..15be7b3c 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt @@ -8,10 +8,11 @@ import com.tom_roush.pdfbox.text.PDFTextStripper import kotlinx.coroutines.yield import ua.acclorite.book_story.R import ua.acclorite.book_story.data.parser.TextParser +import ua.acclorite.book_story.domain.model.Chapter import ua.acclorite.book_story.domain.model.ChapterWithText import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.domain.util.UIText -import ua.acclorite.book_story.presentation.core.constants.Constants +import ua.acclorite.book_story.presentation.core.util.clearMarkdown import java.io.File import javax.inject.Inject @@ -116,15 +117,23 @@ class PdfTextParser @Inject constructor( yield() - if (strings.isEmpty()) { + if (strings.size < 2) { return Resource.Error(UIText.StringResource(R.string.error_file_empty)) } + val title = strings.first().clearMarkdown() + strings.removeAt(0) + Log.i(PDF_TAG, "Successfully finished PDF parsing.") Resource.Success( listOf( ChapterWithText( - chapter = Constants.EMPTY_CHAPTER, + chapter = Chapter( + index = 0, + title = title, + startIndex = 0, + endIndex = strings.lastIndex + ), text = strings ) ) diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtTextParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtTextParser.kt index 89063ebb..e4a5569e 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtTextParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/txt/TxtTextParser.kt @@ -6,10 +6,11 @@ import kotlinx.coroutines.withContext import kotlinx.coroutines.yield import ua.acclorite.book_story.R import ua.acclorite.book_story.data.parser.TextParser +import ua.acclorite.book_story.domain.model.Chapter import ua.acclorite.book_story.domain.model.ChapterWithText import ua.acclorite.book_story.domain.util.Resource import ua.acclorite.book_story.domain.util.UIText -import ua.acclorite.book_story.presentation.core.constants.Constants +import ua.acclorite.book_story.presentation.core.util.clearMarkdown import java.io.BufferedReader import java.io.File import java.io.FileReader @@ -37,15 +38,23 @@ class TxtTextParser @Inject constructor() : TextParser { yield() - if (lines.isEmpty()) { + if (lines.size < 2) { return Resource.Error(UIText.StringResource(R.string.error_file_empty)) } + val title = lines.first().clearMarkdown() + lines.removeAt(0) + Log.i(TXT_TAG, "Successfully finished TXT parsing.") Resource.Success( listOf( ChapterWithText( - chapter = Constants.EMPTY_CHAPTER, + chapter = Chapter( + index = 0, + title = title, + startIndex = 0, + endIndex = lines.lastIndex + ), text = lines ) ) diff --git a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt index 7f7db758..30a5f265 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt @@ -181,10 +181,7 @@ class BookRepositoryImpl @Inject constructor( ) } - data!!.map { it.text }.flatten() to data.map { it.chapter }.run { - if (size < 2) return@run emptyList() - return@run this - } + data!!.map { it.text }.flatten() to data.map { it.chapter } } Log.i(CHECK_FOR_TEXT_UPDATE, "Successfully got new text and chapters.") diff --git a/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt index 27446608..9ae723bf 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt @@ -167,10 +167,7 @@ class FileSystemRepositoryImpl @Inject constructor( return NotNull( bookWithTextAndCover = BookWithTextAndCover( book = parsedBook.book.copy( - chapters = parsedText.data!!.map { it.chapter }.run { - if (this.size == 1) return@run emptyList() - this - } + chapters = parsedText.data!!.map { it.chapter } //todo remove this and make every parser take first line as chapter title(exc epub ofc) ), coverImage = parsedBook.coverImage, text = parsedText.data.map { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt index 643820ef..6a36c12c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt @@ -596,7 +596,7 @@ class ReaderViewModel @Inject constructor( .distinctUntilChanged() .debounce(300) .collectLatest { index -> - if (_state.value.book.chapters.size < 2) { + if (_state.value.book.chapters.isEmpty()) { _state.update { it.copy( currentChapter = null