Skip to content

Commit 1eab9ff

Browse files
authored
Merge pull request #1 from devkanro/master
Enhance handling for digit characters
2 parents 4b77bb0 + e8e3222 commit 1eab9ff

File tree

6 files changed

+38
-17
lines changed

6 files changed

+38
-17
lines changed

src/commonMain/kotlin/net/pearx/kasechange/CharUtils.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
package net.pearx.kasechange
99

1010
internal expect fun Char.isUpperCasePlatform(): Boolean
11-
internal expect fun Char.isLowerCasePlatform(): Boolean
11+
internal expect fun Char.isLowerCasePlatform(): Boolean
12+
internal expect fun Char.isDigitPlatform(): Boolean

src/commonMain/kotlin/net/pearx/kasechange/splitter/WordSplitter.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,29 @@
77

88
package net.pearx.kasechange.splitter
99

10+
import net.pearx.kasechange.isDigitPlatform
1011
import net.pearx.kasechange.isLowerCasePlatform
1112
import net.pearx.kasechange.isUpperCasePlatform
1213

1314
private val BOUNDARIES = arrayOf(' ', '-', '_', '.')
1415

1516
private fun StringBuilder.toStringAndClear() = toString().also { clear() }
1617

18+
private fun Char.isDigitOrUpperCase(): Boolean = this.isUpperCasePlatform() || this.isDigitPlatform()
19+
1720
/**
1821
* Splits a string to multiple words by using the following rules:
1922
* - All ' ', '-', '_', '.' characters are considered word boundaries.
2023
* - If a lowercase character is followed by an uppercase character, a word boundary is considered to be prior to the uppercase character.
2124
* - If multiple uppercase characters are followed by a lowercase character, a word boundary is considered to be prior to the last uppercase character.
25+
* - Digit characters handle same as uppercase characters.
2226
*
2327
* Examples:
2428
* - XMLBufferedReader => XML|Buffered|Reader
2529
* - newFile => new|File
2630
* - net.pearx.lib => net|pearx|lib
2731
* - NewDataClass => New|Data|Class
32+
* - UInt32Value => U|Int|32|Value
2833
*/
2934
fun String.splitToWords(): List<String> = mutableListOf<String>().also { list ->
3035
val word = StringBuilder()
@@ -34,9 +39,9 @@ fun String.splitToWords(): List<String> = mutableListOf<String>().also { list ->
3439
list.add(word.toStringAndClear())
3540
}
3641
else {
37-
if (char.isUpperCasePlatform()) {
42+
if (char.isDigitOrUpperCase()) {
3843
if ((index > 0 && this[index - 1].isLowerCasePlatform()) ||
39-
(index > 0 && index < length - 1 && this[index - 1].isUpperCasePlatform() && this[index + 1].isLowerCasePlatform())) {
44+
(index > 0 && index < length - 1 && this[index - 1].isDigitOrUpperCase() && this[index + 1].isLowerCasePlatform())) {
4045
list.add(word.toStringAndClear())
4146
}
4247
}

src/commonTest/kotlin/net/pearx/kasechange/test/ComplexTest.kt

+22-12
Original file line numberDiff line numberDiff line change
@@ -7,63 +7,73 @@
77

88
package net.pearx.kasechange.test
99

10-
import net.pearx.kasechange.*
10+
import net.pearx.kasechange.toCamelCase
11+
import net.pearx.kasechange.toDotCase
12+
import net.pearx.kasechange.toKebabCase
13+
import net.pearx.kasechange.toLowerSpaceCase
14+
import net.pearx.kasechange.toPascalCase
15+
import net.pearx.kasechange.toScreamingSnakeCase
16+
import net.pearx.kasechange.toSnakeCase
17+
import net.pearx.kasechange.toTitleCase
18+
import net.pearx.kasechange.toTrainCase
19+
import net.pearx.kasechange.toUpperDotCase
20+
import net.pearx.kasechange.toUpperSpaceCase
1121
import kotlin.test.Test
1222
import kotlin.test.assertEquals
1323

1424
class ComplexTest {
1525
@Test
1626
fun testCamel() {
17-
assertEquals("someString", "Some String".toCamelCase())
27+
assertEquals("someStringWith123Numbers", "Some String With 123 Numbers".toCamelCase())
1828
}
1929

2030
@Test
2131
fun testPascal() {
22-
assertEquals("SomeString", "Some String".toPascalCase())
32+
assertEquals("SomeStringWith123Numbers", "Some String With 123 Numbers".toPascalCase())
2333
}
2434

2535
@Test
2636
fun testSnake() {
27-
assertEquals("some_string", "Some String".toSnakeCase())
37+
assertEquals("some_string_with_123_numbers", "Some String With 123 Numbers".toSnakeCase())
2838
}
2939

3040
@Test
3141
fun testScreamingSnake() {
32-
assertEquals("SOME_STRING", "Some String".toScreamingSnakeCase())
42+
assertEquals("SOME_STRING_WITH_123_NUMBERS", "Some String With 123 Numbers".toScreamingSnakeCase())
3343
}
3444

3545
@Test
3646
fun testKebab() {
37-
assertEquals("some-string", "Some String".toKebabCase())
47+
assertEquals("some-string-with-123-numbers", "Some String With 123 Numbers".toKebabCase())
3848
}
3949

4050
@Test
4151
fun testTrain() {
42-
assertEquals("SOME-STRING", "Some String".toTrainCase())
52+
assertEquals("SOME-STRING-WITH-123-NUMBERS", "Some String With 123 Numbers".toTrainCase())
4353
}
4454

4555
@Test
4656
fun testLowerSpace() {
47-
assertEquals("some string", "Some String".toLowerSpaceCase())
57+
assertEquals("some string with 123 numbers", "Some String With 123 Numbers".toLowerSpaceCase())
4858
}
4959

5060
@Test
5161
fun testUpperSpace() {
52-
assertEquals("SOME STRING", "Some String".toUpperSpaceCase())
62+
assertEquals("SOME STRING WITH 123 NUMBERS", "Some String With 123 Numbers".toUpperSpaceCase())
5363
}
5464

5565
@Test
5666
fun testTitle() {
57-
assertEquals("Some String", "some string".toTitleCase())
67+
assertEquals("Some String With 123 Numbers", "some string with 123 numbers".toTitleCase())
5868
}
5969

6070
@Test
6171
fun testDot() {
62-
assertEquals("some.string", "Some String".toDotCase())
72+
assertEquals("some.string.with.123.numbers", "Some String With 123 Numbers".toDotCase())
6373
}
6474

6575
@Test
6676
fun testDotUpper() {
67-
assertEquals("SOME.STRING", "Some String".toUpperDotCase())
77+
assertEquals("SOME.STRING.WITH.123.NUMBERS", "Some String With 123 Numbers".toUpperDotCase())
6878
}
6979
}

src/commonTest/kotlin/net/pearx/kasechange/test/SplitToWordsTest.kt

+1
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ class SplitToWordsTest {
3030
assertEquals(listOf("XMLHTTP"), "XMLHTTP".splitToWords())
3131
assertEquals(listOf("S", "Class", "C"), "SClassC".splitToWords())
3232
assertEquals(listOf("XML", "Http", "Request", "JSON"), "XMLHttpRequestJSON".splitToWords())
33+
assertEquals(listOf("U", "Int", "32", "Value"), "UInt32Value".splitToWords())
3334
}
3435
}

src/jsMain/kotlin/net/pearx/kasechange/CharUtils.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ package net.pearx.kasechange
99

1010
internal actual fun Char.isUpperCasePlatform(): Boolean = toUpperCase() == this && toLowerCase() != this
1111

12-
internal actual fun Char.isLowerCasePlatform(): Boolean = toLowerCase() == this && toUpperCase() != this
12+
internal actual fun Char.isLowerCasePlatform(): Boolean = toLowerCase() == this && toUpperCase() != this
13+
14+
internal actual fun Char.isDigitPlatform(): Boolean = this in '0'..'9'

src/jvmMain/kotlin/net/pearx/kasechange/CharUtils.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ package net.pearx.kasechange
1010

1111
internal actual fun Char.isUpperCasePlatform(): Boolean = isUpperCase()
1212

13-
internal actual fun Char.isLowerCasePlatform(): Boolean = isLowerCase()
13+
internal actual fun Char.isLowerCasePlatform(): Boolean = isLowerCase()
14+
15+
internal actual fun Char.isDigitPlatform(): Boolean = isDigit()

0 commit comments

Comments
 (0)