From 23a110ff4a861f6280981db3f22845f6f1d6a5aa Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Wed, 24 Sep 2025 01:32:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=82=B9=E5=87=BB=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=89=93=E5=BC=80=E5=AF=B9=E5=BA=94Js=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=E6=84=9F=E8=B0=A2@Luoyacheng,=20https://g?= =?UTF-8?q?ithub.com/Luoyacheng/legado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kazusa/ui/book/read/ReadBookActivity.kt | 45 +++++++++++++++++++ .../ui/book/read/page/ContentTextView.kt | 10 +++++ 2 files changed, 55 insertions(+) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt index bc6f6fcd1..70f4cc388 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt @@ -100,18 +100,21 @@ import io.legato.kazusa.ui.replace.edit.ReplaceEditActivity import io.legato.kazusa.ui.widget.PopupAction import io.legato.kazusa.ui.widget.dialog.PhotoDialog import io.legato.kazusa.utils.Debounce +import io.legato.kazusa.utils.GSON import io.legato.kazusa.utils.LogUtils import io.legato.kazusa.utils.NetworkUtils import io.legato.kazusa.utils.StartActivityContract import io.legato.kazusa.utils.applyOpenTint import io.legato.kazusa.utils.buildMainHandler import io.legato.kazusa.utils.dismissDialogFragment +import io.legato.kazusa.utils.fromJsonObject import io.legato.kazusa.utils.getPrefBoolean import io.legato.kazusa.utils.getPrefString import io.legato.kazusa.utils.hexString import io.legato.kazusa.utils.iconItemOnLongClick import io.legato.kazusa.utils.invisible import io.legato.kazusa.utils.isAbsUrl +import io.legato.kazusa.utils.isJsonObject import io.legato.kazusa.utils.isTrue import io.legato.kazusa.utils.navigationBarGravity import io.legato.kazusa.utils.observeEvent @@ -1404,6 +1407,48 @@ class ReadBookActivity : BaseReadBookActivity(), showHelp("readMenuHelp") } + override fun clickImg(clickjs: String) { + val braceIndex = clickjs.indexOf(",{") + val braceIndex2 = if (braceIndex == -1) clickjs.indexOf(", {") else -1 + if (braceIndex != -1 || braceIndex2 != -1) { + val book = ReadBook.book ?: return + val chapter = appDb.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex) + if (chapter == null) { + toastOnUi("章节不存在") + return + } + val (result, urlOptionStr) = when { + braceIndex != -1 -> { + clickjs.substring(0, braceIndex) to clickjs.substring(braceIndex + 1) + } + else -> { + clickjs.substring(0, braceIndex2) to clickjs.substring(braceIndex2 + 2) + } + } + if (urlOptionStr.isJsonObject()) { + val urlOptionMap = GSON.fromJsonObject>(urlOptionStr).getOrThrow() + val jsStr = urlOptionMap["js"] + jsStr?.let { + Coroutine.async(lifecycleScope) { + val source = ReadBook.bookSource ?: throw Exception("书源不存在") + AnalyzeRule(book, source).apply { + setCoroutineContext(coroutineContext) + setBaseUrl(chapter.url) + setChapter(chapter) + evalJS(jsStr, result).toString() + } + }.onError { + AppLog.put("图片点击执行出错\n${it.localizedMessage}", it, true) + } + } + } + else { + toastOnUi("链接格式错误") + return + } + } + } + /** * 长按图片 */ diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/page/ContentTextView.kt index c8406dd33..134a21b33 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/page/ContentTextView.kt @@ -8,6 +8,7 @@ import android.view.MotionEvent import android.view.View import io.legato.kazusa.R import io.legato.kazusa.data.entities.Bookmark +import io.legato.kazusa.help.book.isOnLineTxt import io.legato.kazusa.help.config.AppConfig import io.legato.kazusa.model.ReadBook import io.legato.kazusa.ui.book.read.page.delegate.PageDelegate @@ -247,6 +248,14 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at is ImageColumn -> if (AppConfig.previewImageByClick) { activity?.showDialogFragment(PhotoDialog(column.src)) handled = true + } else { + if (ReadBook.book?.isOnLineTxt == true) { + val src = column.src + if (src.contains("\"js\"") || src.contains("'js'")) { + callBack.clickImg(src) + handled = true + } + } } } } @@ -713,5 +722,6 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at fun onImageLongPress(x: Float, y: Float, src: String) fun onCancelSelect() fun onLongScreenshotTouchEvent(event: MotionEvent): Boolean + fun clickImg(clickjs: String) } }