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)