添加点击图片打开对应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.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<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 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)
}
}