Skip to content

Commit bb6e2d0

Browse files
Add string transformer functions
1 parent f873ef3 commit bb6e2d0

File tree

9 files changed

+192
-24
lines changed

9 files changed

+192
-24
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44

55
### Added
66

7+
- `String.transformstring` function
8+
- `String.TRANSFORMSTRING` function
9+
- `String.transformString` function
10+
- `String.TransformString` function
11+
- `String.transform_string` function
12+
- `String.TRANSFORM_STRING` function
13+
- `String.transform_hyphen_string` function
14+
- `String.TRANSFORM_HYPHEN_STRING` function
15+
- `String.tRaNsFoRmStRiNg` function
16+
717
### Changed
818

919
- `@IgnoreDARWIN` to `@IgnoreAPPLE`

kotlin-stdlib/api/android/kotlin-stdlib.api

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,15 @@ public final class com/javiersc/kotlin/stdlib/StringsKt {
176176
public static final fun replace (Ljava/lang/String;[Lkotlin/Pair;)Ljava/lang/String;
177177
}
178178

179+
public final class com/javiersc/kotlin/stdlib/StringsTransformKt {
180+
public static final fun TRANSFORMSTRING (Ljava/lang/String;)Ljava/lang/String;
181+
public static final fun TRANSFORM_HYPHEN_STRING (Ljava/lang/String;)Ljava/lang/String;
182+
public static final fun TRANSFORM_STRING (Ljava/lang/String;)Ljava/lang/String;
183+
public static final fun TransformString (Ljava/lang/String;)Ljava/lang/String;
184+
public static final fun tRaNsFoRmStRiNg (Ljava/lang/String;)Ljava/lang/String;
185+
public static final fun transformString (Ljava/lang/String;)Ljava/lang/String;
186+
public static final fun transform_hyphen_string (Ljava/lang/String;)Ljava/lang/String;
187+
public static final fun transform_string (Ljava/lang/String;)Ljava/lang/String;
188+
public static final fun transformstring (Ljava/lang/String;)Ljava/lang/String;
189+
}
190+

kotlin-stdlib/api/jvm/kotlin-stdlib.api

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,15 @@ public final class com/javiersc/kotlin/stdlib/StringsKt {
176176
public static final fun replace (Ljava/lang/String;[Lkotlin/Pair;)Ljava/lang/String;
177177
}
178178

179+
public final class com/javiersc/kotlin/stdlib/StringsTransformKt {
180+
public static final fun TRANSFORMSTRING (Ljava/lang/String;)Ljava/lang/String;
181+
public static final fun TRANSFORM_HYPHEN_STRING (Ljava/lang/String;)Ljava/lang/String;
182+
public static final fun TRANSFORM_STRING (Ljava/lang/String;)Ljava/lang/String;
183+
public static final fun TransformString (Ljava/lang/String;)Ljava/lang/String;
184+
public static final fun tRaNsFoRmStRiNg (Ljava/lang/String;)Ljava/lang/String;
185+
public static final fun transformString (Ljava/lang/String;)Ljava/lang/String;
186+
public static final fun transform_hyphen_string (Ljava/lang/String;)Ljava/lang/String;
187+
public static final fun transform_string (Ljava/lang/String;)Ljava/lang/String;
188+
public static final fun transformstring (Ljava/lang/String;)Ljava/lang/String;
189+
}
190+

kotlin-stdlib/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ hubdle {
1717
multiplatform {
1818
features {
1919
extendedStdlib.isEnabled.set(false)
20+
kotest.isEnabled.set(false)
2021
}
2122

2223
common()
2324
android()
2425
apple {
2526
ios {
26-
iosArm32()
2727
iosArm64()
2828
iosSimulatorArm64()
2929
iosX64()
@@ -42,7 +42,6 @@ hubdle {
4242
watchosArm64()
4343
watchosSimulatorArm64()
4444
watchosX64()
45-
watchosX86()
4645
}
4746
}
4847
jvm()
@@ -52,14 +51,10 @@ hubdle {
5251
nodejs()
5352
}
5453
linux {
55-
linuxArm32Hfp()
5654
linuxArm64()
57-
linuxMips32()
58-
linuxMipsel32()
5955
linuxX64()
6056
}
6157
mingw {
62-
mingwX86()
6358
mingwX64()
6459
}
6560
native()
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.javiersc.kotlin.stdlib
2+
3+
// original idea source:
4+
// https://github.com/hsz/transform-string/
5+
6+
public fun String.transformstring(): String = prepare("").lowercase()
7+
8+
public fun String.TRANSFORMSTRING(): String = prepare("").uppercase()
9+
10+
public fun String.transformString(): String {
11+
val data = prepare(" ")
12+
return data
13+
.mapIndexed { index, char ->
14+
val isAfterWhitespace = data.getOrNull(index - 1)?.isWhitespace() ?: false
15+
when {
16+
isAfterWhitespace -> char.uppercaseChar()
17+
else -> char.lowercaseChar()
18+
}
19+
}
20+
.filterNot(Char::isWhitespace)
21+
.joinToString("")
22+
.remove(" ")
23+
}
24+
25+
public fun String.TransformString(): String {
26+
val data = prepare(" ")
27+
return data
28+
.mapIndexed { index, char ->
29+
val isAfterWhitespace = data.getOrNull(index - 1)?.isWhitespace() ?: false
30+
when {
31+
isAfterWhitespace -> char.uppercaseChar()
32+
else -> char.lowercaseChar()
33+
}
34+
}
35+
.filterNot(Char::isWhitespace)
36+
.joinToString("")
37+
.remove(" ")
38+
.capitalize()
39+
}
40+
41+
public fun String.transform_string(): String = prepare("_").lowercase()
42+
43+
public fun String.TRANSFORM_STRING(): String = prepare("_").uppercase()
44+
45+
public fun String.transform_hyphen_string(): String = prepare("-").lowercase()
46+
47+
public fun String.TRANSFORM_HYPHEN_STRING(): String = prepare("-").uppercase()
48+
49+
public fun String.tRaNsFoRmStRiNg(): String {
50+
var newStr = ""
51+
var shouldBeUpperCase = false
52+
forEach { str ->
53+
if (str.isLetter()) {
54+
newStr += if (shouldBeUpperCase) str.uppercase() else str.lowercase()
55+
shouldBeUpperCase = !shouldBeUpperCase
56+
} else newStr += str
57+
}
58+
return newStr
59+
}
60+
61+
private fun String.prepare(separator: String): String =
62+
replace("""((?<=\p{Ll})\p{Lu}|\p{Lu}(?=\p{Ll}))""".toRegex(), "$separator$1")
63+
.replace("""[\W_]""".toRegex(), separator)
64+
.removePrefix(separator)
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.javiersc.kotlin.stdlib
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
internal class StringsTransform {
7+
8+
@Test
9+
fun lowerCase() {
10+
assertEquals("foobar", "foo bar".transformstring())
11+
assertEquals("foobar", "foo-bar".transformstring())
12+
assertEquals("foobar", "foo_bar".transformstring())
13+
assertEquals("foobar", "FOO_BAR".transformstring())
14+
assertEquals("foobar", "FooBar".transformstring())
15+
}
16+
17+
@Test
18+
fun upperCase() {
19+
assertEquals("FOOBAR", "foo bar".TRANSFORMSTRING())
20+
assertEquals("FOOBAR", "foo-bar".TRANSFORMSTRING())
21+
assertEquals("FOOBAR", "foo_bar".TRANSFORMSTRING())
22+
assertEquals("FOOBAR", "FOO_BAR".TRANSFORMSTRING())
23+
assertEquals("FOOBAR", "FooBar".TRANSFORMSTRING())
24+
}
25+
26+
@Test
27+
fun camelCase() {
28+
assertEquals("fooBar", "foo bar".transformString())
29+
assertEquals("fooBar", "foo-bar".transformString())
30+
assertEquals("fooBar", "foo_bar".transformString())
31+
assertEquals("fooBar", "FOO_BAR".transformString())
32+
assertEquals("fooBar", "FooBar".transformString())
33+
}
34+
35+
@Test
36+
fun pascalCase() {
37+
assertEquals("FooBar", "foo bar".TransformString())
38+
assertEquals("FooBar", "foo-bar".TransformString())
39+
assertEquals("FooBar", "foo_bar".TransformString())
40+
assertEquals("FooBar", "FOO_BAR".TransformString())
41+
assertEquals("FooBar", "FooBar".TransformString())
42+
}
43+
44+
@Test
45+
fun lowerSnakeCase() {
46+
assertEquals("foo_bar", "foo bar".transform_string())
47+
assertEquals("foo_bar", "foo-bar".transform_string())
48+
assertEquals("foo_bar", "foo_bar".transform_string())
49+
assertEquals("foo_bar", "FOO_BAR".transform_string())
50+
assertEquals("foo_bar", "FooBar".transform_string())
51+
}
52+
53+
@Test
54+
fun upperSnakeCase() {
55+
assertEquals("FOO_BAR", "foo bar".TRANSFORM_STRING())
56+
assertEquals("FOO_BAR", "foo-bar".TRANSFORM_STRING())
57+
assertEquals("FOO_BAR", "foo_bar".TRANSFORM_STRING())
58+
assertEquals("FOO_BAR", "FOO_BAR".TRANSFORM_STRING())
59+
assertEquals("FOO_BAR", "FooBar".TRANSFORM_STRING())
60+
}
61+
62+
@Test
63+
fun lowerKebabCase() {
64+
assertEquals("foo-bar", "foo bar".transform_hyphen_string())
65+
assertEquals("foo-bar", "foo-bar".transform_hyphen_string())
66+
assertEquals("foo-bar", "foo_bar".transform_hyphen_string())
67+
assertEquals("foo-bar", "FOO_BAR".transform_hyphen_string())
68+
assertEquals("foo-bar", "FooBar".transform_hyphen_string())
69+
}
70+
71+
@Test
72+
fun upperKebabCase() {
73+
assertEquals("FOO-BAR", "foo bar".TRANSFORM_HYPHEN_STRING())
74+
assertEquals("FOO-BAR", "foo-bar".TRANSFORM_HYPHEN_STRING())
75+
assertEquals("FOO-BAR", "foo_bar".TRANSFORM_HYPHEN_STRING())
76+
assertEquals("FOO-BAR", "FOO_BAR".TRANSFORM_HYPHEN_STRING())
77+
assertEquals("FOO-BAR", "FooBar".TRANSFORM_HYPHEN_STRING())
78+
}
79+
80+
@Test
81+
fun alternativeCase() {
82+
assertEquals("fOo BaR", "foo bar".tRaNsFoRmStRiNg())
83+
assertEquals("fOo-BaR", "foo-bar".tRaNsFoRmStRiNg())
84+
assertEquals("fOo_BaR", "foo_bar".tRaNsFoRmStRiNg())
85+
assertEquals("fOo_BaR", "FOO_BAR".tRaNsFoRmStRiNg())
86+
assertEquals("fOoBaR", "FooBar".tRaNsFoRmStRiNg())
87+
assertEquals("1fOo-BaR", "1foo-bar".tRaNsFoRmStRiNg())
88+
assertEquals("fOo $ BaR", "foo $ bar".tRaNsFoRmStRiNg())
89+
}
90+
}

kotlin-test-junit/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ hubdle {
1414
multiplatform {
1515
features {
1616
extendedStdlib.isEnabled.set(false)
17+
kotest.isEnabled.set(false)
1718
}
1819

1920
common {
@@ -27,7 +28,6 @@ hubdle {
2728
android()
2829
apple {
2930
ios {
30-
iosArm32()
3131
iosArm64()
3232
iosSimulatorArm64()
3333
iosX64()
@@ -46,7 +46,6 @@ hubdle {
4646
watchosArm64()
4747
watchosSimulatorArm64()
4848
watchosX64()
49-
watchosX86()
5049
}
5150
}
5251
jvm()
@@ -56,14 +55,10 @@ hubdle {
5655
nodejs()
5756
}
5857
linux {
59-
linuxArm32Hfp()
6058
linuxArm64()
61-
linuxMips32()
62-
linuxMipsel32()
6359
linuxX64()
6460
}
6561
mingw {
66-
mingwX86()
6762
mingwX64()
6863
}
6964
native()

kotlin-test-junit5/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ hubdle {
1414
multiplatform {
1515
features {
1616
extendedStdlib.isEnabled.set(false)
17+
kotest.isEnabled.set(false)
1718
}
1819

1920
common {
@@ -35,7 +36,6 @@ hubdle {
3536

3637
apple {
3738
ios {
38-
iosArm32()
3939
iosArm64()
4040
iosSimulatorArm64()
4141
iosX64()
@@ -54,7 +54,6 @@ hubdle {
5454
watchosArm64()
5555
watchosSimulatorArm64()
5656
watchosX64()
57-
watchosX86()
5857
}
5958
}
6059
jvm {
@@ -70,14 +69,10 @@ hubdle {
7069
nodejs()
7170
}
7271
linux {
73-
linuxArm32Hfp()
7472
linuxArm64()
75-
linuxMips32()
76-
linuxMipsel32()
7773
linuxX64()
7874
}
7975
mingw {
80-
mingwX86()
8176
mingwX64()
8277
}
8378
native()

kotlin-test-testng/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ hubdle {
1414
multiplatform {
1515
features {
1616
extendedStdlib.isEnabled.set(false)
17+
kotest.isEnabled.set(false)
1718
}
1819

1920
common {
@@ -35,7 +36,6 @@ hubdle {
3536

3637
apple {
3738
ios {
38-
iosArm32()
3939
iosArm64()
4040
iosSimulatorArm64()
4141
iosX64()
@@ -54,7 +54,6 @@ hubdle {
5454
watchosArm64()
5555
watchosSimulatorArm64()
5656
watchosX64()
57-
watchosX86()
5857
}
5958
}
6059
jvm {
@@ -70,14 +69,10 @@ hubdle {
7069
nodejs()
7170
}
7271
linux {
73-
linuxArm32Hfp()
7472
linuxArm64()
75-
linuxMips32()
76-
linuxMipsel32()
7773
linuxX64()
7874
}
7975
mingw {
80-
mingwX86()
8176
mingwX64()
8277
}
8378
native()

0 commit comments

Comments
 (0)