gedoor 4 yıl önce
ebeveyn
işleme
db34ae63ab

+ 5 - 7
app/src/main/java/io/legado/app/help/ContentProcessor.kt

@@ -8,8 +8,8 @@ import io.legado.app.data.entities.BookChapter
 import io.legado.app.data.entities.ReplaceRule
 import io.legado.app.data.entities.ReplaceRule
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.config.ReadBookConfig
 import io.legado.app.help.config.ReadBookConfig
+import io.legado.app.utils.regexReplace
 import io.legado.app.utils.toastOnUi
 import io.legado.app.utils.toastOnUi
-import kotlinx.coroutines.withTimeout
 import splitties.init.appCtx
 import splitties.init.appCtx
 import java.lang.ref.WeakReference
 import java.lang.ref.WeakReference
 import java.util.concurrent.CopyOnWriteArrayList
 import java.util.concurrent.CopyOnWriteArrayList
@@ -134,12 +134,10 @@ class ContentProcessor private constructor(
         getContentReplaceRules().forEach { item ->
         getContentReplaceRules().forEach { item ->
             if (item.pattern.isNotEmpty()) {
             if (item.pattern.isNotEmpty()) {
                 kotlin.runCatching {
                 kotlin.runCatching {
-                    withTimeout(1000) {
-                        mContent = if (item.isRegex) {
-                            mContent.replace(item.pattern.toRegex(), item.replacement)
-                        } else {
-                            mContent.replace(item.pattern, item.replacement)
-                        }
+                    mContent = if (item.isRegex) {
+                        mContent.regexReplace(item.pattern, item.replacement, 1000L)
+                    } else {
+                        mContent.replace(item.pattern, item.replacement)
                     }
                     }
                 }.onFailure {
                 }.onFailure {
                     AppLog.put("${item.name}替换出错\n${it.localizedMessage}")
                     AppLog.put("${item.name}替换出错\n${it.localizedMessage}")

+ 24 - 0
app/src/main/java/io/legado/app/utils/RegexExtensions.kt

@@ -0,0 +1,24 @@
+package io.legado.app.utils
+
+import io.legado.app.exception.NoStackTraceException
+import java.util.regex.Pattern
+
+fun CharSequence.regexReplace(regex: String, replacement: String, timeout: Long): String {
+    val timeEnd = System.currentTimeMillis() + timeout
+    val pattern = Pattern.compile(regex)
+    val matcher = pattern.matcher(this)
+    var result: Boolean = matcher.find()
+    if (result) {
+        val sb = StringBuffer()
+        do {
+            //matcher.appendReplacement(sb, replacement)
+            if (System.currentTimeMillis() > timeEnd) {
+                throw NoStackTraceException("替换超时")
+            }
+            result = matcher.find()
+        } while (result)
+        matcher.appendTail(sb)
+        return sb.toString()
+    }
+    return this.toString()
+}