pull/1658/head
kunfei 3 years ago
parent fec84e3e07
commit 956810f3ff
  1. 15
      app/src/main/assets/updateLog.md
  2. 59
      app/src/main/java/io/legado/app/help/ruleComplete.kt
  3. 33
      app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt

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

@ -1,17 +1,24 @@
package io.legado.app.help 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规则生效 * 该方法仅对对JSOUP/XPath/CSS规则生效
* @author 希弥 * @author 希弥
* @return 补全后的规则 原规则 * @return 补全后的规则 原规则
* @param rules 需要补全的规则 * @param rule 需要补全的规则
* @param preRule 预处理规则 * @param preRule 预处理规则
* 用于分析详情页预处理规则 * 用于分析详情页预处理规则
* @param type 补全结果的类型可选的值有: * @param type 补全结果的类型可选的值有:
@ -19,30 +26,32 @@ val imgComplete=Regex("""(?<=(tag\.|[\+/@~>\| \&]))img[@/]text(\(\))?$|^img[@/]t
* 2 链接 * 2 链接
* 3 图片 * 3 图片
*/ */
fun ruleComplete(rule:String?,preRule:String?="",type:Int=1):String?{ fun ruleComplete(rule: String?, preRule: String? = "", type: Int = 1): String? {
if (rule.isNullOrEmpty()||rule.contains(completeIgnore)||preRule?.contains(completeIgnorePreRule)?:false){ if (rule.isNullOrEmpty() || rule.contains(completeIgnore)
|| preRule?.contains(completeIgnorePreRule) == true
) {
return rule return rule
} }
var textRule:String val textRule: String
var linkRule:String val linkRule: String
var imgRule:String val imgRule: String
var imgText:String val imgText: String
if (rule.contains(Regex("/[^@]+$"))){ if (rule.contains(Regex("/[^@]+$"))) {
textRule="/text()" textRule = "/text()"
linkRule="/@href" linkRule = "/@href"
imgRule="/@src" imgRule = "/@src"
imgText="img/@alt" imgText = "img/@alt"
}else{ } else {
textRule="@text" textRule = "@text"
linkRule="@href" linkRule = "@href"
imgRule="@src" imgRule = "@src"
imgText="img@alt" imgText = "img@alt"
} }
var ret:String=rule var ret: String = rule
when(type){ when (type) {
1 -> ret = rule.replace(Regex("$"),textRule).replace(imgComplete,imgText) 1 -> ret = rule.replace(Regex("$"), textRule).replace(imgComplete, imgText)
2 -> ret = rule.replace(Regex("$"),linkRule) 2 -> ret = rule.replace(Regex("$"), linkRule)
3 -> ret = rule.replace(Regex("$"),imgRule) 3 -> ret = rule.replace(Regex("$"), imgRule)
} }
return ret return ret
} }

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

Loading…
Cancel
Save