kunfei 4 lat temu
rodzic
commit
024e9f9fb8

+ 15 - 0
app/src/main/assets/updateLog.md

@@ -11,6 +11,21 @@
 * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。
 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
 
+**2022/02/27**
+
+* APP内编写规则时,对由XPath|JSOUP|CSS组成的规则进行简单的默认补全。
+
+```
+对需求文本的获取text
+对需求文本的img元素(以img结尾)的获取alt属性
+对需求链接的获取href属性
+对需求图片的获取src属性
+详情页预处理存在js/json/正则的不对详情页规则进行补全
+多条规则只补全最后一条规则
+书源编辑页点击调试/保存时补全开始生效
+注意:不改变编辑框内容显示,保存后再次编辑可查看补全后的规则,方便调试时快速修改规则
+```
+
 **2022/02/26**
 
 * 自动备份检测到webDav已有备份时不会重复备份

+ 34 - 25
app/src/main/java/io/legado/app/help/ruleComplete.kt

@@ -1,17 +1,24 @@
 package io.legado.app.help
 
 // 补全时忽略匹配规则
-val completeIgnore=Regex("""\\n|##|@js:|<js>|@Json:|\$.|(text|ownText|textNodes|href|content|html|alt|all|value|src)(\(\)|##.*)?\s*$""")
+val completeIgnore =
+    Regex("""\\n|##|@js:|<js>|@Json:|\$.|(text|ownText|textNodes|href|content|html|alt|all|value|src)(\(\)|##.*)?\s*$""")
+
 // 补全时忽略匹配的规则(仅对详情页预处理规则生效)
-val completeIgnorePreRule=Regex("""^:|##|@js:|<js>|@Json:|\$.""")
+val completeIgnorePreRule = Regex("""^:|##|@js:|<js>|@Json:|\$.""")
+
 // 匹配从图片获取信息的规则
-val imgComplete=Regex("""(?<=(tag\.|[\+/@~>\| \&]))img[@/]text(\(\))?$|^img[@/]text(\(\))?$""",RegexOption.IGNORE_CASE)
+val imgComplete = Regex(
+    """(?<=(tag\.|[+/@~>| &]))img[@/]text(\(\))?$|^img[@/]text(\(\))?$""",
+    RegexOption.IGNORE_CASE
+)
+
 /**
  * 对简单规则进行补全,简化部分书源规则的编写
  * 该方法仅对对JSOUP/XPath/CSS规则生效
  * @author 希弥
  * @return 补全后的规则 或 原规则
- * @param rules 需要补全的规则
+ * @param rule 需要补全的规则
  * @param preRule 预处理规则
  *  用于分析详情页预处理规则
  * @param type 补全结果的类型,可选的值有:
@@ -19,30 +26,32 @@ val imgComplete=Regex("""(?<=(tag\.|[\+/@~>\| \&]))img[@/]text(\(\))?$|^img[@/]t
  *  2 链接
  *  3 图片
  */
-fun ruleComplete(rule:String?,preRule:String?="",type:Int=1):String?{
-    if (rule.isNullOrEmpty()||rule.contains(completeIgnore)||preRule?.contains(completeIgnorePreRule)?:false){
+fun ruleComplete(rule: String?, preRule: String? = "", type: Int = 1): String? {
+    if (rule.isNullOrEmpty() || rule.contains(completeIgnore)
+        || preRule?.contains(completeIgnorePreRule) == true
+    ) {
         return rule
     }
-    var textRule:String
-    var linkRule:String
-    var imgRule:String
-    var imgText:String
-    if (rule.contains(Regex("/[^@]+$"))){
-        textRule="/text()"
-        linkRule="/@href"
-        imgRule="/@src"
-        imgText="img/@alt"
-    }else{
-        textRule="@text"
-        linkRule="@href"
-        imgRule="@src"
-        imgText="img@alt"
+    val textRule: String
+    val linkRule: String
+    val imgRule: String
+    val imgText: String
+    if (rule.contains(Regex("/[^@]+$"))) {
+        textRule = "/text()"
+        linkRule = "/@href"
+        imgRule = "/@src"
+        imgText = "img/@alt"
+    } else {
+        textRule = "@text"
+        linkRule = "@href"
+        imgRule = "@src"
+        imgText = "img@alt"
     }
-    var ret:String=rule
-    when(type){
-        1 -> ret = rule.replace(Regex("$"),textRule).replace(imgComplete,imgText)
-        2 -> ret = rule.replace(Regex("$"),linkRule)
-        3 -> ret = rule.replace(Regex("$"),imgRule)
+    var ret: String = rule
+    when (type) {
+        1 -> ret = rule.replace(Regex("$"), textRule).replace(imgComplete, imgText)
+        2 -> ret = rule.replace(Regex("$"), linkRule)
+        3 -> ret = rule.replace(Regex("$"), imgRule)
     }
     return ret
 }

+ 17 - 16
app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt

@@ -335,8 +335,8 @@ class BookSourceEditActivity :
                 "updateTime" -> searchRule.updateTime = ruleComplete(it.value)
                 "wordCount" -> searchRule.wordCount = ruleComplete(it.value)
                 "lastChapter" -> searchRule.lastChapter = ruleComplete(it.value)
-                "coverUrl" -> searchRule.coverUrl = ruleComplete(it.value,type=3)
-                "bookUrl" -> searchRule.bookUrl = ruleComplete(it.value,type=2)
+                "coverUrl" -> searchRule.coverUrl = ruleComplete(it.value, type = 3)
+                "bookUrl" -> searchRule.bookUrl = ruleComplete(it.value, type = 2)
             }
         }
         findEntities.forEach {
@@ -350,22 +350,23 @@ class BookSourceEditActivity :
                 "updateTime" -> exploreRule.updateTime = ruleComplete(it.value)
                 "wordCount" -> exploreRule.wordCount = ruleComplete(it.value)
                 "lastChapter" -> exploreRule.lastChapter = ruleComplete(it.value)
-                "coverUrl" -> exploreRule.coverUrl = ruleComplete(it.value,type=3)
-                "bookUrl" -> exploreRule.bookUrl = ruleComplete(it.value,type=2)
+                "coverUrl" -> exploreRule.coverUrl = ruleComplete(it.value, type = 3)
+                "bookUrl" -> exploreRule.bookUrl = ruleComplete(it.value, type = 2)
             }
         }
         infoEntities.forEach {
             when (it.key) {
                 "init" -> bookInfoRule.init = it.value ?: ""
-                "name" -> bookInfoRule.name = ruleComplete(it.value,bookInfoRule.init)
-                "author" -> bookInfoRule.author = ruleComplete(it.value,bookInfoRule.init)
-                "kind" -> bookInfoRule.kind = ruleComplete(it.value,bookInfoRule.init)
-                "intro" -> bookInfoRule.intro = ruleComplete(it.value,bookInfoRule.init)
-                "updateTime" -> bookInfoRule.updateTime = ruleComplete(it.value,bookInfoRule.init)
-                "wordCount" -> bookInfoRule.wordCount = ruleComplete(it.value,bookInfoRule.init)
-                "lastChapter" -> bookInfoRule.lastChapter = ruleComplete(it.value,bookInfoRule.init)
-                "coverUrl" -> bookInfoRule.coverUrl = ruleComplete(it.value,bookInfoRule.init,3)
-                "tocUrl" -> bookInfoRule.tocUrl = ruleComplete(it.value,bookInfoRule.init,2)
+                "name" -> bookInfoRule.name = ruleComplete(it.value, bookInfoRule.init)
+                "author" -> bookInfoRule.author = ruleComplete(it.value, bookInfoRule.init)
+                "kind" -> bookInfoRule.kind = ruleComplete(it.value, bookInfoRule.init)
+                "intro" -> bookInfoRule.intro = ruleComplete(it.value, bookInfoRule.init)
+                "updateTime" -> bookInfoRule.updateTime = ruleComplete(it.value, bookInfoRule.init)
+                "wordCount" -> bookInfoRule.wordCount = ruleComplete(it.value, bookInfoRule.init)
+                "lastChapter" -> bookInfoRule.lastChapter =
+                    ruleComplete(it.value, bookInfoRule.init)
+                "coverUrl" -> bookInfoRule.coverUrl = ruleComplete(it.value, bookInfoRule.init, 3)
+                "tocUrl" -> bookInfoRule.tocUrl = ruleComplete(it.value, bookInfoRule.init, 2)
                 "canReName" -> bookInfoRule.canReName = it.value
             }
         }
@@ -373,18 +374,18 @@ class BookSourceEditActivity :
             when (it.key) {
                 "chapterList" -> tocRule.chapterList = it.value
                 "chapterName" -> tocRule.chapterName = ruleComplete(it.value)
-                "chapterUrl" -> tocRule.chapterUrl = ruleComplete(it.value,type=2)
+                "chapterUrl" -> tocRule.chapterUrl = ruleComplete(it.value, type = 2)
                 "isVolume" -> tocRule.isVolume = it.value
                 "updateTime" -> tocRule.updateTime = it.value
                 "isVip" -> tocRule.isVip = it.value
                 "isPay" -> tocRule.isPay = it.value
-                "nextTocUrl" -> tocRule.nextTocUrl = ruleComplete(it.value,type=2)
+                "nextTocUrl" -> tocRule.nextTocUrl = ruleComplete(it.value, type = 2)
             }
         }
         contentEntities.forEach {
             when (it.key) {
                 "content" -> contentRule.content = ruleComplete(it.value)
-                "nextContentUrl" -> contentRule.nextContentUrl = ruleComplete(it.value,type=2)
+                "nextContentUrl" -> contentRule.nextContentUrl = ruleComplete(it.value, type = 2)
                 "webJs" -> contentRule.webJs = it.value
                 "sourceRegex" -> contentRule.sourceRegex = it.value
                 "replaceRegex" -> contentRule.replaceRegex = it.value