Kaynağa Gözat

优化rss相关 (#4403)

* js变量中增加rssArticle;消除ide警告

* 修改提示按钮

* rss收藏页面增加分组查看和跳转
老牛 1 yıl önce
ebeveyn
işleme
84758866a4

+ 1 - 0
app/src/main/assets/web/help/md/jsHelp.md

@@ -23,6 +23,7 @@
 |baseUrl|当前url,String  |
 |baseUrl|当前url,String  |
 |result|上一步的结果|
 |result|上一步的结果|
 |book|[书籍类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/Book.kt)|
 |book|[书籍类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/Book.kt)|
+|rssArticle|[Article类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/RssArticle.kt)|
 |chapter|[章节类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BookChapter.kt)|
 |chapter|[章节类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BookChapter.kt)|
 |source|[基础书源类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BaseSource.kt)|
 |source|[基础书源类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BaseSource.kt)|
 |cookie|[cookie操作类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/http/CookieStore.kt)| 
 |cookie|[cookie操作类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/http/CookieStore.kt)| 

+ 8 - 4
app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt

@@ -10,6 +10,7 @@ import io.legado.app.data.entities.BaseSource
 import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.BookChapter
 import io.legado.app.data.entities.BookChapter
 import io.legado.app.data.entities.BookSource
 import io.legado.app.data.entities.BookSource
+import io.legado.app.data.entities.RssArticle
 import io.legado.app.help.CacheManager
 import io.legado.app.help.CacheManager
 import io.legado.app.help.JsExtensions
 import io.legado.app.help.JsExtensions
 import io.legado.app.help.http.CookieStore
 import io.legado.app.help.http.CookieStore
@@ -27,6 +28,7 @@ import org.apache.commons.text.StringEscapeUtils
 import org.jsoup.nodes.Node
 import org.jsoup.nodes.Node
 import org.mozilla.javascript.NativeObject
 import org.mozilla.javascript.NativeObject
 import java.net.URL
 import java.net.URL
+import java.util.Locale
 import java.util.regex.Pattern
 import java.util.regex.Pattern
 import kotlin.collections.component1
 import kotlin.collections.component1
 import kotlin.collections.component2
 import kotlin.collections.component2
@@ -45,6 +47,7 @@ class AnalyzeRule(
 ) : JsExtensions {
 ) : JsExtensions {
 
 
     val book get() = ruleData as? BaseBook
     val book get() = ruleData as? BaseBook
+    val rssArticle get() = ruleData as? RssArticle
 
 
     var chapter: BookChapter? = null
     var chapter: BookChapter? = null
     var nextChapterUrl: String? = null
     var nextChapterUrl: String? = null
@@ -199,7 +202,7 @@ class AnalyzeRule(
                         }
                         }
                         if (sourceRule.replaceRegex.isNotEmpty() && result is List<*>) {
                         if (sourceRule.replaceRegex.isNotEmpty() && result is List<*>) {
                             val newList = ArrayList<String>()
                             val newList = ArrayList<String>()
-                            for (item in result) {
+                            for (item in result as List<*>) {
                                 newList.add(replaceRegex(item.toString(), sourceRule))
                                 newList.add(replaceRegex(item.toString(), sourceRule))
                             }
                             }
                             result = newList
                             result = newList
@@ -212,12 +215,12 @@ class AnalyzeRule(
         }
         }
         if (result == null) return null
         if (result == null) return null
         if (result is String) {
         if (result is String) {
-            result = result.split("\n")
+            result = (result as String).split("\n")
         }
         }
         if (isUrl) {
         if (isUrl) {
             val urlList = ArrayList<String>()
             val urlList = ArrayList<String>()
             if (result is List<*>) {
             if (result is List<*>) {
-                for (url in result) {
+                for (url in result as List<*>) {
                     val absoluteURL = NetworkUtils.getAbsoluteURL(redirectUrl, url.toString())
                     val absoluteURL = NetworkUtils.getAbsoluteURL(redirectUrl, url.toString())
                     if (absoluteURL.isNotEmpty() && !urlList.contains(absoluteURL)) {
                     if (absoluteURL.isNotEmpty() && !urlList.contains(absoluteURL)) {
                         urlList.add(absoluteURL)
                         urlList.add(absoluteURL)
@@ -650,7 +653,7 @@ class AnalyzeRule(
                                     jsEval is String -> infoVal.insert(0, jsEval)
                                     jsEval is String -> infoVal.insert(0, jsEval)
                                     jsEval is Double && jsEval % 1.0 == 0.0 -> infoVal.insert(
                                     jsEval is Double && jsEval % 1.0 == 0.0 -> infoVal.insert(
                                         0,
                                         0,
-                                        String.format("%.0f", jsEval)
+                                        String.format(Locale.getDefault(), "%.0f", jsEval)
                                     )
                                     )
 
 
                                     else -> infoVal.insert(0, jsEval.toString())
                                     else -> infoVal.insert(0, jsEval.toString())
@@ -744,6 +747,7 @@ class AnalyzeRule(
             bindings["title"] = chapter?.title
             bindings["title"] = chapter?.title
             bindings["src"] = content
             bindings["src"] = content
             bindings["nextChapterUrl"] = nextChapterUrl
             bindings["nextChapterUrl"] = nextChapterUrl
+            bindings["rssArticle"] = rssArticle
         }
         }
         val scope = RhinoScriptEngine.getRuntimeScope(bindings)
         val scope = RhinoScriptEngine.getRuntimeScope(bindings)
         source?.getShareScope()?.let {
         source?.getShareScope()?.let {

+ 1 - 1
app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt

@@ -249,7 +249,7 @@ class OtherConfigFragment : PreferenceFragment(),
                     putPrefString(PreferKey.userAgent, userAgent)
                     putPrefString(PreferKey.userAgent, userAgent)
                 }
                 }
             }
             }
-            noButton()
+            cancelButton()
         }
         }
     }
     }
 
 

+ 30 - 0
app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt

@@ -3,9 +3,13 @@
 package io.legado.app.ui.rss.favorites
 package io.legado.app.ui.rss.favorites
 
 
 import android.os.Bundle
 import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import android.view.SubMenu
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentStatePagerAdapter
 import androidx.fragment.app.FragmentStatePagerAdapter
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.lifecycleScope
+import io.legado.app.R
 import io.legado.app.base.BaseActivity
 import io.legado.app.base.BaseActivity
 import io.legado.app.constant.AppLog
 import io.legado.app.constant.AppLog
 import io.legado.app.data.appDb
 import io.legado.app.data.appDb
@@ -28,6 +32,7 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {
     override val binding by viewBinding(ActivityRssFavoritesBinding::inflate)
     override val binding by viewBinding(ActivityRssFavoritesBinding::inflate)
     private val adapter by lazy { TabFragmentPageAdapter() }
     private val adapter by lazy { TabFragmentPageAdapter() }
     private var groupList = mutableListOf<String>()
     private var groupList = mutableListOf<String>()
+    private var groupsMenu: SubMenu? = null
 
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         initView()
         initView()
@@ -40,6 +45,28 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {
         binding.tabLayout.setSelectedTabIndicatorColor(accentColor)
         binding.tabLayout.setSelectedTabIndicatorColor(accentColor)
     }
     }
 
 
+    override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
+        menuInflater.inflate(R.menu.main_explore, menu)
+        groupsMenu = menu.findItem(R.id.menu_group)?.subMenu
+        upGroupsMenu()
+        return super.onCompatCreateOptionsMenu(menu)
+    }
+
+    private fun upGroupsMenu() = groupsMenu?.let { subMenu ->
+        subMenu.removeGroup(R.id.menu_group_text)
+        groupList.forEachIndexed { index, it ->
+            subMenu.add(R.id.menu_group_text, Menu.NONE, index, it)
+        }
+    }
+
+    override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
+        super.onCompatOptionsItemSelected(item)
+        if (item.groupId == R.id.menu_group_text) {
+            binding.viewPager.setCurrentItem(item.order)
+        }
+        return super.onCompatOptionsItemSelected(item)
+    }
+
     private fun upFragments() {
     private fun upFragments() {
         lifecycleScope.launch {
         lifecycleScope.launch {
             appDb.rssStarDao.flowGroups().catch {
             appDb.rssStarDao.flowGroups().catch {
@@ -52,6 +79,9 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {
                 } else {
                 } else {
                     binding.tabLayout.visible()
                     binding.tabLayout.visible()
                 }
                 }
+                if (groupsMenu != null){
+                    upGroupsMenu()
+                }
                 adapter.notifyDataSetChanged()
                 adapter.notifyDataSetChanged()
             }
             }
         }
         }