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

# Conflicts:
#	app/src/main/java/io/legado/app/utils/HtmlFormatter.kt
pull/1123/head
bushixuanqi 4 years ago
commit 420cd01cc3
  1. 8
      app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt
  2. 2
      app/src/main/java/io/legado/app/service/help/ReadBook.kt
  3. 76
      app/src/main/java/io/legado/app/utils/HtmlFormatter.kt

@ -597,13 +597,9 @@ class AnalyzeRule(val ruleData: RuleDataInterface) : JsExtensions {
private fun isRule(ruleStr: String): Boolean { private fun isRule(ruleStr: String): Boolean {
return ruleStr.startsWith('@') //js首个字符不可能是@,除非是装饰器,所以@开头规定为规则 return ruleStr.startsWith('@') //js首个字符不可能是@,除非是装饰器,所以@开头规定为规则
|| ruleStr.startsWith('$') //js首个字符不可能是$,因为并未注入$变量,且$1之类的东西已被替换,不会影响此处判断 || ruleStr.startsWith("$.")
|| ruleStr.startsWith("$[")
|| ruleStr.startsWith("//") || ruleStr.startsWith("//")
|| ruleStr.startsWith("class")//js首个字符串不可能是class,因为并未注入相关字符串开头的变量
|| ruleStr.startsWith("id")//js首个字符串不可能是id,因为并未注入相关字符串开头的变量
|| ruleStr.startsWith("tag")//js首个字符串不可能是tag,因为并未注入相关字符串开头的变量
|| ruleStr.startsWith("text")//js首个字符串不可能是text,因为并未注入相关字符串开头的变量
|| ruleStr.startsWith("children")//js首个字符串不可能是children,因为并未注入相关字符串开头的变量
} }
} }

@ -493,4 +493,4 @@ object ReadBook {
fun upPageAnim() fun upPageAnim()
} }
} }

@ -11,10 +11,10 @@ object HtmlFormatter {
fun format(html: String?, otherRegex: Regex = otherHtmlRegex): String { fun format(html: String?, otherRegex: Regex = otherHtmlRegex): String {
html ?: return "" html ?: return ""
return html.replace(wrapHtmlRegex, "\n") return html.replace(wrapHtmlRegex, "\n")
.replace(otherRegex, "") .replace(otherRegex, "")
.replace("\\s*\\n+\\s*".toRegex(), "\n  ") .replace("\\s*\\n+\\s*".toRegex(), "\n  ")
.replace("^[\\n\\s]+".toRegex(), "  ") .replace("^[\\n\\s]+".toRegex(), "  ")
.replace("[\\n\\s]+$".toRegex(), "") .replace("[\\n\\s]+$".toRegex(), "")
} }
fun formatKeepImg(html: String?) = format(html, notImgHtmlRegex) fun formatKeepImg(html: String?) = format(html, notImgHtmlRegex)
@ -22,65 +22,47 @@ object HtmlFormatter {
fun formatKeepImg(html: String?, redirectUrl: URL?): String { fun formatKeepImg(html: String?, redirectUrl: URL?): String {
html ?: return "" html ?: return ""
val keepImgHtml = html.replace(wrapHtmlRegex, "\n") val keepImgHtml = html.replace(wrapHtmlRegex, "\n")
.replace(notImgHtmlRegex, "") .replace(notImgHtmlRegex, "")
.replace("[\\n\\s]+\$|^[\\n\\s]*".toRegex(), "") .replace("[\\n\\s]+\$|^[\\n\\s]*".toRegex(), "")
.replace("\\s*\\n+\\s*".toRegex(), "\n") .replace("\\s*\\n+\\s*".toRegex(), "\n")
val sb = StringBuffer() val sb = StringBuffer()
val hasDataType:Boolean //是否有数据属性 val hasDataType:Boolean //是否有数据属性
//图片有data-开头的数据属性时优先用数据属性作为src,没有数据属性时匹配src //图片有data-开头的数据属性时优先用数据属性作为src,没有数据属性时匹配src
val imgPattern = Pattern.compile( val imgPattern = Pattern.compile(
if(keepImgHtml.matches("<img[^>]*data-".toRegex())) { if(keepImgHtml.matches("<img[^>]*data-".toRegex())) {
hasDataType = true hasDataType = true
"<img[^>]*data-[^=]*= *\"([^\"])\"[^>]*>" "<img[^>]*data-[^=]*= *\"([^\"])\"[^>]*>"
} }
else { else {
hasDataType = false hasDataType = false
"<img[^>]*src *= *\"([^\"{]+(?:\\{(?:[^{}]|\\{[^{}]*\\})*\\})?)\"[^>]*>" "<img[^>]*src *= *\"([^\"{]+(?:\\{(?:[^{}]|\\{[^{}]*\\})*\\})?)\"[^>]*>"
}, Pattern.CASE_INSENSITIVE }, Pattern.CASE_INSENSITIVE
) )
val matcher = imgPattern.matcher(keepImgHtml) val matcher = imgPattern.matcher(keepImgHtml)
var appendPos = 0 var appendPos = 0
if(matcher.find()){ while(matcher.find()){
if(hasDataType || matcher.group(1)!!.indexOf(',') == -1) { //图片无参 val url = matcher.group(1)!!
val urlBefore = url.substringBefore(',')
do{ sb.append( keepImgHtml.substring(appendPos, matcher.start()).replace("\n","\n  ") ) //缩进换行下个非图片段落
sb.append(keepImgHtml.substring(appendPos, matcher.start()).replace("\n","\n  ")) //非图片部分换行缩进 sb.append(
sb.append( "<img src=\"${ "<img src=\"${
NetworkUtils.getAbsoluteURL(redirectUrl,matcher.group(1)!!) NetworkUtils.getAbsoluteURL(
}\">" )
appendPos = matcher.end()
}while (matcher.find())
}else{ //图片有参
do{
val url = matcher.group(1)!!
val urlBefore = url.substringBefore(',')
val beforeStr = keepImgHtml.substring(appendPos, matcher.start())
sb.append( if(beforeStr == "\n") '\n' else beforeStr.replace("\n","\n  ") ) //缩进换行下个非图片段落
sb.append(
"<img src=\"${
NetworkUtils.getAbsoluteURL(
redirectUrl, redirectUrl,
urlBefore urlBefore
) )
}${ }${
url.substring(urlBefore.length) url.substring(urlBefore.length)
}\">" }\">"
) )
appendPos = matcher.end() appendPos = matcher.end()
}while(matcher.find())
}
} }
if (appendPos < keepImgHtml.length) { if (appendPos < keepImgHtml.length) {
val beforeStr = keepImgHtml.substring(appendPos, keepImgHtml.length) sb.append( keepImgHtml.substring( appendPos, keepImgHtml.length ).replace("\n","\n  ") ) //缩进换行下个非图片段落
sb.append( if(beforeStr == "\n") '\n' else beforeStr.replace("\n","\n  ") ) //缩进换行下个非图片段落
} }
return sb.toString() return sb.toString()
} }

Loading…
Cancel
Save