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>?)
}?.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"))