Просмотр исходного кода

添加点击图片打开对应Js的功能
感谢@Luoyacheng, https://github.com/Luoyacheng/legado

HapeLee 1 год назад
Родитель
Сommit
23a110ff4a

+ 45 - 0
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.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
+            }
+        }
+    }
+
     /**
     /**
      * 长按图片
      * 长按图片
      */
      */

+ 10 - 0
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 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)
     }
     }
 }
 }