diff --git a/app/src/main/java/io/legado/app/api/controller/ReplaceRuleController.kt b/app/src/main/java/io/legado/app/api/controller/ReplaceRuleController.kt index 6ec260cc4..2799dd2bc 100644 --- a/app/src/main/java/io/legado/app/api/controller/ReplaceRuleController.kt +++ b/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) } diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 9cb8364d1..dd98db86c 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/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): 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 diff --git a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt index 3b0e3176b..d08b2c1f3 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt +++ b/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? = null, useReplace: Boolean = true, chineseConvert: Boolean = true, 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 6b51a4959..8706d9b16 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 @@ -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 -> diff --git a/app/src/main/java/io/legado/app/utils/RegexExtensions.kt b/app/src/main/java/io/legado/app/utils/RegexExtensions.kt index 879ee776d..958930b84 100644 --- a/app/src/main/java/io/legado/app/utils/RegexExtensions.kt +++ b/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() + } } } }