Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A Kotlin script to normalize hex colour representations ("#RGB", "#ARGB", "#RRGGBB", "#AARRGGBB") into "#AARRGGBB", useful for when you're trying to find all unique colours in your app
/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* Sebastiano Poggi wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Seb
* ----------------------------------------------------------------------------
* Feel free to attribute this code in compiled products if you feel like it,
* but it's not required.
*/
import java.util.Locale
import kotlin.text.toRegex
private val colorHexRegex = "#?([0-9a-f]{3,8})".toRegex(RegexOption.IGNORE_CASE)
fun normalizeColorHex(colorHex: String): String {
val matchResult = colorHexRegex.matchEntire(colorHex)
?: throw IllegalArgumentException("The provided colorHex '$colorHex' is not a valid color hex")
val hexValue = matchResult.groups[1]!!.value.toLowerCase(Locale.US)
val normalizedArgb = when (hexValue.length) {
3 -> expandToTwoDigitsPerComponent("f$hexValue")
4 -> expandToTwoDigitsPerComponent(hexValue)
6 -> "ff$hexValue"
8 -> hexValue
else -> throw IllegalArgumentException("The provided colorHex '$colorHex' is not in a supported format")
}
return "#$normalizedArgb"
}
fun expandToTwoDigitsPerComponent(hexValue: String) =
hexValue.asSequence()
.map { "$it$it" }
.reduce { accumulatedHex, component -> accumulatedHex + component }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment