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

Merge remote-tracking branch 'origin/main'

HapeLee 4 месяцев назад
Родитель
Сommit
3052175432

+ 9 - 8
app/src/main/java/io/legado/app/help/book/BookExtensions.kt

@@ -355,7 +355,7 @@ fun parseHighlightedTags(
         return emptyList<HighlightedTag>() to kindLabels
     }
 
-    val compiledRules = rules.mapNotNull { rule ->
+    val compiledRules = rules.sortedBy { it.order }.mapNotNull { rule ->
         val regex = try {
             Regex(rule.pattern)
         } catch (_: Exception) {
@@ -367,8 +367,7 @@ fun parseHighlightedTags(
         return emptyList<HighlightedTag>() to kindLabels
     }
 
-    // Group matched labels by rule
-    val ruleToLabels = linkedMapOf<HighlightTagRule, MutableList<String>>()
+    val ruleToLabels = mutableMapOf<HighlightTagRule, MutableList<String>>()
     val regular = mutableListOf<String>()
 
     for (tag in kindLabels) {
@@ -385,11 +384,13 @@ fun parseHighlightedTags(
         }
     }
 
-    val highlighted = ruleToLabels.map { (rule, labels) ->
-        HighlightedTag(
-            matchedLabels = labels,
-            title = rule.title.takeIf { it.isNotBlank() },
-        )
+    val highlighted = compiledRules.mapNotNull { (rule, _) ->
+        ruleToLabels[rule]?.let { labels ->
+            HighlightedTag(
+                matchedLabels = labels,
+                title = rule.title.takeIf { it.isNotBlank() },
+            )
+        }
     }
 
     return highlighted to regular

+ 35 - 0
app/src/test/java/io/legado/app/help/book/BookExtensionsTest.kt

@@ -0,0 +1,35 @@
+package io.legado.app.help.book
+
+import io.legado.app.data.entities.HighlightTagRule
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class BookExtensionsTest {
+
+    @Test
+    fun parseHighlightedTags_ordersMatchesByRuleOrder() {
+        val rules = listOf(
+            HighlightTagRule(
+                id = 2,
+                title = "次要",
+                pattern = "动作",
+                order = 1,
+            ),
+            HighlightTagRule(
+                id = 1,
+                title = "优先",
+                pattern = "奇幻",
+                order = 0,
+            ),
+        )
+
+        val (highlighted, regular) = parseHighlightedTags(
+            kindLabels = listOf("动作", "普通", "奇幻"),
+            rules = rules,
+        )
+
+        assertEquals(listOf("优先", "次要"), highlighted.map { it.title })
+        assertEquals(listOf(listOf("奇幻"), listOf("动作")), highlighted.map { it.matchedLabels })
+        assertEquals(listOf("普通"), regular)
+    }
+}