From 697efb118af4dd79acf7b007bc8334ced22d3b99 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Wed, 5 Mar 2025 18:24:22 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20XML=20parser=20for=20FB?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * New XmlTextParser to parse FB2 --- .../book_story/data/parser/TextParserImpl.kt | 6 ++- .../data/parser/xml/XmlTextParser.kt | 51 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/ua/acclorite/book_story/data/parser/xml/XmlTextParser.kt diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/TextParserImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/TextParserImpl.kt index d7ac5354..c9f476b3 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/TextParserImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/TextParserImpl.kt @@ -13,6 +13,7 @@ import ua.acclorite.book_story.data.parser.epub.EpubTextParser import ua.acclorite.book_story.data.parser.html.HtmlTextParser import ua.acclorite.book_story.data.parser.pdf.PdfTextParser import ua.acclorite.book_story.data.parser.txt.TxtTextParser +import ua.acclorite.book_story.data.parser.xml.XmlTextParser import ua.acclorite.book_story.domain.file.CachedFile import ua.acclorite.book_story.domain.reader.ReaderText import javax.inject.Inject @@ -26,7 +27,8 @@ class TextParserImpl @Inject constructor( // Document parser (HTML+Markdown) private val epubTextParser: EpubTextParser, - private val htmlTextParser: HtmlTextParser + private val htmlTextParser: HtmlTextParser, + private val xmlTextParser: XmlTextParser ) : TextParser { override suspend fun parse(cachedFile: CachedFile): List { @@ -51,7 +53,7 @@ class TextParserImpl @Inject constructor( } ".fb2" -> { - htmlTextParser.parse(cachedFile) + xmlTextParser.parse(cachedFile) } ".html" -> { diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/xml/XmlTextParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/xml/XmlTextParser.kt new file mode 100644 index 00000000..736c5f89 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/xml/XmlTextParser.kt @@ -0,0 +1,51 @@ +/* + * Book's Story — free and open-source Material You eBook reader. + * Copyright (C) 2024-2025 Acclorite + * SPDX-License-Identifier: GPL-3.0-only + */ + +package ua.acclorite.book_story.data.parser.xml + +import android.util.Log +import kotlinx.coroutines.yield +import org.jsoup.Jsoup +import org.jsoup.parser.Parser +import ua.acclorite.book_story.data.parser.DocumentParser +import ua.acclorite.book_story.data.parser.TextParser +import ua.acclorite.book_story.domain.file.CachedFile +import ua.acclorite.book_story.domain.reader.ReaderText +import javax.inject.Inject + +private const val XML_TAG = "XML Parser" + +class XmlTextParser @Inject constructor( + private val documentParser: DocumentParser +) : TextParser { + + override suspend fun parse(cachedFile: CachedFile): List { + Log.i(XML_TAG, "Started XML parsing: ${cachedFile.name}.") + + return try { + val readerText = cachedFile.openInputStream()?.use { stream -> + documentParser.parseDocument(Jsoup.parse(stream, null, "", Parser.xmlParser())) + } + + yield() + + if ( + readerText.isNullOrEmpty() || + readerText.filterIsInstance().isEmpty() || + readerText.filterIsInstance().isEmpty() + ) { + Log.e(XML_TAG, "Could not extract text from XML.") + return emptyList() + } + + Log.i(XML_TAG, "Successfully finished XML parsing.") + readerText + } catch (e: Exception) { + e.printStackTrace() + emptyList() + } + } +} \ No newline at end of file