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 8d086b55c..664525973 100644 --- a/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt +++ b/app/src/main/java/io/legado/app/utils/HtmlFormatter.kt @@ -22,105 +22,29 @@ object HtmlFormatter { fun formatKeepImg(html: String?, redirectUrl: URL?): String { html ?: return "" - val keepImgHtml = formatKeepImg(html) - - var str = StringBuffer() - var endPos = 0 - var hasMatch = true //普通图片标签是否还未处理过 - var hasMatchX = false //是否存在带参数或带数据属性的图片标签 - var pos = -1 - val list = listOf( - "]*src *= *\"([^\"{]*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>", - "]*data-[^=]*= *\"([^\"]*)\"[^>]*>", - "]*src *= *\"([^\"]*)\"[^>]*>" - ) //优先匹配用户处理过所以带参数的图片标签,其次匹配带数据属性的图片标签 - while (++pos < 3) { - if (pos == 2) { - if (hasMatchX) break //普通图片标签只在不存在存在带参数或带数据属性的图片标签的时候匹配 - else hasMatch = false //匹配带参数或带数据属性的图片标签同时也会格式化普通图片标签 - } - var appendPos = 0 - val matcher = - Pattern.compile(list[pos], Pattern.CASE_INSENSITIVE).matcher(keepImgHtml) - val sb = StringBuffer() - if (matcher.find()) { - do { - var strBefore = keepImgHtml.substring(appendPos, matcher.start()) - - if (hasMatch) { //格式化不带参数和数据属性的普通图片标签 - var appendPos0 = 0 - val matcher0 = Pattern.compile( - "]*src *= *\"([^\"]*)\"[^>]*>", - Pattern.CASE_INSENSITIVE - ).matcher(strBefore) //格式化普通图片标签 - while (matcher0.find()) { - sb.append( - strBefore.substring(appendPos0, matcher0.start()), - "" - ) - appendPos0 = matcher0.end() - } - strBefore = strBefore.substring(appendPos0, strBefore.length) - } - - sb.append( - strBefore, "" - ) - - appendPos = matcher.end() - } while (matcher.find()) - hasMatch = false //普通图片标签已经处理过 - } - - if (appendPos != 0) { - hasMatchX = true //存在带参数或带数据属性的图片标签 - endPos = appendPos //存在匹配,更新位置 - str = sb //存在匹配,更新字符串 - } - } - - 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()) { - str.append( - strBefore.substring(appendPos0, matcher0.start()), - "" - ) - appendPos0 = matcher0.end() - } - strBefore.substring(appendPos0, strBefore.length) - } else keepImgHtml.substring(endPos, keepImgHtml.length) - ) //缩进图片之后的非空白段落 + val keepImgHtml = html.replace(wrapHtmlRegex, "\n") + .replace(notImgHtmlRegex, "") + .replace("\\n\\s*$|^\\s*\\n".toRegex(), "") + .replace("\\n\\s*\\n".toRegex(), "\n") + //正则的“|”处于顶端而不处于()中时,具有类似||的熔断效果,故以此机制简化原来的代码 + val matcher = Pattern.compile("]*src *= *\"([^\"{]*\\{(?:[^{}]|\\{[^}]+\\})+\\})\"[^>]*>|]*data-[^=]*= *\"([^\"]*)\"[^>]*>|]*src *= *\"([^\"]*)\"[^>]*>", Pattern.CASE_INSENSITIVE).matcher(keepImgHtml) + var appendPos = 0 + val sb = StringBuffer() + while (matcher.find()){ + var param = "" + sb.append( keepImgHtml.substring(appendPos, matcher.start()),"") + appendPos = matcher.end() } - return str.toString() + if (appendPos < keepImgHtml.length) sb.append(keepImgHtml.substring( appendPos, keepImgHtml.length )) + return sb.toString() } }