From 4c06b795ca4c320c05b9df17dda1cb96ab56e07c Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 26 Mar 2021 16:35:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=93epub=E7=9A=84=E7=88=B6=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E4=B8=8E=E5=AD=90=E7=9B=AE=E5=BD=95=E7=9A=84href?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E6=97=B6=EF=BC=88=E7=AC=AC=E4=B8=80=E5=8D=B7?= =?UTF-8?q?=E4=B8=8E=E7=AC=AC=E4=B8=80=E7=AB=A0href=E7=9B=B8=E5=90=8C?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E8=BF=99=E6=A0=B7=E7=9A=84=E7=88=B6=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E4=B8=8E=E5=AD=90=E7=9B=AE=E5=BD=95=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=97=B6=E6=9C=89bug=EF=BC=8C=E4=BC=9A=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E5=90=8E=E5=8F=88=E6=B6=88=E5=A4=B1=EF=BC=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E7=BF=BB=E9=A1=B5=E5=88=B0=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E7=AB=A0=EF=BC=8C=E7=AD=89=E4=B8=80=E5=B0=B1=E4=BC=9A=E6=8A=8A?= =?UTF-8?q?=E6=89=80=E6=9C=89=E5=AD=90=E7=AB=A0=E8=8A=82=E9=83=BD=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E4=BA=86=EF=BC=8C=E6=89=8B=E5=8A=A8=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E5=88=B0=E7=AC=AC=E4=BA=8C=E7=AB=A0=E5=90=8E=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E7=BF=BB=E9=A1=B5=EF=BC=8C=E5=BB=BA=E8=AE=AE?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=8E=B7=E5=8F=96=E7=BA=BF=E6=80=A7=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=9A=84=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/model/localBook/EpubFile.kt | 164 +++--------------- 1 file changed, 20 insertions(+), 144 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index c8cb1e297..d3d9af2f1 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt @@ -7,12 +7,10 @@ import android.text.TextUtils import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter -import io.legado.app.data.entities.EpubChapter import io.legado.app.utils.* import me.ag2s.epublib.domain.EpubBook import me.ag2s.epublib.domain.MediaTypes import me.ag2s.epublib.domain.Resources -import me.ag2s.epublib.domain.TOCReference import me.ag2s.epublib.epub.EpubReader import me.ag2s.epublib.util.ResourceUtil import org.jsoup.Jsoup @@ -212,156 +210,34 @@ class EpubFile(var book: Book) { private fun getChapterList(): ArrayList { val chapterList = ArrayList() - epubBook?.let { eBook -> - val refs = eBook.tableOfContents.tocReferences - if (refs == null || refs.isEmpty()) { - val spineReferences = eBook.spine.spineReferences - var i = 0 - val size = spineReferences.size - while (i < size) { - val resource = - spineReferences[i].resource - var title = resource.title - if (TextUtils.isEmpty(title)) { - try { - val doc = - Jsoup.parse(String(resource.data, mCharset)) - val elements = doc.getElementsByTag("title") - if (elements != null && elements.size > 0) { - title = elements[0].text() - } - } catch (e: IOException) { - e.printStackTrace() - } - } - val chapter = BookChapter() - chapter.index = i - chapter.bookUrl = book.bookUrl - chapter.url = resource.href - if (i == 0 && title.isEmpty()) { - chapter.title = "封面" - } else { - chapter.title = title - } - chapterList.add(chapter) - i++ - } - } else { - parseFirstPage(chapterList, refs) - parseMenu(chapterList, refs, 0) - for (i in chapterList.indices) { - chapterList[i].index = i - } - getChildChapter(chapterList) - } - } - book.latestChapterTitle = chapterList.lastOrNull()?.title - book.totalChapterNum = chapterList.size - return chapterList - } - - /*获取当前章节的子章节。部分书籍一个章节包含多个html文件,(一些精排书籍,每一章节正文前的标题、标题封面、引言等都会有独立html)*/ - /*需在读取常规章节列表后调用,遍历书籍全内容,根据href检索原不包含在章节内的html归属父章节*/ - private fun getChildChapter(chapterList: ArrayList) { - epubBook?.let { - val contents = it.contents - val chapters = ArrayList() - if (contents != null) { - var i = 0 - var j = 0 - var parentHref: String? = null - while (i < contents.size) { - val content = contents[i] - if (j < chapterList.size && content.href == chapterList[j].url) { - parentHref = content.href - j++ - } else if (!parentHref.isNullOrBlank() && content.mediaType.toString() - .contains("htm") - ) { - val epubChapter = EpubChapter() - epubChapter.bookUrl = book.bookUrl - epubChapter.href = content.href - epubChapter.parentHref = parentHref - chapters.add(epubChapter) + epubBook?.tableOfContents?.allUniqueResources?.forEachIndexed { index, resource -> + var title = resource.title + if (TextUtils.isEmpty(title)) { + try { + val doc = + Jsoup.parse(String(resource.data, mCharset)) + val elements = doc.getElementsByTag("title") + if (elements != null && elements.size > 0) { + title = elements[0].text() } - i++ + } catch (e: IOException) { + e.printStackTrace() } } - appDb.epubChapterDao.deleteByName(book.bookUrl) - if (chapters.size > 0) appDb.epubChapterDao.insert(*chapters.toTypedArray()) - } - } - - /*获取书籍起始页内容。部分书籍第一章之前存在封面,引言,扉页等内容*/ - /*tile获取不同书籍风格杂乱,格式化处理待优化*/ - private var durIndex = 0 - private fun parseFirstPage( - chapterList: ArrayList, - refs: List? - ) { - val contents = epubBook?.contents - if (epubBook == null || contents == null || refs == null) return - var i = 0 - durIndex = 0 - while (i < contents.size) { - val content = contents[i] - if (!content.mediaType.toString().contains("htm")) continue - /*检索到第一章href停止*/ - if (refs[0].completeHref == content.href) break val chapter = BookChapter() - var title = content.title - if (TextUtils.isEmpty(title)) { - val elements = Jsoup.parse( - String( - epubBook!!.resources.getByHref(content.href).data, - mCharset - ) - ).getElementsByTag("title") - title = - if (elements != null && elements.size > 0 && elements[0].text() - .isNotBlank() - ) elements[0].text() else "--卷首--" - } + chapter.index = index chapter.bookUrl = book.bookUrl - chapter.title = title - chapter.url = content.href - chapter.startFragmentId = - if (content.href.substringAfter("#") == content.href) null - else content.href.substringAfter("#") - if (durIndex > 0) { - val preIndex = durIndex - 1 - chapterList[preIndex].endFragmentId = chapter.startFragmentId + chapter.url = resource.href + if (index == 0 && title.isEmpty()) { + chapter.title = "封面" + } else { + chapter.title = title } chapterList.add(chapter) - durIndex++ - i++ - } - } - - private fun parseMenu( - chapterList: ArrayList, - refs: List?, - level: Int - ) { - refs?.forEach { ref -> - if (ref.resource != null) { - val chapter = BookChapter() - chapter.bookUrl = book.bookUrl - chapter.title = ref.title - chapter.url = ref.completeHref - chapter.startFragmentId = ref.fragmentId - if (durIndex > 0) { - val preIndex = durIndex - 1 - chapterList[preIndex].endFragmentId = chapter.startFragmentId - } - chapterList.add(chapter) - durIndex++ - } - if (ref.children != null && ref.children.isNotEmpty()) { - parseMenu(chapterList, ref.children, level + 1) - } } + book.latestChapterTitle = chapterList.lastOrNull()?.title + book.totalChapterNum = chapterList.size + return chapterList } - } \ No newline at end of file