kunfei 3 tahun lalu
induk
melakukan
09b530dc83

+ 10 - 13
app/src/main/java/io/legado/app/api/controller/ReplaceRuleController.kt

@@ -7,7 +7,6 @@ import io.legado.app.utils.GSON
 import io.legado.app.utils.fromJsonObject
 import io.legado.app.utils.replace
 import io.legado.app.utils.stackTraceStr
-import kotlinx.coroutines.runBlocking
 
 object ReplaceRuleController {
 
@@ -77,19 +76,17 @@ object ReplaceRuleController {
                 returnData.setErrorMsg("替换规则不能为空")
             }
             val text = map["text"] as String
-            val content = runBlocking {
-                try {
-                    if (rule.isRegex) {
-                        text.replace(
-                            rule.pattern.toRegex(),
-                            rule.replacement, rule.timeoutMillisecond
-                        )
-                    } else {
-                        text.replace(rule.pattern, rule.replacement)
-                    }
-                } catch (e: Exception) {
-                    e.stackTraceStr
+            val content = try {
+                if (rule.isRegex) {
+                    text.replace(
+                        rule.pattern.toRegex(),
+                        rule.replacement, rule.timeoutMillisecond
+                    )
+                } else {
+                    text.replace(rule.pattern, rule.replacement)
                 }
+            } catch (e: Exception) {
+                e.stackTraceStr
             }
             returnData.setData(content)
         }

+ 3 - 6
app/src/main/java/io/legado/app/data/entities/Book.kt

@@ -13,7 +13,6 @@ import io.legado.app.model.ReadBook
 import io.legado.app.utils.GSON
 import io.legado.app.utils.MD5Utils
 import io.legado.app.utils.fromJsonObject
-import kotlinx.coroutines.runBlocking
 import kotlinx.parcelize.IgnoredOnParcel
 import kotlinx.parcelize.Parcelize
 import java.nio.charset.Charset
@@ -270,11 +269,9 @@ data class Book(
     fun migrateTo(newBook: Book, toc: List<BookChapter>): Book {
         newBook.durChapterIndex = BookHelp
             .getDurChapter(durChapterIndex, durChapterTitle, toc, totalChapterNum)
-        newBook.durChapterTitle = runBlocking {
-            toc[newBook.durChapterIndex].getDisplayTitle(
-                ContentProcessor.get(newBook.name, newBook.origin).getTitleReplaceRules()
-            )
-        }
+        newBook.durChapterTitle = toc[newBook.durChapterIndex].getDisplayTitle(
+            ContentProcessor.get(newBook.name, newBook.origin).getTitleReplaceRules()
+        )
         newBook.durChapterPos = durChapterPos
         newBook.durChapterTime = durChapterTime
         newBook.group = group

+ 1 - 1
app/src/main/java/io/legado/app/data/entities/BookChapter.kt

@@ -83,7 +83,7 @@ data class BookChapter(
         return false
     }
 
-    suspend fun getDisplayTitle(
+    fun getDisplayTitle(
         replaceRules: List<ReplaceRule>? = null,
         useReplace: Boolean = true,
         chineseConvert: Boolean = true,

+ 2 - 2
app/src/main/java/io/legado/app/help/book/ContentProcessor.kt

@@ -72,7 +72,7 @@ class ContentProcessor private constructor(
         return contentReplaceRules
     }
 
-    suspend fun getContent(
+    fun getContent(
         book: Book,
         chapter: BookChapter,
         content: String,
@@ -153,7 +153,7 @@ class ContentProcessor private constructor(
         return BookContent(sameTitleRemoved, contents)
     }
 
-    private suspend fun replaceContent(content: String): String {
+    private fun replaceContent(content: String): String {
         var mContent = content
         mContent = mContent.lines().joinToString("\n") { it.trim() }
         getContentReplaceRules().forEach { item ->

+ 34 - 31
app/src/main/java/io/legado/app/utils/RegexExtensions.kt

@@ -6,6 +6,7 @@ import io.legado.app.constant.AppConst
 import io.legado.app.exception.RegexTimeoutException
 import io.legado.app.help.CrashHandler
 import io.legado.app.help.coroutine.Coroutine
+import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.suspendCancellableCoroutine
 import splitties.init.appCtx
 import kotlin.coroutines.resume
@@ -16,43 +17,45 @@ private val handler by lazy { buildMainHandler() }
 /**
  * 带有超时检测的正则替换
  */
-suspend fun CharSequence.replace(regex: Regex, replacement: String, timeout: Long): String {
+fun CharSequence.replace(regex: Regex, replacement: String, timeout: Long): String {
     val charSequence = this@replace
     val isJs = replacement.startsWith("@js:")
     val replacement1 = if (isJs) replacement.substring(4) else replacement
-    return suspendCancellableCoroutine { block ->
-        val coroutine = Coroutine.async {
-            try {
-                val pattern = regex.toPattern()
-                val matcher = pattern.matcher(charSequence)
-                val stringBuffer = StringBuffer()
-                while (matcher.find()) {
-                    if (isJs) {
-                        val bindings = SimpleBindings()
-                        bindings["result"] = matcher.group()
-                        val jsResult =
-                            AppConst.SCRIPT_ENGINE.eval(replacement1, bindings).toString()
-                        matcher.appendReplacement(stringBuffer, jsResult)
-                    } else {
-                        matcher.appendReplacement(stringBuffer, replacement1)
+    return runBlocking {
+        suspendCancellableCoroutine { block ->
+            val coroutine = Coroutine.async {
+                try {
+                    val pattern = regex.toPattern()
+                    val matcher = pattern.matcher(charSequence)
+                    val stringBuffer = StringBuffer()
+                    while (matcher.find()) {
+                        if (isJs) {
+                            val bindings = SimpleBindings()
+                            bindings["result"] = matcher.group()
+                            val jsResult =
+                                AppConst.SCRIPT_ENGINE.eval(replacement1, bindings).toString()
+                            matcher.appendReplacement(stringBuffer, jsResult)
+                        } else {
+                            matcher.appendReplacement(stringBuffer, replacement1)
+                        }
                     }
+                    matcher.appendTail(stringBuffer)
+                    block.resume(stringBuffer.toString())
+                } catch (e: Exception) {
+                    block.resumeWithException(e)
                 }
-                matcher.appendTail(stringBuffer)
-                block.resume(stringBuffer.toString())
-            } catch (e: Exception) {
-                block.resumeWithException(e)
             }
-        }
-        handler.postDelayed(timeout) {
-            if (coroutine.isActive) {
-                val timeoutMsg = "替换超时,3秒后还未结束将重启应用\n替换规则$regex\n替换内容:${this}"
-                val exception = RegexTimeoutException(timeoutMsg)
-                block.cancel(exception)
-                appCtx.longToastOnUi(timeoutMsg)
-                CrashHandler.saveCrashInfo2File(exception)
-                handler.postDelayed(3000) {
-                    if (coroutine.isActive) {
-                        appCtx.restart()
+            handler.postDelayed(timeout) {
+                if (coroutine.isActive) {
+                    val timeoutMsg = "替换超时,3秒后还未结束将重启应用\n替换规则$regex\n替换内容:${this}"
+                    val exception = RegexTimeoutException(timeoutMsg)
+                    block.cancel(exception)
+                    appCtx.longToastOnUi(timeoutMsg)
+                    CrashHandler.saveCrashInfo2File(exception)
+                    handler.postDelayed(3000) {
+                        if (coroutine.isActive) {
+                            appCtx.restart()
+                        }
                     }
                 }
             }