From a87d720ae3a19542ee7aa4ca304e4863fb99b0d7 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Thu, 22 Jun 2023 17:02:25 +0800 Subject: [PATCH] Support tag suggestion under operators and qualifiers --- .../hippo/ehviewer/client/EhTagDatabase.kt | 37 ++++++++++++------- .../hippo/ehviewer/ui/scene/SearchBarScene.kt | 11 +++--- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.kt b/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.kt index 72efeaf84..e292f61c7 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.kt @@ -47,6 +47,12 @@ private typealias TagGroups = Map object EhTagDatabase : CoroutineScope { private const val NAMESPACE_PREFIX = "n" + private val PREFIXES = arrayOf( + "-", + "~", + "tag:", + "weak:", + ) private lateinit var tagGroups: TagGroups private val updateLock = Mutex() private val dbLock = Mutex() @@ -101,22 +107,25 @@ object EhTagDatabase : CoroutineScope { translate: Boolean, exactly: Boolean = false, ): Flow> = flow { - val keywordPrefix = keyword.substringBefore(':') - val keywordTag = keyword.drop(keywordPrefix.length + 1) - val prefix = namespaceToPrefix(keywordPrefix) ?: keywordPrefix - val tags = tagGroups[prefix.takeIf { keywordTag.isNotEmpty() && it != NAMESPACE_PREFIX }] + var mKeyword = keyword + PREFIXES.forEach { mKeyword = mKeyword.removePrefix(it) } + val prefix = keyword.dropLast(mKeyword.length) + val namespace = mKeyword.substringBefore(':') + val tagKeyword = mKeyword.drop(namespace.length + 1) + val namespacePrefix = namespaceToPrefix(namespace) ?: namespace + val tags = tagGroups[namespacePrefix.takeIf { tagKeyword.isNotEmpty() && it != NAMESPACE_PREFIX }] tags?.let { - internalSuggestFlow(it, keywordTag, translate, exactly).collect { (hint, tag) -> - emit(Pair(hint, "$prefix:$tag")) + internalSuggestFlow(it, tagKeyword, translate, exactly).collect { (hint, tag) -> + emit(Pair(hint, "$prefix$namespacePrefix:$tag")) } - } ?: tagGroups.forEach { (prefix, tags) -> - if (prefix != NAMESPACE_PREFIX) { - internalSuggestFlow(tags, keyword, translate, exactly).collect { (hint, tag) -> - emit(Pair(hint, "$prefix:$tag")) + } ?: tagGroups.forEach { (namespacePrefix, tags) -> + if (namespacePrefix != NAMESPACE_PREFIX) { + internalSuggestFlow(tags, mKeyword, translate, exactly).collect { (hint, tag) -> + emit(Pair(hint, "$prefix$namespacePrefix:$tag")) } } else { - internalSuggestFlow(tags, keyword, translate, exactly).collect { (hint, tag) -> - emit(Pair(hint, "$tag:")) + internalSuggestFlow(tags, mKeyword, translate, exactly).collect { (hint, namespacePrefix) -> + emit(Pair(hint, "$prefix$namespacePrefix:")) } } } @@ -208,7 +217,9 @@ object EhTagDatabase : CoroutineScope { val dir = AppConfig.getFilesDir("tag-translations") val dataFile = File(dir, dataName).takeIf { it.exists() } ?: return runSuspendCatching { - tagGroups = JSONObject(dataFile.source().buffer().readString(StandardCharsets.UTF_8)).toTagGroups() + tagGroups = JSONObject( + dataFile.source().buffer().readString(StandardCharsets.UTF_8), + ).toTagGroups() }.onFailure { it.printStackTrace() } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt index 509c3560f..9b5b84d48 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt @@ -263,11 +263,12 @@ abstract class SearchBarScene : BaseScene(), ToolBarScene { override fun onClick() { val edittext = binding.searchview.editText edittext.let { - val keywords = it.text.toString().substringBeforeLast(' ', "") - val keyword = wrapTagKeyword(mKeyword) - val newKeywords = if (keywords.isNotEmpty()) "$keywords $keyword " else "$keyword " - it.setText(newKeywords) - it.setSelection(newKeywords.length) + var keywords = it.text.toString().substringBeforeLast(' ', "") + if (keywords.isNotEmpty()) keywords += ' ' + keywords += wrapTagKeyword(mKeyword) + if (!keywords.endsWith(':')) keywords += ' ' + it.setText(keywords) + it.setSelection(keywords.length) } } }