Regex numbers and common thumb
This commit is contained in:
parent
2e34933c86
commit
7d8cdba6a9
1 changed files with 20 additions and 33 deletions
|
@ -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 }
|
||||||
|
|
Loading…
Reference in a new issue