Cases.kt

  1. package com.hexagonkt.core.text

  2. val CAMEL_CASE: Regex by lazy { Regex("[a-z]+([A-Z][a-z0-9]+)+") }
  3. val PASCAL_CASE: Regex by lazy { Regex("([A-Z][a-z0-9]+)+") }
  4. val SNAKE_CASE: Regex by lazy { Regex("[_A-Za-z]+[_A-Za-z0-9]*") }
  5. val KEBAB_CASE: Regex by lazy { Regex("[\\-A-Za-z]+[\\-A-Za-z0-9]*") }

  6. fun String.camelToWords(): List<String> =
  7.     split("(?=\\p{Upper}\\p{Lower})".toRegex()).toWords()

  8. fun String.snakeToWords(): List<String> =
  9.     split("_").toWords()

  10. fun String.kebabToWords(): List<String> =
  11.     split("-").toWords()

  12. fun List<String>.toWords(): List<String> =
  13.     filter(String::isNotEmpty).map(String::lowercase)

  14. fun List<String>.wordsToCamel(): String =
  15.     wordsToPascal().replaceFirstChar(Char::lowercase)

  16. fun List<String>.wordsToPascal(): String =
  17.     joinToString("") { it.replaceFirstChar(Char::uppercase) }

  18. fun List<String>.wordsToSnake(): String =
  19.     joinToString("_")

  20. fun List<String>.wordsToKebab(): String =
  21.     joinToString("-")

  22. fun List<String>.wordsToTitle(): String =
  23.     joinToString(" ") { it.replaceFirstChar(Char::uppercase) }

  24. fun List<String>.wordsToSentence(): String =
  25.     joinToString(" ").replaceFirstChar(Char::uppercase)

  26. /**
  27.  * Transform the target string from snake case to camel case.
  28.  */
  29. fun String.snakeToCamel(): String =
  30.     snakeToWords().wordsToCamel()

  31. fun Enum<*>.toWords(): String =
  32.     toString().lowercase().replace("_", " ")

  33. /**
  34.  * Transform the target string from camel case to snake case.
  35.  */
  36. fun String.camelToSnake(): String =
  37.     camelToWords().wordsToSnake()