Fix multi-criterion search detail highligh

This commit is contained in:
Thomas Andres Gomez 2023-09-19 10:26:56 +02:00
parent 2e4c87c052
commit 9e5655c7d7
4 changed files with 28 additions and 21 deletions

View file

@ -66,6 +66,7 @@ import com.pixelized.rplexicon.utilitary.extentions.annotatedString
import com.pixelized.rplexicon.utilitary.extentions.highlightRegex import com.pixelized.rplexicon.utilitary.extentions.highlightRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scrollOffset import com.pixelized.rplexicon.utilitary.extentions.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.skydoves.landscapist.ImageOptions import com.skydoves.landscapist.ImageOptions
@Stable @Stable
@ -104,7 +105,8 @@ data class AnnotatedLexiconDetailUio(
fun LexiconDetailUio.annotate(): AnnotatedLexiconDetailUio { fun LexiconDetailUio.annotate(): AnnotatedLexiconDetailUio {
val colorScheme = MaterialTheme.colorScheme val colorScheme = MaterialTheme.colorScheme
val highlight = remember { SpanStyle(color = colorScheme.primary) } val highlight = remember { SpanStyle(color = colorScheme.primary) }
val highlightRegex = remember(search) { search.highlightRegex } val trimmedSearch = remember(search) { search.searchCriterion() }
val highlightRegex = remember(search) { trimmedSearch.highlightRegex }
val gender = stringResource(id = gender, short = true) val gender = stringResource(id = gender, short = true)
val race = stringResource(id = race) val race = stringResource(id = race)

View file

@ -39,6 +39,7 @@ import com.pixelized.rplexicon.utilitary.extentions.finderRegex
import com.pixelized.rplexicon.utilitary.extentions.foldAll import com.pixelized.rplexicon.utilitary.extentions.foldAll
import com.pixelized.rplexicon.utilitary.extentions.highlightRegex import com.pixelized.rplexicon.utilitary.extentions.highlightRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
@Stable @Stable
class SearchItemUio( class SearchItemUio(
@ -109,9 +110,7 @@ class AnnotatedSearchItemUio(
private fun SearchItemUio.annotate(): AnnotatedSearchItemUio { private fun SearchItemUio.annotate(): AnnotatedSearchItemUio {
val colorScheme = MaterialTheme.colorScheme val colorScheme = MaterialTheme.colorScheme
val highlight = remember { SpanStyle(color = colorScheme.primary) } val highlight = remember { SpanStyle(color = colorScheme.primary) }
val trimmedSearch = remember(search) { val trimmedSearch = remember(search) { search.searchCriterion() }
search.split(" ").mapNotNull { it.trim().takeIf { trim -> trim.isNotEmpty() } }
}
val highlightRegex = remember(search) { trimmedSearch.highlightRegex } val highlightRegex = remember(search) { trimmedSearch.highlightRegex }
val finderRegex = remember(search) { trimmedSearch.finderRegex } val finderRegex = remember(search) { trimmedSearch.finderRegex }
val gender = stringResource(id = gender, short = true) val gender = stringResource(id = gender, short = true)

View file

@ -11,6 +11,7 @@ import com.pixelized.rplexicon.repository.data.LexiconRepository
import com.pixelized.rplexicon.ui.composable.form.DropDownFieldUio import com.pixelized.rplexicon.ui.composable.form.DropDownFieldUio
import com.pixelized.rplexicon.ui.composable.form.TextFieldUio import com.pixelized.rplexicon.ui.composable.form.TextFieldUio
import com.pixelized.rplexicon.utilitary.composable.stringResource import com.pixelized.rplexicon.utilitary.composable.stringResource
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject import javax.inject.Inject
@ -52,17 +53,15 @@ class SearchViewModel @Inject constructor(
data.filter { item -> data.filter { item ->
val gender = _gender.value?.let { it == item.gender } val gender = _gender.value?.let { it == item.gender }
val race = _race.value?.let { it == item.race } val race = _race.value?.let { it == item.race }
val search = _search.value.split(" ").mapNotNull { val search = _search.value.searchCriterion().map { criteria ->
it.takeIf { it.isNotEmpty() }?.trim()?.let { search -> val name = item.name.contains(criteria, true)
val name = item.name.contains(search, true) val diminutive = item.diminutive?.contains(criteria, true) == true
val diminutive = item.diminutive?.contains(search, true) == true val status = item.status?.contains(criteria, true) == true
val status = item.status?.contains(search, true) == true val location = item.location?.contains(criteria, true) == true
val location = item.location?.contains(search, true) == true val description = item.description?.contains(criteria, true) == true
val description = item.description?.contains(search, true) == true val history = item.history?.contains(criteria, true) == true
val history = item.history?.contains(search, true) == true val tag = item.tags?.contains(criteria, true) == true
val tag = item.tags?.contains(search, true) == true name || diminutive || status || location || description || history || tag
name || diminutive || status || location || description || history || tag
}
} }
(gender == null || gender) && (race == null || race) && (search.all { it }) (gender == null || gender) && (race == null || race) && (search.all { it })
}.map { }.map {

View file

@ -41,12 +41,6 @@ val List<String>.finderRegex: Regex?
) )
} else null } else null
fun String?.toUriOrNull(): Uri? = try {
this?.takeIf { it.isNotBlank() }?.toUri()
} catch (_: Exception) {
null
}
@Stable @Stable
fun String.annotateWithDropCap( fun String.annotateWithDropCap(
style: SpanStyle, style: SpanStyle,
@ -57,3 +51,16 @@ fun String.annotateWithDropCap(
spanStyle = style, spanStyle = style,
) )
) )
@Stable
fun String?.toUriOrNull(): Uri? = try {
this?.takeIf { it.isNotBlank() }?.toUri()
} catch (_: Exception) {
null
}
@Stable
fun String?.searchCriterion(): List<String> = this
?.split(" ")
?.mapNotNull { it.trim().takeIf { trim -> trim.isNotEmpty() } }
?: emptyList()