Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -1,13 +1,12 @@
|
|||||||
name: Build and Release
|
name: Build and Release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
# push:
|
||||||
branches:
|
# branches:
|
||||||
- master
|
# - master
|
||||||
paths:
|
# paths:
|
||||||
- 'CHANGELOG.md'
|
# - 'CHANGELOG.md'
|
||||||
# schedule:
|
workflow_dispatch:
|
||||||
# - cron: '0 4 * * *'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|||||||
+10
-3
@@ -1,4 +1,11 @@
|
|||||||
**2021/08/09**
|
**2022/02/27**
|
||||||
|
|
||||||
1. 修复选择文字不能选择单个文字的bug
|
* APP内编写规则时,对由XPath|JSOUP|CSS组成的规则进行简单的默认补全。
|
||||||
2.
|
* 对需求文本的获取text
|
||||||
|
* 对需求文本的img元素(以img结尾)的获取alt属性
|
||||||
|
* 对需求链接的获取href属性
|
||||||
|
* 对需求图片的获取src属性
|
||||||
|
* 详情页预处理存在js/json/正则的不对详情页规则进行补全
|
||||||
|
* 多条规则只补全最后一条规则
|
||||||
|
* 书源编辑页点击调试/保存时补全开始生效
|
||||||
|
* 注意:不改变编辑框内容显示,保存后再次编辑可查看补全后的规则,方便调试时快速修改规则
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package io.legado.app.help
|
||||||
|
|
||||||
|
// 补全时忽略匹配规则
|
||||||
|
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 imgComplete=Regex("""(?<=(tag\.|[\+/@~>\| \&]))img[@/]text(\(\))?$|^img[@/]text(\(\))?$""",RegexOption.IGNORE_CASE)
|
||||||
|
/**
|
||||||
|
* 对简单规则进行补全,简化部分书源规则的编写
|
||||||
|
* 该方法仅对对JSOUP/XPath/CSS规则生效
|
||||||
|
* @author 希弥
|
||||||
|
* @return 补全后的规则 或 原规则
|
||||||
|
* @param rules 需要补全的规则
|
||||||
|
* @param preRule 预处理规则
|
||||||
|
* 用于分析详情页预处理规则
|
||||||
|
* @param type 补全结果的类型,可选的值有:
|
||||||
|
* 1 文字(默认)
|
||||||
|
* 2 链接
|
||||||
|
* 3 图片
|
||||||
|
*/
|
||||||
|
fun ruleComplete(rule:String?,preRule:String?="",type:Int=1):String?{
|
||||||
|
if (rule.isNullOrEmpty()||rule.contains(completeIgnore)||preRule?.contains(completeIgnorePreRule)?:false){
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
@@ -21,6 +21,7 @@ import io.legado.app.data.entities.BookSource
|
|||||||
import io.legado.app.data.entities.rule.*
|
import io.legado.app.data.entities.rule.*
|
||||||
import io.legado.app.databinding.ActivityBookSourceEditBinding
|
import io.legado.app.databinding.ActivityBookSourceEditBinding
|
||||||
import io.legado.app.help.LocalConfig
|
import io.legado.app.help.LocalConfig
|
||||||
|
import io.legado.app.help.ruleComplete
|
||||||
import io.legado.app.lib.dialogs.alert
|
import io.legado.app.lib.dialogs.alert
|
||||||
import io.legado.app.lib.dialogs.selector
|
import io.legado.app.lib.dialogs.selector
|
||||||
import io.legado.app.lib.theme.backgroundColor
|
import io.legado.app.lib.theme.backgroundColor
|
||||||
@@ -327,63 +328,63 @@ class BookSourceEditActivity :
|
|||||||
"searchUrl" -> source.searchUrl = it.value
|
"searchUrl" -> source.searchUrl = it.value
|
||||||
"checkKeyWord" -> searchRule.checkKeyWord = it.value
|
"checkKeyWord" -> searchRule.checkKeyWord = it.value
|
||||||
"bookList" -> searchRule.bookList = it.value
|
"bookList" -> searchRule.bookList = it.value
|
||||||
"name" -> searchRule.name = it.value
|
"name" -> searchRule.name = ruleComplete(it.value)
|
||||||
"author" -> searchRule.author = it.value
|
"author" -> searchRule.author = ruleComplete(it.value)
|
||||||
"kind" -> searchRule.kind = it.value
|
"kind" -> searchRule.kind = ruleComplete(it.value)
|
||||||
"intro" -> searchRule.intro = it.value
|
"intro" -> searchRule.intro = ruleComplete(it.value)
|
||||||
"updateTime" -> searchRule.updateTime = it.value
|
"updateTime" -> searchRule.updateTime = ruleComplete(it.value)
|
||||||
"wordCount" -> searchRule.wordCount = it.value
|
"wordCount" -> searchRule.wordCount = ruleComplete(it.value)
|
||||||
"lastChapter" -> searchRule.lastChapter = it.value
|
"lastChapter" -> searchRule.lastChapter = ruleComplete(it.value)
|
||||||
"coverUrl" -> searchRule.coverUrl = it.value
|
"coverUrl" -> searchRule.coverUrl = ruleComplete(it.value,type=3)
|
||||||
"bookUrl" -> searchRule.bookUrl = it.value
|
"bookUrl" -> searchRule.bookUrl = ruleComplete(it.value,type=2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
findEntities.forEach {
|
findEntities.forEach {
|
||||||
when (it.key) {
|
when (it.key) {
|
||||||
"exploreUrl" -> source.exploreUrl = it.value
|
"exploreUrl" -> source.exploreUrl = it.value
|
||||||
"bookList" -> exploreRule.bookList = it.value
|
"bookList" -> exploreRule.bookList = it.value
|
||||||
"name" -> exploreRule.name = it.value
|
"name" -> exploreRule.name = ruleComplete(it.value)
|
||||||
"author" -> exploreRule.author = it.value
|
"author" -> exploreRule.author = ruleComplete(it.value)
|
||||||
"kind" -> exploreRule.kind = it.value
|
"kind" -> exploreRule.kind = ruleComplete(it.value)
|
||||||
"intro" -> exploreRule.intro = it.value
|
"intro" -> exploreRule.intro = ruleComplete(it.value)
|
||||||
"updateTime" -> exploreRule.updateTime = it.value
|
"updateTime" -> exploreRule.updateTime = ruleComplete(it.value)
|
||||||
"wordCount" -> exploreRule.wordCount = it.value
|
"wordCount" -> exploreRule.wordCount = ruleComplete(it.value)
|
||||||
"lastChapter" -> exploreRule.lastChapter = it.value
|
"lastChapter" -> exploreRule.lastChapter = ruleComplete(it.value)
|
||||||
"coverUrl" -> exploreRule.coverUrl = it.value
|
"coverUrl" -> exploreRule.coverUrl = ruleComplete(it.value,type=3)
|
||||||
"bookUrl" -> exploreRule.bookUrl = it.value
|
"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 = it.value
|
"name" -> bookInfoRule.name = ruleComplete(it.value,bookInfoRule.init)
|
||||||
"author" -> bookInfoRule.author = it.value
|
"author" -> bookInfoRule.author = ruleComplete(it.value,bookInfoRule.init)
|
||||||
"kind" -> bookInfoRule.kind = it.value
|
"kind" -> bookInfoRule.kind = ruleComplete(it.value,bookInfoRule.init)
|
||||||
"intro" -> bookInfoRule.intro = it.value
|
"intro" -> bookInfoRule.intro = ruleComplete(it.value,bookInfoRule.init)
|
||||||
"updateTime" -> bookInfoRule.updateTime = it.value
|
"updateTime" -> bookInfoRule.updateTime = ruleComplete(it.value,bookInfoRule.init)
|
||||||
"wordCount" -> bookInfoRule.wordCount = it.value
|
"wordCount" -> bookInfoRule.wordCount = ruleComplete(it.value,bookInfoRule.init)
|
||||||
"lastChapter" -> bookInfoRule.lastChapter = it.value
|
"lastChapter" -> bookInfoRule.lastChapter = ruleComplete(it.value,bookInfoRule.init)
|
||||||
"coverUrl" -> bookInfoRule.coverUrl = it.value
|
"coverUrl" -> bookInfoRule.coverUrl = ruleComplete(it.value,bookInfoRule.init,3)
|
||||||
"tocUrl" -> bookInfoRule.tocUrl = it.value
|
"tocUrl" -> bookInfoRule.tocUrl = ruleComplete(it.value,bookInfoRule.init,2)
|
||||||
"canReName" -> bookInfoRule.canReName = it.value
|
"canReName" -> bookInfoRule.canReName = it.value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tocEntities.forEach {
|
tocEntities.forEach {
|
||||||
when (it.key) {
|
when (it.key) {
|
||||||
"chapterList" -> tocRule.chapterList = it.value
|
"chapterList" -> tocRule.chapterList = it.value
|
||||||
"chapterName" -> tocRule.chapterName = it.value
|
"chapterName" -> tocRule.chapterName = ruleComplete(it.value)
|
||||||
"chapterUrl" -> tocRule.chapterUrl = it.value
|
"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 = it.value
|
"nextTocUrl" -> tocRule.nextTocUrl = ruleComplete(it.value,type=2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
contentEntities.forEach {
|
contentEntities.forEach {
|
||||||
when (it.key) {
|
when (it.key) {
|
||||||
"content" -> contentRule.content = it.value
|
"content" -> contentRule.content = ruleComplete(it.value)
|
||||||
"nextContentUrl" -> contentRule.nextContentUrl = it.value
|
"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
|
||||||
@@ -485,5 +486,4 @@ class BookSourceEditActivity :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user