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