优化补全

* 补全对由||、&&、%%分割的规则生效
* 补全对尾部存在##替换规则生效
This commit is contained in:
syomie 2022-03-03 05:58:59 +08:00
parent d36be95e40
commit 777e7a79e8
2 changed files with 36 additions and 48 deletions

View File

@ -1,11 +1,4 @@
**2022/02/27** **2022/03/03**
* APP内编写规则时对由XPath|JSOUP|CSS组成的规则进行简单的默认补全。 * 补全对由||、&&、%%分割的规则生效
* 对需求文本的获取text * 补全对尾部存在##替换规则生效
* 对需求文本的img元素(以img结尾)的获取alt属性
* 对需求链接的获取href属性
* 对需求图片的获取src属性
* 详情页预处理存在js/json/正则的不对详情页规则进行补全
* 多条规则只补全最后一条规则
* 书源编辑页点击调试/保存时补全开始生效
* 注意:不改变编辑框内容显示,保存后再次编辑可查看补全后的规则,方便调试时快速修改规则

View File

@ -2,69 +2,64 @@ package io.legado.app.help
object RuleComplete { object RuleComplete {
// 需要补全
private val needComplete =Regex(
"""(?!=(@|/|^)(attr|text|ownText|textNodes|href|content|html|alt|all|value|src)(\(\))?)(?<seq>\&{2}|%%|\|{2}|$)""")
// 补全时忽略匹配规则 // 不能补全 存在js/json/{{xx}}的复杂情况
private val completeIgnore = private val notComplete = Regex("""^:|^##|\{\{|@js:|<js>|@Json:|\$\.""")
Regex(
"""\\n|##|@js:|<js>|@Json:|\$\.|(attr|text|ownText|textNodes|href|content|html|alt|all|value|src)(\(\)|##.*)?\s*$""",
RegexOption.MULTILINE
)
// 补全时忽略匹配的规则(判断列表项和详情页预处理规则生效) // 修正从图片获取信息
private val completeIgnorePreRule = Regex("""^:|##|@js:|<js>|@Json:|\$\.""") private val fixImgInfo = Regex("""(?<=(^|tag\.|[\+/@>~| &]))img(?<at>\[@.+\]|\.[-\w]+)?[@/]+text(\(\))?(?<seq>\&{2}|%%|\|{2}|$)""")
// 匹配从图片获取信息的规则
private val imgComplete = Regex(
"""(?<=(tag\.|[+/@~>| &]))img[@/]text(\(\))?$|^img[@/]text(\(\))?$""",
RegexOption.IGNORE_CASE
)
private val isXpath= Regex("^//|^@Xpath:")
/** /**
* 对简单规则进行补全简化部分书源规则的编写 * 对简单规则进行补全简化部分书源规则的编写
* 该方法仅对对JSOUP/XPath/CSS规则生效 * 对JSOUP/XPath/CSS规则生效
* @author 希弥 * @author 希弥
* @return 补全后的规则 原规则 * @return 补全后的规则 原规则
* @param rule 需要补全的规则 * @param rules 需要补全的规则
* @param preRule 预处理规则 * @param preRule 预处理规则或列表规则
* 用于分析详情页预处理规则
* @param type 补全结果的类型可选的值有: * @param type 补全结果的类型可选的值有:
* 1 文字(默认) * 1 文字(默认)
* 2 链接 * 2 链接
* 3 图片 * 3 图片
*/ */
fun autoComplete( fun autoComplete(
rule: String?, rules: String?,
preRule: String? = null, preRule: String? = null,
type: Int = 1 type: Int = 1
): String? { ): String? {
if (rule.isNullOrEmpty() || rule.contains(completeIgnore) if (rules.isNullOrEmpty()||rules.contains(notComplete) || preRule?.contains(notComplete) ?: false){
|| preRule?.contains(completeIgnorePreRule) == true return rules
) {
return rule
} }
// 分离正则
val regexSplit=rules.split("##".toRegex(),2)
val cleanedRule=regexSplit[0]
val regexRule=if (regexSplit.size>1) "##"+regexSplit[1] else ""
val textRule: String val textRule: String
val linkRule: String val linkRule: String
val imgRule: String val imgRule: String
val imgText: String val imgText: String
if (rule.contains(Regex("/[^@]+$"))) { if (cleanedRule.contains(isXpath)){
textRule = "/text()" textRule = "//text()\${seq}"
linkRule = "/@href" linkRule = "//@href\${seq}"
imgRule = "/@src" imgRule = "//@src\${seq}"
imgText = "img/@alt" imgText = "img\${at}/@alt\${seq}"
} else { } else {
textRule = "@text" textRule = "@text\${seq}"
linkRule = "@href" linkRule = "@href\${seq}"
imgRule = "@src" imgRule = "@src\${seq}"
imgText = "img@alt" imgText = "img\${at}@alt\${seq}"
} }
var ret: String = rule return when (type) {
when (type) { 1 -> needComplete.replace(cleanedRule, textRule).replace(fixImgInfo, imgText) + regexRule
1 -> ret = rule.replace(Regex("$"), textRule).replace(imgComplete, imgText) 2 -> needComplete.replace(cleanedRule, linkRule) + regexRule
2 -> ret = rule.replace(Regex("$"), linkRule) 3 -> needComplete.replace(cleanedRule, imgRule) + regexRule
3 -> ret = rule.replace(Regex("$"), imgRule) else -> rules
} }
return ret
} }