diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 6df3c6c69..c53f10406 100644 --- a/app/src/main/assets/updateLog.md +++ b/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已有备份时不会重复备份 diff --git a/app/src/main/java/io/legado/app/help/ruleComplete.kt b/app/src/main/java/io/legado/app/help/ruleComplete.kt index 2f608f33b..9501cbfb4 100644 --- a/app/src/main/java/io/legado/app/help/ruleComplete.kt +++ b/app/src/main/java/io/legado/app/help/ruleComplete.kt @@ -1,17 +1,24 @@ package io.legado.app.help // 补全时忽略匹配规则 -val completeIgnore=Regex("""\\n|##|@js:||@Json:|\$.|(text|ownText|textNodes|href|content|html|alt|all|value|src)(\(\)|##.*)?\s*$""") +val completeIgnore = + Regex("""\\n|##|@js:||@Json:|\$.|(text|ownText|textNodes|href|content|html|alt|all|value|src)(\(\)|##.*)?\s*$""") + // 补全时忽略匹配的规则(仅对详情页预处理规则生效) -val completeIgnorePreRule=Regex("""^:|##|@js:||@Json:|\$.""") +val completeIgnorePreRule = Regex("""^:|##|@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 } diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index 044fb660c..508911fc7 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/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