diff --git a/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt b/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt index 5dc3afee4..efe652657 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt @@ -9,8 +9,6 @@ data class ContentRule( var nextContentUrl: String? = null, var webJs: String? = null, var sourceRegex: String? = null, - var replaceRegex: String? = null, + var replaceRegex: String? = null, //正文获取后处理规则 var imageStyle: String? = null, //默认大小居中,FULL最大宽度 - var font: String? = null, //网页内包含的字体必须返回ByteArray - var correctFont: String? = null, //正确的字体必须返回QueryTTF ) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 95cc17d94..99500604f 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -1,14 +1,18 @@ package io.legado.app.help +import android.net.Uri import android.util.Base64 import androidx.annotation.Keep +import io.legado.app.App import io.legado.app.constant.AppConst.dateFormat import io.legado.app.help.http.CookieStore +import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.SSLHelper import io.legado.app.model.Debug import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.QueryTTF import io.legado.app.utils.* +import kotlinx.coroutines.runBlocking import org.jsoup.Connection import org.jsoup.Jsoup import java.io.File @@ -230,11 +234,51 @@ interface JsExtensions { /** * 解析字体,返回字体解析类 */ - fun queryTTF(font: ByteArray?): QueryTTF? { + fun queryBase64TTF(base64: String?): QueryTTF? { + base64DecodeToByteArray(base64)?.let { + return QueryTTF(it) + } + return null + } + + fun queryTTF(path: String): QueryTTF? { + val qTTF = CacheManager.getQueryTTF(path) + if (qTTF != null) { + return qTTF + } + val font: ByteArray? = when { + path.isAbsUrl() -> runBlocking { + var x = CacheManager.getByteArray(path) + if (x == null) { + x = HttpHelper.simpleGetBytesAsync(path) + x?.let { + CacheManager.put(path, it) + } + } + return@runBlocking x + } + path.isContentScheme() -> { + Uri.parse(path).readBytes(App.INSTANCE) + } + else -> { + File(path).readBytes() + } + } font ?: return null return QueryTTF(font) } + fun replaceFont(text: String, font1: QueryTTF, font2: QueryTTF, start: Int, end: Int): String { + val contentArray = text.toCharArray() + contentArray.forEachIndexed { index, s -> + if (s > start.toChar() && s < end.toChar()) { + val code = font2.GetCodeByGlyf(font1.GetGlyfByCode(s.toInt())) + contentArray[index] = code.toChar() + } + } + return contentArray.joinToString("") + } + /** * 输出调试日志 */ 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 22f7e8e13..e0a4dbb8c 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 @@ -298,8 +298,8 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions { return ArrayList() } - fun getResult(ruleStr: String): Any? { - if (ruleStr.isEmpty()) return null + fun getContent(ruleStr: String, text: String?): String { + if (ruleStr.isEmpty()) return "" val ruleList = splitSourceRule(ruleStr) var result: Any? = null content?.let { o -> @@ -312,7 +312,7 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions { result.toString(), sourceRule.rule.splitNotBlank("&&") ) - Mode.Js -> evalJS(sourceRule.rule, result) + Mode.Js -> evalJS(sourceRule.rule, result, text) Mode.Json -> getAnalyzeByJSonPath(it).getList(sourceRule.rule) Mode.XPath -> getAnalyzeByXPath(it).getElements(sourceRule.rule) else -> getAnalyzeByJSoup(it).getElements(sourceRule.rule) @@ -323,7 +323,7 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions { } } } - return result + return result?.toString() ?: "" } /** @@ -649,7 +649,7 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions { /** * 执行JS */ - private fun evalJS(jsStr: String, result: Any?): Any? { + private fun evalJS(jsStr: String, result: Any?, content: String? = null): Any? { val bindings = SimpleBindings() bindings["java"] = this bindings["cookie"] = CookieStore @@ -659,6 +659,7 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions { bindings["baseUrl"] = baseUrl bindings["chapter"] = chapter bindings["title"] = chapter?.title + bindings["content"] = content return SCRIPT_ENGINE.eval(jsStr, bindings) } diff --git a/app/src/main/java/io/legado/app/model/webBook/BookContent.kt b/app/src/main/java/io/legado/app/model/webBook/BookContent.kt index 40597eab7..f13df3605 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookContent.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookContent.kt @@ -10,7 +10,6 @@ import io.legado.app.help.BookHelp import io.legado.app.model.Debug import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeUrl -import io.legado.app.model.analyzeRule.QueryTTF import io.legado.app.utils.NetworkUtils import io.legado.app.utils.htmlFormat import kotlinx.coroutines.CoroutineScope @@ -36,21 +35,6 @@ object BookContent { val nextUrlList = arrayListOf(baseUrl) val contentRule = bookSource.getContentRule() val analyzeRule = AnalyzeRule(book).setContent(body, baseUrl) - val fontRule = contentRule.font - val correctFontRule = contentRule.correctFont - var font: ByteArray? = null - var cQueryTTF: QueryTTF? = null - fontRule?.let { - //todo 获取网页嵌入字体 - font = analyzeRule.getResult(it) as? ByteArray - } - correctFontRule?.let { - //todo 获取正确字体 - cQueryTTF = analyzeRule.getResult(it) as? QueryTTF - } - if (cQueryTTF == null && font != null) { - BookHelp.saveFont(book, bookChapter, font!!) - } var contentData = analyzeContent( book, baseUrl, body, contentRule, bookChapter, bookSource ) @@ -110,20 +94,7 @@ object BookContent { var contentStr = content.toString().htmlFormat() val replaceRegex = bookSource.ruleContent?.replaceRegex if (!replaceRegex.isNullOrEmpty()) { - analyzeRule.setContent(contentStr).setBaseUrl(baseUrl) - analyzeRule.chapter = bookChapter - contentStr = analyzeRule.getString(replaceRegex) - } - if (cQueryTTF != null && font != null) { - val queryTTF = QueryTTF(font!!) - val contentArray = contentStr.toCharArray() - contentArray.forEachIndexed { index, s -> - if (s > 58000.toChar()) { - val code = cQueryTTF!!.GetCodeByGlyf(queryTTF.GetGlyfByCode(s.toInt())) - contentArray[index] = code.toChar() - } - } - contentStr = contentArray.joinToString("") + contentStr = analyzeRule.getContent(replaceRegex, contentStr) } Debug.log(bookSource.bookSourceUrl, "┌获取章节名称") Debug.log(bookSource.bookSourceUrl, "└${bookChapter.title}") diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index 6a90c89f7..37423cc54 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -237,8 +237,6 @@ class BookSourceEditActivity : add(EditEntity("sourceRegex", cr?.sourceRegex, R.string.rule_source_regex)) add(EditEntity("replaceRegex", cr?.replaceRegex, R.string.rule_replace_regex)) add(EditEntity("imageStyle", cr?.imageStyle, R.string.rule_image_style)) - add(EditEntity("font", cr?.font, R.string.rule_font)) - add(EditEntity("correctFont", cr?.correctFont, R.string.rule_correct_font)) } //发现 val er = source?.getExploreRule() @@ -342,8 +340,6 @@ class BookSourceEditActivity : "sourceRegex" -> contentRule.sourceRegex = it.value "replaceRegex" -> contentRule.replaceRegex = it.value "imageStyle" -> contentRule.imageStyle = it.value - "font" -> contentRule.font = it.value - "correctFont" -> contentRule.correctFont = it.value } } source.ruleSearch = searchRule diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 44fad2b64..19d45011a 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -412,8 +412,6 @@ 正文下一頁 URL 規則 (nextContentUrl) webJs 資源正則 (sourceRegex) - 网页内嵌字體(font) - 正确字体(font) 圖標 (sourceIcon) 列表規則 (ruleArticles) @@ -732,7 +730,7 @@ 恢復時忽略一些內容不恢復,方便不同手機配置不同 閱讀界面設置 图片样式(imageStyle) - 替换规则(replaceRegex) + 正文获取后处理规则(replaceRegex) 分組名稱 備註內容 默认启用替换净化 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 47622207e..fe065b1d9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -413,8 +413,6 @@ 正文下一頁URL規則(nextContentUrl) webJs 資源正則(sourceRegex) - 网页内嵌字體(font) - 正确字体(font) 圖示(sourceIcon) 列表規則(ruleArticles) @@ -732,7 +730,7 @@ 復原時忽略一些內容不復原,方便不同手機配置不同 閱讀介面設定 圖片樣式(imageStyle) - 取代規則(replaceRegex) + 正文获取后处理规则(replaceRegex) 分組名稱 備註內容 預設啟用取代淨化 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 8c54fd559..31b6c20d4 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -418,8 +418,6 @@ 正文下一页URL规则(nextContentUrl) webJs 资源正则(sourceRegex) - 网页内嵌字体(font) - 正确字体(font) 图标(sourceIcon) 列表规则(ruleArticles) @@ -737,7 +735,7 @@ 恢复时忽略一些内容不恢复,方便不同手机配置不同 阅读界面设置 图片样式(imageStyle) - 替换规则(replaceRegex) + 正文获取后处理规则(replaceRegex) 分组名称 备注内容 默认启用替换净化 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5132b8358..5bf01375f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -420,10 +420,8 @@ 正文下一页URL规则(nextContentUrl) webJs 资源正则(sourceRegex) - 替换规则(replaceRegex) + 正文获取后处理规则(replaceRegex) 图片样式(imageStyle) - 网页内嵌字体(font) - 正确字体(font) 图标(sourceIcon) 列表规则(ruleArticles)