package link.roadio.riff.player.storage import android.icu.lang.UCharacter import android.icu.text.BreakIterator import android.icu.text.Normalizer2 import java.util.Locale internal fun normalizedPlaylistName(name: String): String { val trimmed = name.trim() require(trimmed.isNotEmpty() && graphemeCount(trimmed) <= PlayerStateStore.MAX_STRING_LENGTH) return UCharacter.foldCase(Normalizer2.getNFKCInstance().normalize(trimmed), true) } internal fun graphemeCount(value: String): Int = BreakIterator.getCharacterInstance(Locale.ROOT).let { it.setText(value) var count = 0 while (it.next() != BreakIterator.DONE ) { count++ } count } internal fun bookCollectionName(title: String): String { val source = title.trim().ifBlank { "Book" } val prefix = "Bookmarks for " val iterator = BreakIterator.getCharacterInstance(Locale.ROOT).apply { setText(source) } var end = 0 repeat(PlayerStateStore.MAX_STRING_LENGTH - graphemeCount(prefix)) { val next = iterator.next() if (next == BreakIterator.DONE ) { return prefix + source } end = next } return prefix + source.substring(0, end).trimEnd() }