diff --git a/app/src/main/java/com/example/research/core/util/StringExtensions.kt b/app/src/main/java/com/example/research/core/util/StringExtensions.kt index 6bfc8ab..8da798a 100644 --- a/app/src/main/java/com/example/research/core/util/StringExtensions.kt +++ b/app/src/main/java/com/example/research/core/util/StringExtensions.kt @@ -60,7 +60,10 @@ fun String.extractDictionaryPrefix(): String { } -fun String.removeAccentTagsForIndexing(): String { +fun String.removeAccentTagsForIndexing(): String = + rewriteAccentTags { builder, from, to -> builder.append(this, from, to) } + +internal inline fun String.rewriteAccentTags(appendInner: (StringBuilder, Int, Int) -> Unit): String { val firstOpen = indexOf("[']") if (firstOpen < 0) return this @@ -80,7 +83,7 @@ fun String.removeAccentTagsForIndexing(): String { builder = StringBuilder(length) } builder.append(this, appendStart, index) - builder.append(this, index + 3, scan) + appendInner(builder, index + 3, scan) index = scan + 4 appendStart = index continue @@ -94,7 +97,7 @@ fun String.removeAccentTagsForIndexing(): String { }?.toString() ?: this } -private fun String.startsWithAt(start: Int, literal: String): Boolean { +internal fun String.startsWithAt(start: Int, literal: String): Boolean { if (start < 0 || start + literal.length > length) return false for (i in literal.indices) { if (this[start + i] != literal[i]) return false diff --git a/app/src/main/java/com/example/research/data/parser/DslHeadwordParser.kt b/app/src/main/java/com/example/research/data/parser/DslHeadwordParser.kt index ec28974..c683cb5 100644 --- a/app/src/main/java/com/example/research/data/parser/DslHeadwordParser.kt +++ b/app/src/main/java/com/example/research/data/parser/DslHeadwordParser.kt @@ -1,5 +1,8 @@ package com.example.research.data.parser +import com.example.research.core.util.rewriteAccentTags +import com.example.research.core.util.startsWithAt + object DslHeadwordParser { private val FORMATTING_LITERAL_TAGS = arrayOf( @@ -117,12 +120,12 @@ object DslHeadwordParser { } private fun reconstructDisplayPrefix(value: String): String { - val reconstructed = removeCurlyBraceDelimiters(value) - val formattingTagIndex = firstFormattingTagIndex(reconstructed) - return if (formattingTagIndex >= 0) { - reconstructed.substring(0, formattingTagIndex).trim() - } else { - reconstructed.trim() + return removeFormattingTags(removeCurlyBraceDelimiters(value).applyAccentMarks()).trim() + } + + private fun String.applyAccentMarks(): String = rewriteAccentTags { builder, from, to -> + if (to > from) { + builder.append(this[from]).append('\u0301').append(this, from + 1, to) } } @@ -145,21 +148,6 @@ object DslHeadwordParser { } } - private fun firstFormattingTagIndex(value: String): Int { - var index = 0 - while (index < value.length) { - if (value[index] == '\\' && index + 1 < value.length) { - index += 2 - continue - } - if (value[index] == '[' && formattingTagEnd(value, index) > index) { - return index - } - index++ - } - return -1 - } - private fun firstCurlyContent(value: String): String? { var index = 0 while (index < value.length) { @@ -346,14 +334,6 @@ object DslHeadwordParser { return if (index < value.length && value[index] == ']') index + 1 else -1 } - private fun String.startsWithAt(start: Int, literal: String): Boolean { - if (start < 0 || start + literal.length > length) return false - for (i in literal.indices) { - if (this[start + i] != literal[i]) return false - } - return true - } - private fun Char.isTagWhitespace(): Boolean { return this == ' ' || this == '\t' || diff --git a/app/src/main/java/com/example/research/data/parser/DslIndexer.kt b/app/src/main/java/com/example/research/data/parser/DslIndexer.kt index 5d4b4f5..d93f318 100644 --- a/app/src/main/java/com/example/research/data/parser/DslIndexer.kt +++ b/app/src/main/java/com/example/research/data/parser/DslIndexer.kt @@ -24,7 +24,7 @@ class DslIndexer(context: Context? = null) { companion object { private const val TAG = "DslIndexer" - const val INDEX_VERSION = 6 + const val INDEX_VERSION = 7 const val BUFFER_SIZE = 1048576 const val BATCH_BUFFER_SIZE = 524288 private const val INDEX_SORT_PARALLELISM = 1