Improve article sort order (2)
authorLanius Trolling <lanius@laniustrolling.dev>
Fri, 26 Apr 2024 23:45:09 +0000 (19:45 -0400)
committerLanius Trolling <lanius@laniustrolling.dev>
Fri, 26 Apr 2024 23:45:09 +0000 (19:45 -0400)
src/jvmMain/kotlin/info/mechyrdia/lore/ArticleListing.kt

index f7f3dd08a94bb168ef1ab650afb1b0757dd06e84..04ed0778b596ae60c9dcc9f41c2ff9491f5ae1be 100644 (file)
@@ -14,6 +14,10 @@ import kotlinx.html.UL
 import kotlinx.html.a
 import kotlinx.html.li
 import kotlinx.html.ul
+import java.text.CollationKey
+import java.text.Collator
+import java.util.*
+import kotlin.Comparator
 
 data class ArticleNode(val name: String, val title: String, val subNodes: List<ArticleNode>?)
 
@@ -31,7 +35,20 @@ suspend fun StoragePath.toArticleNode(): ArticleNode = ArticleNode(
        }?.sortedAsArticles()
 )
 
-private fun List<ArticleNode>.sortedAsArticles() = sortedBy { it.title }.sortedBy { it.subNodes == null }
+private val collator: Collator = Collator.getInstance(Locale.US).apply {
+       strength = Collator.PRIMARY
+       decomposition = Collator.FULL_DECOMPOSITION
+}
+
+private val collationSorter = Comparator<Pair<*, CollationKey>> { (_, a), (_, b) ->
+       a.compareTo(b)
+}
+
+fun <T> List<T>.sortedLexically(selector: (T) -> String) = map { it to collator.getCollationKey(selector(it)) }
+       .sortedWith(collationSorter)
+       .map { (it, _) -> it }
+
+private fun List<ArticleNode>.sortedAsArticles() = sortedLexically { it.title }.sortedBy { it.subNodes == null }
 
 private val String.isViewable: Boolean
        get() = Configuration.Current.isDevMode || !(endsWith(".wip") || endsWith(".old"))