添加点击图片打开对应Js的功能

感谢@Luoyacheng, https://github.com/Luoyacheng/legado
This commit is contained in:
HapeLee
2025-09-24 01:32:49 +08:00
parent 6f5545ef08
commit 23a110ff4a
2 changed files with 55 additions and 0 deletions
@@ -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.PopupAction
import io.legato.kazusa.ui.widget.dialog.PhotoDialog import io.legato.kazusa.ui.widget.dialog.PhotoDialog
import io.legato.kazusa.utils.Debounce import io.legato.kazusa.utils.Debounce
import io.legato.kazusa.utils.GSON
import io.legato.kazusa.utils.LogUtils import io.legato.kazusa.utils.LogUtils
import io.legato.kazusa.utils.NetworkUtils import io.legato.kazusa.utils.NetworkUtils
import io.legato.kazusa.utils.StartActivityContract import io.legato.kazusa.utils.StartActivityContract
import io.legato.kazusa.utils.applyOpenTint import io.legato.kazusa.utils.applyOpenTint
import io.legato.kazusa.utils.buildMainHandler import io.legato.kazusa.utils.buildMainHandler
import io.legato.kazusa.utils.dismissDialogFragment import io.legato.kazusa.utils.dismissDialogFragment
import io.legato.kazusa.utils.fromJsonObject
import io.legato.kazusa.utils.getPrefBoolean import io.legato.kazusa.utils.getPrefBoolean
import io.legato.kazusa.utils.getPrefString import io.legato.kazusa.utils.getPrefString
import io.legato.kazusa.utils.hexString import io.legato.kazusa.utils.hexString
import io.legato.kazusa.utils.iconItemOnLongClick import io.legato.kazusa.utils.iconItemOnLongClick
import io.legato.kazusa.utils.invisible import io.legato.kazusa.utils.invisible
import io.legato.kazusa.utils.isAbsUrl import io.legato.kazusa.utils.isAbsUrl
import io.legato.kazusa.utils.isJsonObject
import io.legato.kazusa.utils.isTrue import io.legato.kazusa.utils.isTrue
import io.legato.kazusa.utils.navigationBarGravity import io.legato.kazusa.utils.navigationBarGravity
import io.legato.kazusa.utils.observeEvent import io.legato.kazusa.utils.observeEvent
@@ -1404,6 +1407,48 @@ class ReadBookActivity : BaseReadBookActivity(),
showHelp("readMenuHelp") 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<Map<String, String>>(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
}
}
}
/** /**
* 长按图片 * 长按图片
*/ */
@@ -8,6 +8,7 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import io.legato.kazusa.R import io.legato.kazusa.R
import io.legato.kazusa.data.entities.Bookmark 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.help.config.AppConfig
import io.legato.kazusa.model.ReadBook import io.legato.kazusa.model.ReadBook
import io.legato.kazusa.ui.book.read.page.delegate.PageDelegate 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) { is ImageColumn -> if (AppConfig.previewImageByClick) {
activity?.showDialogFragment(PhotoDialog(column.src)) activity?.showDialogFragment(PhotoDialog(column.src))
handled = true 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 onImageLongPress(x: Float, y: Float, src: String)
fun onCancelSelect() fun onCancelSelect()
fun onLongScreenshotTouchEvent(event: MotionEvent): Boolean fun onLongScreenshotTouchEvent(event: MotionEvent): Boolean
fun clickImg(clickjs: String)
} }
} }