Regex numbers and common thumb

This commit is contained in:
Chris Palmeri 2023-04-12 00:26:24 -05:00
parent 2e34933c86
commit 7d8cdba6a9
No known key found for this signature in database
GPG key ID: D9D1B9464F43E5B1

View file

@ -349,7 +349,6 @@ interface Playlist : MusicParent {
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class SortName(name: String, musicSettings: MusicSettings) : Comparable<SortName> { class SortName(name: String, musicSettings: MusicSettings) : Comparable<SortName> {
private val number: Int?
private val collationKey: CollationKey private val collationKey: CollationKey
val thumbString: String? val thumbString: String?
@ -366,50 +365,38 @@ class SortName(name: String, musicSettings: MusicSettings) : Comparable<SortName
} }
} }
// Parse out numeric portions of the title and use those for sorting, if applicable. // TODO: replace starting ' " ... (
when (val numericEnd = sortName.indexOfFirst { !it.isDigit() }) {
// No numeric component. // Zero pad the first number to (an arbitrary) five digits for better sorting
0 -> number = null // Will also accept commas in between digits and strip them
// Whole title is numeric. sortName =
-1 -> { sortName.replace("""(\d+[\d,]+\d+|\d+)(.*)""".toRegex()) {
number = sortName.toIntOrNull() val (firstNumber, remainingText) = it.destructured
sortName = "" val onlyDigits = firstNumber.filter { c -> c.isDigit() }
onlyDigits.padStart(5, '0') + remainingText
} }
// Part of the title is numeric.
else -> {
number = sortName.slice(0 until numericEnd).toIntOrNull()
sortName = sortName.slice(numericEnd until sortName.length)
}
}
} else {
number = null
} }
collationKey = COLLATOR.getCollationKey(sortName) collationKey = COLLATOR.getCollationKey(sortName)
// Keep track of a string to use in the thumb view. // Keep track of a string to use in the thumb view.
// Simply show '#' for everything before 'A'
// TODO: This needs to be moved elsewhere. // TODO: This needs to be moved elsewhere.
thumbString = (number?.toString() ?: collationKey?.run { sourceString.first().uppercase() }) thumbString =
collationKey?.run {
var thumbChar = sourceString.firstOrNull()
if (thumbChar?.isLetter() != true) thumbChar = '#'
thumbChar.uppercase()
}
} }
override fun toString(): String = number?.toString() ?: collationKey.sourceString override fun toString(): String = collationKey.sourceString
override fun compareTo(other: SortName) = override fun compareTo(other: SortName) = collationKey.compareTo(other.collationKey)
when {
number != null && other.number != null -> number.compareTo(other.number)
number != null && other.number == null -> -1 // a < b
number == null && other.number != null -> 1 // a > b
else -> collationKey.compareTo(other.collationKey)
}
override fun equals(other: Any?) = override fun equals(other: Any?) = other is SortName && collationKey == other.collationKey
other is SortName && number == other.number && collationKey == other.collationKey
override fun hashCode(): Int { override fun hashCode(): Int = collationKey.hashCode()
var hashCode = collationKey.hashCode()
if (number != null) hashCode = 31 * hashCode + number
return hashCode
}
private companion object { private companion object {
val COLLATOR: Collator = Collator.getInstance().apply { strength = Collator.PRIMARY } val COLLATOR: Collator = Collator.getInstance().apply { strength = Collator.PRIMARY }