kunfei 3 лет назад
Родитель
Сommit
e6dd7c8ea5

+ 2 - 2
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)

+ 12 - 0
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<String>
+) {
+
+    override fun toString(): String {
+        return textList.joinToString("\n")
+    }
+
+}

+ 16 - 2
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<String> {
+    ): 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 {

+ 2 - 3
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<Triple<String, Int, String>>()
@@ -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

+ 1 - 1
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)

+ 1 - 0
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<TextPage>,
     val chaptersSize: Int,
+    val sameTitleRemoved: Boolean,
     val isVip: Boolean,
     val isPay: Boolean,
 ) {

+ 4 - 1
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<String>,
+        bookContent: BookContent,
         chapterSize: Int,
     ): TextChapter {
+        val contents = bookContent.textList
         val textPages = arrayListOf<TextPage>()
         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
         )
     }

+ 1 - 1
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 ->