diff --git a/app/src/main/java/io/legado/app/api/controller/BookController.kt b/app/src/main/java/io/legado/app/api/controller/BookController.kt index 92dd4c457..a1244208e 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookController.kt @@ -173,7 +173,7 @@ object BookController { val contentProcessor = ContentProcessor.get(book.name, book.origin) content = runBlocking { contentProcessor.getContent(book, chapter, content!!, includeTitle = false) - .joinToString("\n") + .toString() } return returnData.setData(content) } @@ -184,7 +184,7 @@ object BookController { WebBook.getContentAwait(bookSource, book, chapter).let { val contentProcessor = ContentProcessor.get(book.name, book.origin) contentProcessor.getContent(book, chapter, it, includeTitle = false) - .joinToString("\n") + .toString() } } returnData.setData(content) diff --git a/app/src/main/java/io/legado/app/help/book/BookContent.kt b/app/src/main/java/io/legado/app/help/book/BookContent.kt new file mode 100644 index 000000000..58f4855e4 --- /dev/null +++ b/app/src/main/java/io/legado/app/help/book/BookContent.kt @@ -0,0 +1,12 @@ +package io.legado.app.help.book + +data class BookContent( + val sameTitleRemoved: Boolean, + val textList: List +) { + + override fun toString(): String { + return textList.joinToString("\n") + } + +} diff --git a/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt b/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt index e38b81539..02e7880bc 100644 --- a/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt +++ b/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt @@ -9,6 +9,7 @@ import io.legado.app.data.entities.ReplaceRule import io.legado.app.exception.RegexTimeoutException import io.legado.app.help.config.AppConfig import io.legado.app.help.config.ReadBookConfig +import io.legado.app.utils.MD5Utils import io.legado.app.utils.replace import io.legado.app.utils.stackTraceStr import io.legado.app.utils.toastOnUi @@ -16,6 +17,7 @@ import kotlinx.coroutines.CancellationException import splitties.init.appCtx import java.lang.ref.WeakReference import java.util.concurrent.CopyOnWriteArrayList +import java.util.regex.Pattern class ContentProcessor private constructor( private val bookName: String, @@ -78,9 +80,21 @@ class ContentProcessor private constructor( useReplace: Boolean = true, chineseConvert: Boolean = true, reSegment: Boolean = true - ): List { + ): BookContent { var mContent = content + var sameTitleRemoved = false if (content != "null") { + //去除重复标题 + val key = "NRT" + MD5Utils.md5Encode(chapter.bookUrl + chapter.url) + if (appDb.cacheDao.get(key) == null) try { + val name = Pattern.quote(book.name) + val title = Pattern.quote(chapter.title) + val titleRegex = "^(\\s|\\p{P}|${name})*${title}(\\s)*".toRegex() + mContent = mContent.replace(titleRegex, "") + sameTitleRemoved = true + } catch (e: Exception) { + AppLog.put("去除重复标题出错\n${e.localizedMessage}", e) + } if (reSegment && book.getReSegment()) { //重新分段 mContent = ContentHelp.reSegment(mContent, chapter.title) @@ -121,7 +135,7 @@ class ContentProcessor private constructor( } } } - return contents + return BookContent(sameTitleRemoved, contents) } suspend fun replaceContent(content: String): String { diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt index 459921c4a..e30a5f2e7 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt @@ -232,7 +232,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { useReplace = useReplace, chineseConvert = false, reSegment = false - ).joinToString("\n") + ).toString() if (AppConfig.exportPictureFile) { //txt导出图片文件 val srcList = arrayListOf>() @@ -515,8 +515,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { useReplace = useReplace, chineseConvert = false, reSegment = false - ) - .joinToString("\n") + ).toString() val title = chapter.getDisplayTitle( contentProcessor.getTitleReplaceRules(), useReplace = useReplace diff --git a/app/src/main/java/io/legado/app/ui/book/read/ContentEditDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/ContentEditDialog.kt index 8abced44f..fb9e780b1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ContentEditDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ContentEditDialog.kt @@ -152,7 +152,7 @@ class ContentEditDialog : BaseDialogFragment(R.layout.dialog_content_edit) { val contentProcessor = ContentProcessor.get(book.name, book.origin) val content = BookHelp.getContent(book, chapter) ?: return@let null contentProcessor.getContent(book, chapter, content, includeTitle = false) - .joinToString("\n") + .toString() } }.onStart { loadStateLiveData.postValue(true) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt index 6a698e5ca..731ef2c1a 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt @@ -15,6 +15,7 @@ data class TextChapter( val url: String, val pages: List, val chaptersSize: Int, + val sameTitleRemoved: Boolean, val isVip: Boolean, val isPay: Boolean, ) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt index f946b998f..ff20b4680 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt @@ -12,6 +12,7 @@ import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter +import io.legado.app.help.book.BookContent import io.legado.app.help.config.AppConfig import io.legado.app.help.config.ReadBookConfig import io.legado.app.model.ReadBook @@ -117,9 +118,10 @@ object ChapterProvider { book: Book, bookChapter: BookChapter, displayTitle: String, - contents: List, + bookContent: BookContent, chapterSize: Int, ): TextChapter { + val contents = bookContent.textList val textPages = arrayListOf() val stringBuilder = StringBuilder() var absStartX = paddingLeft @@ -217,6 +219,7 @@ object ChapterProvider { bookChapter.index, displayTitle, bookChapter.getAbsoluteURL(), textPages, chapterSize, + bookContent.sameTitleRemoved, bookChapter.isVip, bookChapter.isPay ) } diff --git a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt index a5f81518b..25452b9c7 100644 --- a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentViewModel.kt @@ -56,7 +56,7 @@ class SearchContentViewModel(application: Application) : BaseViewModel(applicati coroutineContext.ensureActive() mContent = contentProcessor!!.getContent( book, chapter, chapterContent - ).joinToString("") + ).toString() } val positions = searchPosition(mContent, query) positions.forEachIndexed { index, position ->