From 68e9ade4ac39a76e8b084a3f8c086e8f3c660b45 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 18 Jul 2021 15:26:34 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/data/entities/BookChapter.kt | 52 +++++----- .../app/model/analyzeRule/AnalyzeRule.kt | 98 ++++++++++--------- .../app/model/analyzeRule/AnalyzeUrl.kt | 19 ++-- .../app/model/analyzeRule/RuleAnalyzer.kt | 91 +++++++++++------ .../io/legado/app/service/help/ReadBook.kt | 7 +- .../read/page/provider/ChapterProvider.kt | 2 +- .../java/io/legado/app/utils/HtmlFormatter.kt | 16 ++- 7 files changed, 163 insertions(+), 122 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt index c6b4cb9fb..e42f9795c 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt @@ -14,30 +14,30 @@ import kotlinx.parcelize.Parcelize @Parcelize @Entity( - tableName = "chapters", - primaryKeys = ["url", "bookUrl"], - indices = [(Index(value = ["bookUrl"], unique = false)), - (Index(value = ["bookUrl", "index"], unique = true))], - foreignKeys = [(ForeignKey( - entity = Book::class, - parentColumns = ["bookUrl"], - childColumns = ["bookUrl"], - onDelete = ForeignKey.CASCADE - ))] + tableName = "chapters", + primaryKeys = ["url", "bookUrl"], + indices = [(Index(value = ["bookUrl"], unique = false)), + (Index(value = ["bookUrl", "index"], unique = true))], + foreignKeys = [(ForeignKey( + entity = Book::class, + parentColumns = ["bookUrl"], + childColumns = ["bookUrl"], + onDelete = ForeignKey.CASCADE + ))] ) // 删除书籍时自动删除章节 data class BookChapter( - var url: String = "", // 章节地址 - var title: String = "", // 章节标题 - var baseUrl: String = "", //用来拼接相对url - var bookUrl: String = "", // 书籍地址 - var index: Int = 0, // 章节序号 - var resourceUrl: String? = null, // 音频真实URL - var tag: String? = null, // - var start: Long? = null, // 章节起始位置 - var end: Long? = null, // 章节终止位置 - var startFragmentId: String? = null, //EPUB书籍当前章节的fragmentId - var endFragmentId: String? = null, //EPUB书籍下一章节的fragmentId - var variable: String? = null //变量 + var url: String = "", // 章节地址 + var title: String = "", // 章节标题 + var baseUrl: String = "", //用来拼接相对url + var bookUrl: String = "", // 书籍地址 + var index: Int = 0, // 章节序号 + var resourceUrl: String? = null, // 音频真实URL + var tag: String? = null, // + var start: Long? = null, // 章节起始位置 + var end: Long? = null, // 章节终止位置 + var startFragmentId: String? = null, //EPUB书籍当前章节的fragmentId + var endFragmentId: String? = null, //EPUB书籍下一章节的fragmentId + var variable: String? = null //变量 ) : Parcelable { @delegate:Transient @@ -61,10 +61,12 @@ data class BookChapter( return false } - fun getAbsoluteURL():String{ + fun getAbsoluteURL(): String { val urlBefore = url.substringBefore(',') - val urlAbsoluteBefore = NetworkUtils.getAbsoluteURL(baseUrl,urlBefore) - return if(urlBefore.length == url.length) urlAbsoluteBefore else urlAbsoluteBefore + url.substring(urlBefore.length) + val urlAbsoluteBefore = NetworkUtils.getAbsoluteURL(baseUrl, urlBefore) + return if (urlBefore.length == url.length) urlAbsoluteBefore else urlAbsoluteBefore + url.substring( + urlBefore.length + ) } fun getFileName(): String = String.format("%05d-%s.nb", index, MD5Utils.md5Encode16(title)) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 1ad285563..6ea166857 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -121,7 +121,7 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { @JvmOverloads fun getStringList(rule: String?, isUrl: Boolean = false): List? { if (rule.isNullOrEmpty()) return null - val ruleList = splitSourceRule(rule,true) + val ruleList = splitSourceRule(rule, true) return getStringList(ruleList, isUrl) } @@ -281,7 +281,7 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { @Suppress("UNCHECKED_CAST") fun getElements(ruleStr: String): List { var result: Any? = null - val ruleList = splitSourceRule(ruleStr,true) + val ruleList = splitSourceRule(ruleStr, true) content?.let { o -> if (ruleList.isNotEmpty()) result = o for (sourceRule in ruleList) { @@ -356,61 +356,34 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { /** * 分解规则生成规则列表 */ - fun splitSourceRule(ruleStr: String?,isList:Boolean = false): List { + fun splitSourceRule(ruleStr: String?, isList: Boolean = false): List { if (ruleStr.isNullOrEmpty()) return ArrayList() val ruleList = ArrayList() - //检测Mode var mMode: Mode = Mode.Default - fun mode(ruleStr0:String)=when { - ruleStr0.startsWith("@@") -> { - mMode = Mode.Default - ruleStr0.substring(2) - } - ruleStr0.startsWith("@XPath:", true) -> { - mMode = Mode.XPath - ruleStr0.substring(7) - } - ruleStr0.startsWith("/") -> {//XPath特征很明显,无需配置单独的识别标头 - mMode = Mode.XPath - ruleStr0 - } - ruleStr0.startsWith("@Json:", true) -> { - mMode = Mode.Json - ruleStr0.substring(6) - } - ( ruleStr0[1] == '.' || ruleStr0[1] == '[') && ruleStr0[0] == '$' || isJSON -> { - mMode = Mode.Json - ruleStr0 - } - else -> { - mMode = Mode.Default - ruleStr0 - } - } - - //拆分为规则列表 - var start = if(isList && ruleStr.startsWith(":")){ //仅首字符为:时为AllInOne,其实:与伪类选择器冲突,建议改成?更合理 + var start = 0 + //仅首字符为:时为AllInOne,其实:与伪类选择器冲突,建议改成?更合理 + if (isList && ruleStr.startsWith(":")) { mMode = Mode.Regex isRegex = true - 1 - }else 0 + start = 1 + } var tmp: String val jsMatcher = JS_PATTERN.matcher(ruleStr) - while (jsMatcher.find()){ + while (jsMatcher.find()) { if (jsMatcher.start() > start) { tmp = ruleStr.substring(start, jsMatcher.start()).trim { it <= ' ' } if (tmp.isNotEmpty()) { - ruleList.add(SourceRule(mode(tmp), mMode)) + ruleList.add(SourceRule(tmp, mMode)) } } - ruleList.add(SourceRule(jsMatcher.group(2)?:jsMatcher.group(1), Mode.Js)) + ruleList.add(SourceRule(jsMatcher.group(2) ?: jsMatcher.group(1), Mode.Js)) start = jsMatcher.end() } - if (ruleStr.length > start){ + if (ruleStr.length > start) { tmp = ruleStr.substring(start).trim { it <= ' ' } if (tmp.isNotEmpty()) { - ruleList.add(SourceRule(mode(tmp), mMode)) + ruleList.add(SourceRule(tmp, mMode)) } } @@ -436,22 +409,51 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { init { this.mode = mainMode + rule = when { + ruleStr.startsWith("@CSS:", true) -> { + mode = Mode.Default + ruleStr + } + ruleStr.startsWith("@@") -> { + mode = Mode.Default + ruleStr.substring(2) + } + ruleStr.startsWith("@XPath:", true) -> { + mode = Mode.XPath + ruleStr.substring(7) + } + ruleStr.startsWith("/") -> {//XPath特征很明显,无需配置单独的识别标头 + mode = Mode.XPath + ruleStr + } + ruleStr.startsWith("@Json:", true) -> { + mode = Mode.Json + ruleStr.substring(6) + } + (ruleStr[1] == '.' || ruleStr[1] == '[') && ruleStr.startsWith("$.") || isJSON -> { + mode = Mode.Json + ruleStr + } + else -> { + ruleStr + } + } //分离put - rule = splitPutRule(ruleStr, putMap) + rule = splitPutRule(rule, putMap) //@get,{{ }}, 拆分 var start = 0 var tmp: String val evalMatcher = evalPattern.matcher(rule) - if(evalMatcher.find()){ + if (evalMatcher.find()) { var modeX = mode == Mode.Js || mode == Mode.Regex - if (evalMatcher.start() > 0 ) { + if (evalMatcher.start() > 0) { tmp = rule.substring(0, evalMatcher.start()) modeX = modeX || tmp.contains("##") splitRegex(tmp) } - if(!modeX)mode = Mode.Regex + if (!modeX) mode = Mode.Regex tmp = evalMatcher.group() when { @@ -470,7 +472,7 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { start = evalMatcher.end() - while (evalMatcher.find()){ + while (evalMatcher.find()) { if (evalMatcher.start() > start) { tmp = rule.substring(start, evalMatcher.start()) splitRegex(tmp) @@ -508,11 +510,11 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { val ruleStrArray = ruleStr.split("##") val regexMatcher = regexPattern.matcher(ruleStrArray[0]) - if(regexMatcher.find()) { + if (regexMatcher.find()) { if (mode != Mode.Js && mode != Mode.Regex) { mode = Mode.Regex } - do{ + do { if (regexMatcher.start() > start) { tmp = ruleStr.substring(start, regexMatcher.start()) ruleType.add(defaultRuleType) @@ -522,7 +524,7 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { ruleType.add(tmp.substring(1).toInt()) ruleParam.add(tmp) start = regexMatcher.end() - }while (regexMatcher.find()) + } while (regexMatcher.find()) } if (ruleStr.length > start) { tmp = ruleStr.substring(start) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 90b4be570..78a1fd56d 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -82,7 +82,7 @@ class AnalyzeUrl( ruleUrl = tmp.replace("@result", ruleUrl) } } - ruleUrl = evalJS(jsMatcher.group(2)?:jsMatcher.group(1), ruleUrl) as String + ruleUrl = evalJS(jsMatcher.group(2) ?: jsMatcher.group(1), ruleUrl) as String start = jsMatcher.end() } if (ruleUrl.length > start) { @@ -114,14 +114,14 @@ class AnalyzeUrl( bindings["book"] = book //替换所有内嵌{{js}} - val url = analyze.innerRule("{{","}}"){ - when(val jsEval = SCRIPT_ENGINE.eval(it, bindings)){ + val url = analyze.innerRule("{{", "}}") { + when (val jsEval = SCRIPT_ENGINE.eval(it, bindings)) { is String -> jsEval jsEval is Double && jsEval % 1.0 == 0.0 -> String.format("%.0f", jsEval) else -> jsEval.toString() } } - if(url.isNotEmpty())ruleUrl = url + if (url.isNotEmpty()) ruleUrl = url } //page page?.let { @@ -143,13 +143,14 @@ class AnalyzeUrl( private fun initUrl() { //replaceKeyPageJs已经替换掉额外内容,此处url是基础形式,可以直接切首个‘,’之前字符串。 urlHasQuery = ruleUrl.substringBefore(',') - url = NetworkUtils.getAbsoluteURL(baseUrl,urlHasQuery ) + url = NetworkUtils.getAbsoluteURL(baseUrl, urlHasQuery) NetworkUtils.getBaseUrl(url)?.let { baseUrl = it } - if(urlHasQuery.length != ruleUrl.length ) { - GSON.fromJsonObject(ruleUrl.substring(urlHasQuery.length + 1).trim{ it < '!'})?.let { option -> + if (urlHasQuery.length != ruleUrl.length) { + GSON.fromJsonObject( + ruleUrl.substring(urlHasQuery.length + 1).trim { it < '!' })?.let { option -> option.method?.let { if (it.equals("POST", true)) method = RequestMethod.POST @@ -188,9 +189,9 @@ class AnalyzeUrl( RequestMethod.GET -> { if (!useWebView) { val pos = url.indexOf('?') - if(pos != -1) { + if (pos != -1) { analyzeFields(url.substring(pos + 1)) - url = url.substring(0,pos) + url = url.substring(0, pos) } } } diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/RuleAnalyzer.kt b/app/src/main/java/io/legado/app/model/analyzeRule/RuleAnalyzer.kt index e68df65b3..676ce5cef 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/RuleAnalyzer.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/RuleAnalyzer.kt @@ -1,8 +1,9 @@ package io.legado.app.model.analyzeRule import io.legado.app.utils.isJson -import java.util.ArrayList +import java.util.* import java.util.regex.Pattern +import kotlin.collections.HashMap //通用的规则切分处理 @@ -70,6 +71,7 @@ class RuleAnalyzer(data: String, code: Boolean = false) { } return false } + /** * 从剩余字串中拉出一个字符串,直到但不包括匹配序列(匹配参数列表中一项即为匹配),或剩余字串用完。 * @param seq 匹配字符串序列 @@ -369,8 +371,8 @@ class RuleAnalyzer(data: String, code: Boolean = false) { * * */ fun innerRule( - startStr:String, - endStr:String, + startStr: String, + endStr: String, fr: (String) -> String? ): String { @@ -380,13 +382,18 @@ class RuleAnalyzer(data: String, code: Boolean = false) { val posPre = pos //记录consumeTo匹配位置 if (consumeTo(endStr)) { val frv = fr(queue.substring(posPre, pos)) - st.append(queue.substring(startX, posPre - startStr.length) + frv) //压入内嵌规则前的内容,及内嵌规则解析得到的字符串 - pos += endStr.length //跳过结束字符串 - startX = pos //记录下次规则起点 + st.append( + queue.substring( + startX, + posPre - startStr.length + ) + frv + ) //压入内嵌规则前的内容,及内嵌规则解析得到的字符串 + pos += endStr.length //跳过结束字符串 + startX = pos //记录下次规则起点 } } - return if(startX == 0) queue else st.apply { + return if (startX == 0) queue else st.apply { append(queue.substring(startX)) }.toString() } @@ -394,8 +401,10 @@ class RuleAnalyzer(data: String, code: Boolean = false) { //-----------此处向下的函数和变量都未被使用,但以后要用-------- val ruleTypeList = ArrayList() + //设置平衡组函数,json或JavaScript时设置成chompCodeBalanced,否则为chompRuleBalanced val chompBalanced = if (code) ::chompCodeBalanced else ::chompRuleBalanced + enum class Mode { XPath, Json, Default, Js, Regex } @@ -450,11 +459,11 @@ class RuleAnalyzer(data: String, code: Boolean = false) { pos = st //位置回到筛选器处 val next = if (queue[pos] == '[') ']' else ')' //平衡组末尾字符 - if (!chompBalanced(queue[pos], next)){ + if (!chompBalanced(queue[pos], next)) { ruleTypeList.clear() rule.clear() - consumeToAny("","@js:") - rule += queue.substring(0,pos) + consumeToAny("", "@js:") + rule += queue.substring(0, pos) ruleTypeList += queue.substring(pos, pos + 4) //设置组合类型 } @@ -472,7 +481,7 @@ class RuleAnalyzer(data: String, code: Boolean = false) { var isMulu = false var isreverse = false - var isAllInOne= false + var isAllInOne = false var isFind = false private val findName = ArrayList() @@ -488,15 +497,15 @@ class RuleAnalyzer(data: String, code: Boolean = false) { private val defaultRuleType = 0 @JvmOverloads - fun setContent(cont: String,type:String = ""): RuleAnalyzer { + fun setContent(cont: String, type: String = ""): RuleAnalyzer { queue = cont - when(type){ + when (type) { "mulu" -> { - if(queue[0] =='-'){ //目录反转 + if (queue[0] == '-') { //目录反转 isreverse = true startX++ pos++ - }else if(queue[0] =='?'){ //AllInOne + } else if (queue[0] == '?') { //AllInOne isAllInOne = true startX++ pos++ @@ -505,8 +514,8 @@ class RuleAnalyzer(data: String, code: Boolean = false) { } "find" -> { pos = queue.indexOf("::") - findName.add(queue.substring(startX,pos)) - pos+=2 + findName.add(queue.substring(startX, pos)) + pos += 2 isFind = true } "url" -> { @@ -538,14 +547,15 @@ class RuleAnalyzer(data: String, code: Boolean = false) { /** * 参数字符串 */ - private val STARTSTRURL = arrayOf(",{",) + private val STARTSTRURL = arrayOf(",{") private val regexPattern = Pattern.compile("\\$\\d{1,2}") private val putPattern = Pattern.compile("@put:(\\{[^}]+?\\})", Pattern.CASE_INSENSITIVE) private val getPattern = Pattern.compile("@get:\\{([^}]+?)\\}", Pattern.CASE_INSENSITIVE) - private val evalPattern = Pattern.compile("\\{\\{[\\w\\W]*?\\}\\}", Pattern.CASE_INSENSITIVE) + private val evalPattern = + Pattern.compile("\\{\\{[\\w\\W]*?\\}\\}", Pattern.CASE_INSENSITIVE) - val ENDSTR= mapOf( + val ENDSTR = mapOf( "" to "", "{{" to "}}", ) @@ -553,18 +563,35 @@ class RuleAnalyzer(data: String, code: Boolean = false) { /** * 规则起始字符串 */ - private val STARTSTR = arrayOf("@js:","","","##","@@","@" - ,"{{@", "{{","}}" - ,"}" - , "{@", "{/", "{$" - , "{class" - , "{id" - , "{tag" - , "{text" - , "{children" - ,"/","$","@xpath:","@json:","@css:" - ,"||", "&&", "%%" - ,"@get:{","@put:{" + private val STARTSTR = arrayOf( + "@js:", + "", + "", + "##", + "@@", + "@", + "{{@", + "{{", + "}}", + "}", + "{@", + "{/", + "{$", + "{class", + "{id", + "{tag", + "{text", + "{children", + "/", + "$", + "@xpath:", + "@json:", + "@css:", + "||", + "&&", + "%%", + "@get:{", + "@put:{" ) /** diff --git a/app/src/main/java/io/legado/app/service/help/ReadBook.kt b/app/src/main/java/io/legado/app/service/help/ReadBook.kt index f2b765b9b..c1d6fc2ca 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadBook.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadBook.kt @@ -415,10 +415,11 @@ object ReadBook { else -> chapter.title } val contents = contentProcessor!!.getContent(book, chapter.title, content) - val textChapter = ChapterProvider.getTextChapter(book, chapter,contents,chapterSize) + val textChapter = + ChapterProvider.getTextChapter(book, chapter, contents, chapterSize) val offset = chapter.index - durChapterIndex - if (upContent) callBack?.upContent(offset ,resetPageOffset) + if (upContent) callBack?.upContent(offset, resetPageOffset) when (offset) { 0 -> { curTextChapter = textChapter @@ -426,7 +427,7 @@ object ReadBook { curPageChanged() callBack?.contentLoadFinish() } - - 1 -> { + -1 -> { prevTextChapter = textChapter } 1 -> { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt index c3bbf8b6e..2672849d2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt @@ -113,7 +113,7 @@ object ChapterProvider { } else if (book.getImageStyle() != Book.imgStyleText) { content.replace(AppPattern.imgPattern.toRegex(), "\n\$0\n").split("\n") .forEach { text -> - if(text.isNotBlank()){ + if (text.isNotBlank()) { if (!text.startsWith("]*data-[^=]*= *\"([^\"])\"[^>]*>","]*src *= *\"([^\"{]+(?:\\{(?:[^{}]|\\{[^{}]*\\})*\\})?)\"[^>]*>")){ + for (pattern in listOf( + "]*data-[^=]*= *\"([^\"])\"[^>]*>", + "]*src *= *\"([^\"{]+(?:\\{(?:[^{}]|\\{[^{}]*\\})*\\})?)\"[^>]*>" + )) { var appendPos = 0 val matcher = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE).matcher(keepImgHtml) while (matcher.find()) { @@ -36,7 +39,10 @@ object HtmlFormatter { val urlBefore = url.substringBefore(',') val strBefore = keepImgHtml.substring(appendPos, matcher.start()) sb.append( - if(strBefore.isBlank()) strBefore else strBefore.replace("\n", "\n  ") //缩进图片之间的非空白段落 + if (strBefore.isBlank()) strBefore else strBefore.replace( + "\n", + "\n  " + ) //缩进图片之间的非空白段落 ) sb.append( " Date: Sun, 18 Jul 2021 15:31:41 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/analyzeRule/AnalyzeRule.kt | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 6ea166857..242cdeefa 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -445,17 +445,21 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { var tmp: String val evalMatcher = evalPattern.matcher(rule) - if (evalMatcher.find()) { - - var modeX = mode == Mode.Js || mode == Mode.Regex - if (evalMatcher.start() > 0) { - tmp = rule.substring(0, evalMatcher.start()) - modeX = modeX || tmp.contains("##") + while (evalMatcher.find()) { + if (evalMatcher.start() > start) { + tmp = rule.substring(start, evalMatcher.start()) + if (mode != Mode.Js && mode != Mode.Regex + && start == 0 && !tmp.contains("##") + ) { + mode = Mode.Regex + } splitRegex(tmp) + } else if (mode != Mode.Js && mode != Mode.Regex + && evalMatcher.start() == 0 + ) { + mode = Mode.Regex } - if (!modeX) mode = Mode.Regex tmp = evalMatcher.group() - when { tmp.startsWith("@get:", true) -> { ruleType.add(getRuleType) @@ -469,32 +473,8 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { splitRegex(tmp) } } - start = evalMatcher.end() - - while (evalMatcher.find()) { - if (evalMatcher.start() > start) { - tmp = rule.substring(start, evalMatcher.start()) - 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) From 9cac73f303877f8a5c2ceff56d4ca1b97303a08f Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 18 Jul 2021 16:41:36 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/analyzeRule/AnalyzeRule.kt | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 242cdeefa..52eade600 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -445,35 +445,38 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions { var tmp: String val evalMatcher = evalPattern.matcher(rule) - while (evalMatcher.find()) { - if (evalMatcher.start() > start) { - tmp = rule.substring(start, evalMatcher.start()) - if (mode != Mode.Js && mode != Mode.Regex - && start == 0 && !tmp.contains("##") - ) { - mode = Mode.Regex - } - splitRegex(tmp) - } else if (mode != Mode.Js && mode != Mode.Regex + if (evalMatcher.find()) { + if (mode != Mode.Js && mode != Mode.Regex && evalMatcher.start() == 0 ) { mode = Mode.Regex } - 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 -> { + do { + if (evalMatcher.start() > start) { + tmp = rule.substring(start, evalMatcher.start()) + if (mode != Mode.Js && mode != Mode.Regex + && start == 0 && !tmp.contains("##") + ) { + mode = Mode.Regex + } splitRegex(tmp) } - } - start = evalMatcher.end() + 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() + } while (evalMatcher.find()) } if (rule.length > start) { tmp = rule.substring(start) From 3d237680309bc01d827e2123c982f17381a13409 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 18:29:27 +0800 Subject: [PATCH 04/18] Update HtmlFormatter.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正 --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 3e6fa92b1..72c7c252f 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -50,10 +50,10 @@ object HtmlFormatter { var appendPos0 = 0 val matcher0 = Pattern.compile("]*src *= *\"([^\"]+)\"[^>]*>", Pattern.CASE_INSENSITIVE).matcher(strBefore) //格式化普通图片标签 while (matcher0.find()) { - val strBefore0 = strBefore.substring(appendPos0, matcher.start()) + val strBefore0 = strBefore.substring(appendPos0, matcher0.start()) sb.append( if (strBefore0.isBlank()) strBefore0 else strBefore0.replace("\n","\n  ")) - sb.append("") - appendPos0 = matcher.end() + sb.append("") + appendPos0 = matcher0.end() } strBefore = if (appendPos0 < strBefore.length) strBefore.substring(appendPos0, strBefore.length) else "" } From a49947d8158c2746a4a09cf2788c5923ee5d7765 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 19:08:45 +0800 Subject: [PATCH 05/18] Update HtmlFormatter.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化 --- .../java/io/legado/app/utils/HtmlFormatter.kt | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 72c7c252f..2fa883f4d 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -27,7 +27,7 @@ object HtmlFormatter { .replace("[\\n\\s]+\$|^[\\n\\s]+".toRegex(), "") .replace("\\s*\\n+\\s*".toRegex(), "\n") - var str = "" + var str = StringBuffer() var endPos = 0 var hasMatch = true //普通图片标签是否还未处理过 var hasMatchX = false //是否存在带参数或带数据属性的图片标签 @@ -81,12 +81,41 @@ object HtmlFormatter { if (appendPos != 0) { hasMatchX = true //存在带参数或带数据属性的图片标签 endPos = appendPos //存在匹配,更新位置 - str = sb.toString() //存在匹配,更新字符串 + str = sb //存在匹配,更新字符串 } } - return if (endPos < keepImgHtml.length) { - str + keepImgHtml.substring( endPos, keepImgHtml.length ).replace("\n","\n  ") //缩进图片之后的非空白段落 - }else str + if (endPos < keepImgHtml.length) { + str.append( ( + if(hasMatchX){ //处理末尾的普通图片标签 + var appendPos0 = 0 + val strBefore = keepImgHtml.substring(endPos, keepImgHtml.length) + val matcher0 = + Pattern.compile("]*src *= *\"([^\"]+)\"[^>]*>", Pattern.CASE_INSENSITIVE) + .matcher(strBefore) //格式化普通图片标签 + while (matcher0.find()) { + val strBefore0 = strBefore.substring(appendPos0, matcher0.start()) + str.append( + if (strBefore0.isBlank()) strBefore0 else strBefore0.replace( + "\n", + "\n  " + ) + ) + str.append( + "" + ) + appendPos0 = matcher0.end() + } + if (appendPos0 < strBefore.length) strBefore.substring( appendPos0, strBefore.length ) else "" + }else keepImgHtml.substring( endPos, keepImgHtml.length ) + ).replace("\n","\n  ") ) //缩进图片之后的非空白段落 + } + + return str.toString() } } From a2001061171fbd698a092799f528e853affb3604 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 18 Jul 2021 19:46:30 +0800 Subject: [PATCH 06/18] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_replace_rule.xml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_replace_rule.xml b/app/src/main/res/layout/activity_replace_rule.xml index 8b918b280..b244fc3d9 100644 --- a/app/src/main/res/layout/activity_replace_rule.xml +++ b/app/src/main/res/layout/activity_replace_rule.xml @@ -15,11 +15,17 @@ app:contentLayout="@layout/view_search" app:title="@string/replace_purify" /> - + android:layout_weight="1"> + + + + Date: Sun, 18 Jul 2021 20:18:07 +0800 Subject: [PATCH 07/18] HtmlFormatter.kt --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 2fa883f4d..10a7659f4 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -22,10 +22,7 @@ object HtmlFormatter { fun formatKeepImg(html: String?, redirectUrl: URL?): String { html ?: return "" - val keepImgHtml = html.replace(wrapHtmlRegex, "\n") - .replace(notImgHtmlRegex, "") - .replace("[\\n\\s]+\$|^[\\n\\s]+".toRegex(), "") - .replace("\\s*\\n+\\s*".toRegex(), "\n") + val keepImgHtml = format(html, notImgHtmlRegex) var str = StringBuffer() var endPos = 0 From c163d2e087feb910063cc47a27201c32af146c82 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 20:19:38 +0800 Subject: [PATCH 08/18] Update HtmlFormatter.kt --- .../java/io/legado/app/utils/HtmlFormatter.kt | 52 +++++-------------- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 2fa883f4d..46789b13b 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -24,8 +24,7 @@ object HtmlFormatter { html ?: return "" val keepImgHtml = html.replace(wrapHtmlRegex, "\n") .replace(notImgHtmlRegex, "") - .replace("[\\n\\s]+\$|^[\\n\\s]+".toRegex(), "") - .replace("\\s*\\n+\\s*".toRegex(), "\n") + .replace("\\n\\s*\\n".toRegex(), "\n") var str = StringBuffer() var endPos = 0 @@ -50,28 +49,20 @@ object HtmlFormatter { var appendPos0 = 0 val matcher0 = Pattern.compile("]*src *= *\"([^\"]+)\"[^>]*>", Pattern.CASE_INSENSITIVE).matcher(strBefore) //格式化普通图片标签 while (matcher0.find()) { - val strBefore0 = strBefore.substring(appendPos0, matcher0.start()) - sb.append( if (strBefore0.isBlank()) strBefore0 else strBefore0.replace("\n","\n  ")) - sb.append("") + sb.append(strBefore.substring(appendPos0, matcher0.start()),"") appendPos0 = matcher0.end() } - strBefore = if (appendPos0 < strBefore.length) strBefore.substring(appendPos0, strBefore.length) else "" + strBefore = strBefore.substring(appendPos0, strBefore.length) } - sb.append( - if (strBefore.isBlank()) strBefore else strBefore.replace("\n","\n  ") //缩进图片之间的非空白段落 - ) - - if (pos == 0) { - val url = matcher.group(1)!! - val urlMatcher = AnalyzeUrl.paramPattern.matcher(url) - val find = urlMatcher.find() - sb.append("") - - } else sb.append("") + }else NetworkUtils.getAbsoluteURL(redirectUrl,matcher.group(1)!!) + }\">") appendPos = matcher.end() } while (matcher.find()) @@ -86,7 +77,7 @@ object HtmlFormatter { } if (endPos < keepImgHtml.length) { - str.append( ( + str.append( if(hasMatchX){ //处理末尾的普通图片标签 var appendPos0 = 0 val strBefore = keepImgHtml.substring(endPos, keepImgHtml.length) @@ -94,28 +85,13 @@ object HtmlFormatter { Pattern.compile("]*src *= *\"([^\"]+)\"[^>]*>", Pattern.CASE_INSENSITIVE) .matcher(strBefore) //格式化普通图片标签 while (matcher0.find()) { - val strBefore0 = strBefore.substring(appendPos0, matcher0.start()) - str.append( - if (strBefore0.isBlank()) strBefore0 else strBefore0.replace( - "\n", - "\n  " - ) - ) - str.append( - "" - ) + str.append(strBefore.substring(appendPos0, matcher0.start()),"") appendPos0 = matcher0.end() } - if (appendPos0 < strBefore.length) strBefore.substring( appendPos0, strBefore.length ) else "" + strBefore.substring( appendPos0, strBefore.length ) }else keepImgHtml.substring( endPos, keepImgHtml.length ) - ).replace("\n","\n  ") ) //缩进图片之后的非空白段落 + ) //缩进图片之后的非空白段落 } - return str.toString() } } From 633c5129febeac4bafcc66b945c18a282bf68716 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 20:22:28 +0800 Subject: [PATCH 09/18] Update HtmlFormatter.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化 --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 46789b13b..325eefdf0 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -24,7 +24,7 @@ object HtmlFormatter { html ?: return "" val keepImgHtml = html.replace(wrapHtmlRegex, "\n") .replace(notImgHtmlRegex, "") - .replace("\\n\\s*\\n".toRegex(), "\n") + .replace("\\n\\s*\\n|\\n$|^\\n".toRegex(), "\n") var str = StringBuffer() var endPos = 0 From 7cdf7b602d9387581fd7f1447043c3b089a2a1aa Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 20:24:46 +0800 Subject: [PATCH 10/18] Update HtmlFormatter.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化 --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 325eefdf0..990422fa8 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -24,7 +24,7 @@ object HtmlFormatter { html ?: return "" val keepImgHtml = html.replace(wrapHtmlRegex, "\n") .replace(notImgHtmlRegex, "") - .replace("\\n\\s*\\n|\\n$|^\\n".toRegex(), "\n") + .replace("\\n\\s*\\n|\\n\\s*$|^\\s*\\n".toRegex(), "\n") var str = StringBuffer() var endPos = 0 From a0e0dfd9eab567902f36b4bb315770e02a0367a3 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 20:35:29 +0800 Subject: [PATCH 11/18] Update HtmlFormatter.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化 --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 990422fa8..65ed42b80 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -24,6 +24,7 @@ object HtmlFormatter { html ?: return "" val keepImgHtml = html.replace(wrapHtmlRegex, "\n") .replace(notImgHtmlRegex, "") + .replace("\\n\\s*$|^\\s*\\n".toRegex(), "") .replace("\\n\\s*\\n|\\n\\s*$|^\\s*\\n".toRegex(), "\n") var str = StringBuffer() From 1378ce67bfd791d33aa945d1e8cd111a58b01943 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 20:36:28 +0800 Subject: [PATCH 12/18] Update HtmlFormatter.kt --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 65ed42b80..96dbf045b 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -25,7 +25,7 @@ object HtmlFormatter { val keepImgHtml = html.replace(wrapHtmlRegex, "\n") .replace(notImgHtmlRegex, "") .replace("\\n\\s*$|^\\s*\\n".toRegex(), "") - .replace("\\n\\s*\\n|\\n\\s*$|^\\s*\\n".toRegex(), "\n") + .replace("\\n\\s*\\n".toRegex(), "\n") var str = StringBuffer() var endPos = 0 From fda7841ca48ff9693788bda3888c386c21ba0df2 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 20:52:35 +0800 Subject: [PATCH 13/18] Update HtmlFormatter.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化 --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 96dbf045b..4b0660941 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -61,7 +61,7 @@ object HtmlFormatter { val url = matcher.group(1)!! val urlMatcher = AnalyzeUrl.paramPattern.matcher(url) if(urlMatcher.find()) NetworkUtils.getAbsoluteURL(redirectUrl,url.substring(0,urlMatcher.start())) + ',' + url.substring(urlMatcher.end()) - else url + else NetworkUtils.getAbsoluteURL(redirectUrl,url) }else NetworkUtils.getAbsoluteURL(redirectUrl,matcher.group(1)!!) }\">") From 78ed7240fb8ad686bbba5b053f2088584dace9d4 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 20:58:52 +0800 Subject: [PATCH 14/18] Update HtmlFormatter.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 考虑更周全 --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 4b0660941..70bd698eb 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -32,7 +32,7 @@ object HtmlFormatter { var hasMatch = true //普通图片标签是否还未处理过 var hasMatchX = false //是否存在带参数或带数据属性的图片标签 var pos = -1 - val list = listOf("]*src *= *\"([^\"{]+\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]+)\"[^>]*>","]*src *= *\"([^\"]+)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 + val list = listOf("]*src *= *\"([^\"]+,\\s*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]+)\"[^>]*>","]*src *= *\"([^\"]+)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 while(++pos<3){ if(pos == 2) { if(hasMatchX)break //普通图片标签只在不存在存在带参数或带数据属性的图片标签的时候匹配 @@ -60,8 +60,7 @@ object HtmlFormatter { if (pos == 0) { val url = matcher.group(1)!! val urlMatcher = AnalyzeUrl.paramPattern.matcher(url) - if(urlMatcher.find()) NetworkUtils.getAbsoluteURL(redirectUrl,url.substring(0,urlMatcher.start())) + ',' + url.substring(urlMatcher.end()) - else NetworkUtils.getAbsoluteURL(redirectUrl,url) + NetworkUtils.getAbsoluteURL(redirectUrl,url.substring(0,urlMatcher.start())) + ',' + url.substring(urlMatcher.end()) }else NetworkUtils.getAbsoluteURL(redirectUrl,matcher.group(1)!!) }\">") From 410dc45ce0b28eec737892819302c5688ea3c696 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 21:01:04 +0800 Subject: [PATCH 15/18] Update HtmlFormatter.kt --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 70bd698eb..bc07becc8 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -32,7 +32,7 @@ object HtmlFormatter { var hasMatch = true //普通图片标签是否还未处理过 var hasMatchX = false //是否存在带参数或带数据属性的图片标签 var pos = -1 - val list = listOf("]*src *= *\"([^\"]+,\\s*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]+)\"[^>]*>","]*src *= *\"([^\"]+)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 + val list = listOf("]*src *= *\"([^\"]+?,\\s*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]+)\"[^>]*>","]*src *= *\"([^\"]+)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 while(++pos<3){ if(pos == 2) { if(hasMatchX)break //普通图片标签只在不存在存在带参数或带数据属性的图片标签的时候匹配 From 58d55fcbe25db4d9bb78f61f306853eff177e247 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 21:07:40 +0800 Subject: [PATCH 16/18] Update HtmlFormatter.kt --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index bc07becc8..268db37f2 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -32,7 +32,7 @@ object HtmlFormatter { var hasMatch = true //普通图片标签是否还未处理过 var hasMatchX = false //是否存在带参数或带数据属性的图片标签 var pos = -1 - val list = listOf("]*src *= *\"([^\"]+?,\\s*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]+)\"[^>]*>","]*src *= *\"([^\"]+)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 + val list = listOf("]*src *= *\"([^\"]*?,\\s*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]*)\"[^>]*>","]*src *= *\"([^\"]*)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 while(++pos<3){ if(pos == 2) { if(hasMatchX)break //普通图片标签只在不存在存在带参数或带数据属性的图片标签的时候匹配 @@ -48,7 +48,7 @@ object HtmlFormatter { if (hasMatch) { //格式化不带参数和数据属性的普通图片标签 var appendPos0 = 0 - val matcher0 = Pattern.compile("]*src *= *\"([^\"]+)\"[^>]*>", Pattern.CASE_INSENSITIVE).matcher(strBefore) //格式化普通图片标签 + val matcher0 = Pattern.compile("]*src *= *\"([^\"]*)\"[^>]*>", Pattern.CASE_INSENSITIVE).matcher(strBefore) //格式化普通图片标签 while (matcher0.find()) { sb.append(strBefore.substring(appendPos0, matcher0.start()),"") appendPos0 = matcher0.end() @@ -82,7 +82,7 @@ object HtmlFormatter { var appendPos0 = 0 val strBefore = keepImgHtml.substring(endPos, keepImgHtml.length) val matcher0 = - Pattern.compile("]*src *= *\"([^\"]+)\"[^>]*>", Pattern.CASE_INSENSITIVE) + Pattern.compile("]*src *= *\"([^\"]*)\"[^>]*>", Pattern.CASE_INSENSITIVE) .matcher(strBefore) //格式化普通图片标签 while (matcher0.find()) { str.append(strBefore.substring(appendPos0, matcher0.start()),"") From 2c180dbd7ecf153f4fe4dc6db2aaff874c383a28 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 21:11:38 +0800 Subject: [PATCH 17/18] Update HtmlFormatter.kt --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index 268db37f2..e16a6dd5d 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -32,7 +32,7 @@ object HtmlFormatter { var hasMatch = true //普通图片标签是否还未处理过 var hasMatchX = false //是否存在带参数或带数据属性的图片标签 var pos = -1 - val list = listOf("]*src *= *\"([^\"]*?,\\s*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]*)\"[^>]*>","]*src *= *\"([^\"]*)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 + val list = listOf("]*src *= *\"([^\"{]*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>","]*data-[^=]*= *\"([^\"]*)\"[^>]*>","]*src *= *\"([^\"]*)\"[^>]*>") //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 while(++pos<3){ if(pos == 2) { if(hasMatchX)break //普通图片标签只在不存在存在带参数或带数据属性的图片标签的时候匹配 From e0fd6a4d3c7390c36e2591c8789016af3c43a9e4 Mon Sep 17 00:00:00 2001 From: bushixuanqi <57338301+bushixuanqi@users.noreply.github.com> Date: Sun, 18 Jul 2021 21:14:16 +0800 Subject: [PATCH 18/18] Update HtmlFormatter.kt --- app/src/main/java/io/legado/app/utils/HtmlFormatter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt index e16a6dd5d..4ba022a73 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -60,7 +60,8 @@ object HtmlFormatter { if (pos == 0) { val url = matcher.group(1)!! val urlMatcher = AnalyzeUrl.paramPattern.matcher(url) - NetworkUtils.getAbsoluteURL(redirectUrl,url.substring(0,urlMatcher.start())) + ',' + url.substring(urlMatcher.end()) + if(urlMatcher.find()) NetworkUtils.getAbsoluteURL(redirectUrl,url.substring(0,urlMatcher.start())) + ',' + url.substring(urlMatcher.end()) + else NetworkUtils.getAbsoluteURL(redirectUrl,url) }else NetworkUtils.getAbsoluteURL(redirectUrl,matcher.group(1)!!) }\">")