Merge remote-tracking branch 'origin/master' into master

pull/408/head
口口吕 6 years ago
commit a3dac526a7
  1. 3
      app/src/main/assets/updateLog.md
  2. 2
      app/src/main/java/io/legado/app/help/AppConfig.kt
  3. 112
      app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt
  4. 2
      app/src/main/res/xml/pref_config_other.xml

@ -3,6 +3,9 @@
* 关注合作公众号 **[小说拾遗]()** 获取好看的小说。 * 关注合作公众号 **[小说拾遗]()** 获取好看的小说。
- 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 - 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。
**2020/09/23**
* 修复规则解析bug
**2020/09/21** **2020/09/21**
* 修复规则解析bug * 修复规则解析bug
* 换源时无最新章节信息时可加载详情页来获取(默认关闭) * 换源时无最新章节信息时可加载详情页来获取(默认关闭)

@ -59,7 +59,7 @@ object AppConfig {
} }
val backgroundVerification: Boolean val backgroundVerification: Boolean
get() = App.INSTANCE.getPrefBoolean(R.string.pk_background_verification) get() = App.INSTANCE.getPrefBoolean(R.string.pk_background_verification, true)
val autoRefreshBook: Boolean val autoRefreshBook: Boolean
get() = App.INSTANCE.getPrefBoolean(R.string.pk_auto_refresh) get() = App.INSTANCE.getPrefBoolean(R.string.pk_auto_refresh)

@ -406,6 +406,9 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions {
internal val putMap = HashMap<String, String>() internal val putMap = HashMap<String, String>()
private val ruleParam = ArrayList<String>() private val ruleParam = ArrayList<String>()
private val ruleType = ArrayList<Int>() private val ruleType = ArrayList<Int>()
private val getRuleType = -2
private val jsRuleType = -1
private val defaultRuleType = 0
init { init {
this.mode = mainMode this.mode = mainMode
@ -444,48 +447,76 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions {
else -> rule = ruleStr else -> rule = ruleStr
} }
} }
//分离put if (mode == Mode.Js) {
rule = splitPutRule(rule, putMap) ruleType.add(defaultRuleType)
//@get,{{ }},$1, 拆分 ruleParam.add(rule)
} else {
//分离put
rule = splitPutRule(rule, putMap)
//@get,{{ }}, 拆分
var start = 0
var tmp: String
val evalMatcher = evalPattern.matcher(rule)
while (evalMatcher.find()) {
if (evalMatcher.start() > start) {
tmp = rule.substring(start, evalMatcher.start())
if (start == 0 && !tmp.contains("##")) {
mode = Mode.Regex
}
splitRegex(tmp)
}
tmp = evalMatcher.group()
when {
tmp.startsWith("@get:", true) -> {
ruleType.add(getRuleType)
ruleParam.add(tmp.substring(6, tmp.lastIndex))
}
tmp.startsWith("{{") -> {
ruleType.add(jsRuleType)
ruleParam.add(tmp.substring(2, tmp.length - 2))
}
else -> {
splitRegex(tmp)
}
}
start = evalMatcher.end()
}
if (rule.length > start) {
tmp = rule.substring(start)
splitRegex(tmp)
}
}
}
/**
* 拆分\$\d{1,2}
*/
private fun splitRegex(ruleStr: String) {
var start = 0 var start = 0
var tmp: String var tmp: String
val evalMatcher = evalPattern.matcher(rule) val ruleStrArray = ruleStr.split("##")
while (evalMatcher.find()) { val regexMatcher = regexPattern.matcher(ruleStrArray[0])
if (evalMatcher.start() > start) { while (regexMatcher.find()) {
tmp = rule.substring(start, evalMatcher.start()) mode = Mode.Regex
ruleType.add(0) if (regexMatcher.start() > start) {
tmp = ruleStr.substring(start, regexMatcher.start())
ruleType.add(defaultRuleType)
ruleParam.add(tmp) ruleParam.add(tmp)
} }
tmp = evalMatcher.group() tmp = regexMatcher.group()
when { ruleType.add(tmp.substring(1).toInt())
tmp.startsWith("$") -> { ruleParam.add(tmp)
ruleType.add(tmp.substring(1).toInt()) start = regexMatcher.end()
ruleParam.add(tmp)
}
tmp.startsWith("@get:", true) -> {
ruleType.add(-2)
ruleParam.add(tmp.substring(6, tmp.lastIndex))
}
tmp.startsWith("{{") -> {
ruleType.add(-1)
ruleParam.add(tmp.substring(2, tmp.length - 2))
}
else -> {
ruleType.add(0)
ruleParam.add(tmp)
}
}
start = evalMatcher.end()
} }
if (rule.length > start) { if (ruleStr.length > start) {
tmp = rule.substring(start) tmp = ruleStr.substring(start)
ruleType.add(0) ruleType.add(defaultRuleType)
ruleParam.add(tmp) ruleParam.add(tmp)
} }
} }
/** /**
* 替换@get,{{ }},$1, * 替换@get,{{ }}
*/ */
fun makeUpRule(result: Any?) { fun makeUpRule(result: Any?) {
val infoVal = StringBuilder() val infoVal = StringBuilder()
@ -494,7 +525,7 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions {
while (index-- > 0) { while (index-- > 0) {
val regType = ruleType[index] val regType = ruleType[index]
when { when {
regType > 0 -> { regType > defaultRuleType -> {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val resultList = result as? List<String?> val resultList = result as? List<String?>
if (resultList != null) { if (resultList != null) {
@ -507,7 +538,7 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions {
infoVal.insert(0, ruleParam[index]) infoVal.insert(0, ruleParam[index])
} }
} }
regType == -1 -> { regType == jsRuleType -> {
if (isRule(ruleParam[index])) { if (isRule(ruleParam[index])) {
getString(arrayListOf(SourceRule(ruleParam[index]))).let { getString(arrayListOf(SourceRule(ruleParam[index]))).let {
infoVal.insert(0, it) infoVal.insert(0, it)
@ -525,7 +556,7 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions {
} }
} }
} }
regType == -2 -> { regType == getRuleType -> {
infoVal.insert(0, get(ruleParam[index])) infoVal.insert(0, get(ruleParam[index]))
} }
else -> infoVal.insert(0, ruleParam[index]) else -> infoVal.insert(0, ruleParam[index])
@ -631,14 +662,9 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions {
companion object { companion object {
private val putPattern = Pattern.compile("@put:(\\{[^}]+?\\})", Pattern.CASE_INSENSITIVE) private val putPattern = Pattern.compile("@put:(\\{[^}]+?\\})", Pattern.CASE_INSENSITIVE)
private val getPattern = Pattern.compile("@get:\\{([^}]+?)\\}", Pattern.CASE_INSENSITIVE) private val getPattern = Pattern.compile("@get:\\{([^}]+?)\\}", Pattern.CASE_INSENSITIVE)
private val evalPattern = Pattern.compile( private val evalPattern =
"@get:\\{[^}]+?\\}|\\{\\{[\\w\\W]*?\\}\\}|\\$\\d{1,2}", Pattern.compile("@get:\\{[^}]+?\\}|\\{\\{[\\w\\W]*?\\}\\}", Pattern.CASE_INSENSITIVE)
Pattern.CASE_INSENSITIVE private val regexPattern = Pattern.compile("\\$\\d{1,2}")
)
private val replacePattern = Pattern.compile(
"@get:\\{[^}]+?\\}|\\{\\{[\\w\\W]*?\\}\\}",
Pattern.CASE_INSENSITIVE
)
} }
} }

@ -52,7 +52,7 @@
app:layout="@layout/view_preference_category"> app:layout="@layout/view_preference_category">
<io.legado.app.ui.widget.prefs.SwitchPreference <io.legado.app.ui.widget.prefs.SwitchPreference
android:defaultValue="false" android:defaultValue="true"
android:key="@string/pk_background_verification" android:key="@string/pk_background_verification"
android:summary="@string/ps_background_verification" android:summary="@string/ps_background_verification"
android:title="@string/pt_background_verification" android:title="@string/pt_background_verification"

Loading…
Cancel
Save