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 f448f6c85..507e50261 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 @@ -33,7 +33,7 @@ import splitties.init.appCtx data class BookChapter( var url: String = "", // 章节地址 var title: String = "", // 章节标题 - var isVolume: Boolean = false, // 是否是卷名 + var isVolume: Boolean = false, // 是否是卷名 var baseUrl: String = "", // 用来拼接相对url var bookUrl: String = "", // 书籍地址 var index: Int = 0, // 章节序号 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 4016c455e..4f881b2a3 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 @@ -11,5 +11,5 @@ data class ContentRule( var sourceRegex: String? = null, var replaceRegex: String? = null, //替换规则 var imageStyle: String? = null, //默认大小居中,FULL最大宽度 - var payAction: String? = null, //购买操作,url/js + var payAction: String? = null, //购买操作,js或者包含{{js}}的url ) : Parcelable \ No newline at end of file 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 20aeae31a..9fbc60561 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 @@ -460,6 +460,7 @@ class AnalyzeUrl( */ suspend fun getByteArrayAwait(): ByteArray { val concurrentRecord = fetchStart() + @Suppress("RegExpRedundantEscape") val dataUriFindResult = dataUriRegex.find(urlNoQuery) @Suppress("BlockingMethodInNonBlockingContext") diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 86d7c35ed..58ef70c39 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -919,21 +919,15 @@ class ReadBookActivity : BaseReadBookActivity(), if (payAction.isNullOrEmpty()) { throw NoStackTraceException("no pay action") } - if (payAction.isAbsUrl()) { - payAction - } else { - source.evalJS(payAction) { - put("book", book) - put("chapter", chapter) - }?.toString() + JsUtils.evalJs(payAction) { + it["book"] = book + it["chapter"] = chapter } }.onSuccess { - it?.let { - startActivity { - putExtra("title", getString(R.string.chapter_pay)) - putExtra("url", it) - IntentData.put(it, ReadBook.bookSource?.getHeaderMap(true)) - } + startActivity { + putExtra("title", getString(R.string.chapter_pay)) + putExtra("url", it) + IntentData.put(it, ReadBook.bookSource?.getHeaderMap(true)) } }.onError { toastOnUi(it.localizedMessage) diff --git a/app/src/main/java/io/legado/app/utils/JsUtils.kt b/app/src/main/java/io/legado/app/utils/JsUtils.kt new file mode 100644 index 000000000..79a0701f5 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/JsUtils.kt @@ -0,0 +1,34 @@ +package io.legado.app.utils + +import io.legado.app.constant.AppConst.SCRIPT_ENGINE +import io.legado.app.constant.AppPattern.EXP_PATTERN +import javax.script.SimpleBindings + +object JsUtils { + + fun evalJs(js: String, bindingsFun: ((SimpleBindings) -> Unit)? = null): String { + val bindings = SimpleBindings() + bindingsFun?.invoke(bindings) + if (js.contains("{{") && js.contains("}}")) { + val sb = StringBuffer() + val expMatcher = EXP_PATTERN.matcher(js) + while (expMatcher.find()) { + val result = expMatcher.group(1)?.let { + SCRIPT_ENGINE.eval(it, bindings) + } ?: "" + if (result is String) { + expMatcher.appendReplacement(sb, result) + } else if (result is Double && result % 1.0 == 0.0) { + expMatcher.appendReplacement(sb, String.format("%.0f", result)) + } else { + expMatcher.appendReplacement(sb, result.toString()) + } + } + expMatcher.appendTail(sb) + return sb.toString() + } + return SCRIPT_ENGINE.eval(js, bindings).toString() + } + + +} \ No newline at end of file