kunfei 4 лет назад
Родитель
Сommit
4356a1a3a8

+ 64 - 2
app/src/main/java/io/legado/app/api/controller/ReplaceRuleController.kt

@@ -5,10 +5,19 @@ import io.legado.app.data.appDb
 import io.legado.app.data.entities.ReplaceRule
 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 {
 
-    val allRules get() = appDb.replaceRuleDao.all
+    val allRules: ReturnData
+        get() {
+            val rules = appDb.replaceRuleDao.all
+            val returnData = ReturnData()
+            returnData.setData(GSON.toJson(rules))
+            return returnData
+        }
 
 
     fun saveRule(postData: String?): ReturnData {
@@ -26,11 +35,64 @@ object ReplaceRuleController {
         return returnData
     }
 
+
+    fun delete(postData: String?): ReturnData {
+        val returnData = ReturnData()
+        postData ?: return returnData.setErrorMsg("数据不能为空")
+        val rule = GSON.fromJsonObject<ReplaceRule>(postData).getOrNull()
+        if (rule == null) {
+            returnData.setErrorMsg("格式不对")
+        } else {
+            appDb.replaceRuleDao.delete(rule)
+        }
+        return returnData
+    }
+
+    /**
+     * 传入测试数据格式
+     * {
+     *  rule: Replace,
+     *  text: "xxx"
+     * }
+     */
     fun testRule(postData: String?): ReturnData {
         val returnData = ReturnData()
         postData ?: return returnData.setErrorMsg("数据不能为空")
         val map = GSON.fromJsonObject<Map<String, *>>(postData).getOrNull()
-
+        if (map == null) {
+            returnData.setErrorMsg("格式不对")
+        } else {
+            val rule = map["rule"]?.let {
+                if (it is String) {
+                    GSON.fromJsonObject<ReplaceRule>(it).getOrNull()
+                } else {
+                    GSON.fromJsonObject<ReplaceRule>(GSON.toJson(it)).getOrNull()
+                }
+            }
+            if (rule == null) {
+                returnData.setErrorMsg("格式不对")
+                return returnData
+            }
+            if (rule.pattern.isEmpty()) {
+                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
+                }
+            }
+            returnData.setData(content)
+        }
         return returnData
     }
 

+ 5 - 0
app/src/main/java/io/legado/app/web/HttpServer.kt

@@ -6,6 +6,7 @@ import fi.iki.elonen.NanoHTTPD
 import io.legado.app.api.ReturnData
 import io.legado.app.api.controller.BookController
 import io.legado.app.api.controller.BookSourceController
+import io.legado.app.api.controller.ReplaceRuleController
 import io.legado.app.api.controller.RssSourceController
 import io.legado.app.utils.FileUtils
 import io.legado.app.utils.externalFiles
@@ -50,6 +51,9 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
                         "/saveRssSource" -> RssSourceController.saveSource(postData)
                         "/saveRssSources" -> RssSourceController.saveSources(postData)
                         "/deleteRssSources" -> RssSourceController.deleteSources(postData)
+                        "/saveReplaceRule" -> ReplaceRuleController.saveRule(postData)
+                        "/deleteReplaceRule" -> ReplaceRuleController.delete(postData)
+                        "/testReplaceRule" -> ReplaceRuleController.testRule(postData)
                         else -> null
                     }
                 }
@@ -68,6 +72,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
                         "/getReadConfig" -> BookController.getWebReadConfig()
                         "/getRssSource" -> RssSourceController.getSource(parameters)
                         "/getRssSources" -> RssSourceController.sources
+                        "/getReplaceRules" -> ReplaceRuleController.allRules
                         else -> null
                     }
                 }