This commit is contained in:
kunfei
2023-03-16 16:32:44 +08:00
parent 8cad97b1d3
commit c9c9a88a14
5 changed files with 50 additions and 53 deletions
@@ -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)
}
@@ -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
@@ -83,7 +83,7 @@ data class BookChapter(
return false
}
suspend fun getDisplayTitle(
fun getDisplayTitle(
replaceRules: List<ReplaceRule>? = null,
useReplace: Boolean = true,
chineseConvert: Boolean = true,
@@ -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 ->
@@ -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()
}
}
}
}