Skip to content

Commit ee5f3a4

Browse files
committed
fix: camel to camel and snake to snake
1 parent fd2d850 commit ee5f3a4

File tree

2 files changed

+77
-14
lines changed

2 files changed

+77
-14
lines changed

OneBot-Interface/Core/Util/StringUtils.cs

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,34 @@ public enum CamelCaseType
1616
{
1717
Upper,
1818

19-
Lower
19+
Lower,
20+
21+
None,
2022
}
2123

2224
public enum CaseType
2325
{
2426
Lower,
2527

26-
Upper
28+
Upper,
29+
30+
None,
2731
}
2832

33+
private static CaseType EvaluateCaseType(char c)
34+
{
35+
if (char.IsUpper(c))
36+
{
37+
return CaseType.Upper;
38+
}
39+
40+
if (char.IsLower(c))
41+
{
42+
return CaseType.Lower;
43+
}
44+
45+
return CaseType.None;
46+
}
2947

3048
public static bool IsNullOrEmpty(string? value)
3149
=> string.IsNullOrEmpty(value);
@@ -80,9 +98,14 @@ public static string ToCamelCase(string s, CamelCaseType caseType, string[]? loc
8098
char[] result = new char[src.Length - ulCnt];
8199
bool fstWord = true, fstLetter = true;
82100
string tmp = "";
101+
83102
for (int i = 0, j = 0; i <= src.Length; i++)
84103
{
85-
if (i == src.Length || src[i] == Underline || src[i] == Dash || char.IsSeparator(src[i]))
104+
if (i == src.Length ||
105+
src[i] == Underline || src[i] == Dash ||
106+
char.IsSeparator(src[i]) ||
107+
(i > 0 && char.IsUpper(src[i]))
108+
)
86109
{
87110
if (lockedWords != null && lockedWords.Contains(tmp))
88111
{
@@ -95,13 +118,21 @@ public static string ToCamelCase(string s, CamelCaseType caseType, string[]? loc
95118
result[j - tmp.Length + k] = char.ToLower(result[j - tmp.Length + k]);
96119
}
97120
}
121+
98122
if (i < src.Length)
99123
{
100124
if (src[i] == Underline || src[i] == Dash)
101125
{
102126
fstLetter = true;
103127
tmp = "";
104128
}
129+
else if (i > 0 && char.IsUpper(src[i]))
130+
{
131+
fstLetter = false;
132+
result[j] = src[i];
133+
tmp = "" + src[i];
134+
j++;
135+
}
105136
else
106137
{
107138
fstWord = true;
@@ -128,6 +159,7 @@ public static string ToCamelCase(string s, CamelCaseType caseType, string[]? loc
128159
{
129160
result[j] = char.ToLower(src[i]);
130161
}
162+
131163
tmp += char.ToUpper(src[i]);
132164
j++;
133165
}
@@ -164,20 +196,31 @@ public static string ToUpperSnakeCase(string s, string[]? lockedWords = null)
164196
/// <returns></returns>
165197
public static string ToSeparatedCase(string s, char separator, CaseType caseType, string[]? lockedWords = null)
166198
{
167-
StringBuilder sb = new StringBuilder();
199+
StringBuilder sb = new StringBuilder(16);
168200
char[] src = s.ToCharArray();
169-
201+
170202
int t = 0;
203+
var separated = false;
204+
171205
for (int i = 0; i < src.Length; i++, t++)
172206
{
207+
173208
if (char.IsSeparator(src[i]))
174209
{
175210
sb.Append(src[i]);
176211
t = -1;
177212
continue;
178213
}
179-
if (char.IsUpper(src[i]))
214+
215+
if (src[i] == Dash || src[i] == Underline)
216+
{
217+
separated = true;
218+
continue;
219+
}
220+
221+
if (separated || char.IsUpper(src[i]))
180222
{
223+
separated = false;
181224
if (lockedWords != null)
182225
{
183226
bool skip = false;
@@ -192,6 +235,7 @@ public static string ToSeparatedCase(string s, char separator, CaseType caseType
192235
break;
193236
}
194237
}
238+
195239
if (match)
196240
{
197241
if (t != 0)
@@ -204,21 +248,29 @@ public static string ToSeparatedCase(string s, char separator, CaseType caseType
204248
sb.Append(char.ToLower(src[i]));
205249
i++;
206250
}
251+
207252
i--;
208253
skip = true;
209254
break;
210255
}
211256
}
257+
212258
if (skip)
213259
continue;
214260
}
261+
215262
if (t != 0)
216263
sb.Append(separator);
217264
}
265+
218266
if (caseType == CaseType.Upper)
267+
{
219268
sb.Append(char.ToUpper(src[i]));
269+
}
220270
else
271+
{
221272
sb.Append(char.ToLower(src[i]));
273+
}
222274
}
223275

224276
return sb.ToString();

OneBot-UnitTest/UnitTest/Util/StringUtilsTest.cs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,33 @@ public void ToSnakeCaseTest()
3939

4040
Assert.AreEqual("one_another", StringUtils.ToSnakeCase("oneAnother", StringUtils.CaseType.Lower, lockedWords));
4141
Assert.AreEqual("ONE_ANOTHER", StringUtils.ToSnakeCase("oneAnother", StringUtils.CaseType.Upper, lockedWords));
42+
43+
Assert.AreEqual("ONE_ANOTHER", StringUtils.ToSnakeCase("one-Another", StringUtils.CaseType.Upper, lockedWords));
44+
Assert.AreEqual("ONE_ANOTHER", StringUtils.ToSnakeCase("one_Another", StringUtils.CaseType.Upper, lockedWords));
45+
Assert.AreEqual("ONE_ANOTHER", StringUtils.ToSnakeCase("one_-Another", StringUtils.CaseType.Upper, lockedWords));
4246
}
4347

4448
[TestMethod]
4549
public void ToLowerCamelTest()
4650
{
4751
Assert.AreEqual("userQQ", StringUtils.ToCamelCase("user_qq", StringUtils.CamelCaseType.Lower, lockedWords));
52+
Assert.AreEqual("userQQ", StringUtils.ToCamelCase("userQQ", StringUtils.CamelCaseType.Lower, lockedWords));
53+
Assert.AreEqual("userQQ", StringUtils.ToCamelCase("userQq", StringUtils.CamelCaseType.Lower, lockedWords));
4854
Assert.AreEqual("userID", StringUtils.ToCamelCase("user_id", StringUtils.CamelCaseType.Lower, lockedWords));
4955
Assert.AreEqual("qqID", StringUtils.ToCamelCase("qq_id", StringUtils.CamelCaseType.Lower, lockedWords));
5056
Assert.AreEqual("icelolly", StringUtils.ToCamelCase("icelolly", StringUtils.CamelCaseType.Lower));
5157
Assert.AreEqual("icelolly", StringUtils.ToCamelCase("Icelolly", StringUtils.CamelCaseType.Lower));
52-
Assert.AreEqual("icelolly", StringUtils.ToCamelCase("IceLOlly", StringUtils.CamelCaseType.Lower));
58+
Assert.AreEqual("iceLOlly", StringUtils.ToCamelCase("IceLOlly", StringUtils.CamelCaseType.Lower));
5359
Assert.AreEqual("icelollyDress", StringUtils.ToCamelCase("icelolly_dress", StringUtils.CamelCaseType.Lower));
5460
Assert.AreEqual("icelollyDress2", StringUtils.ToCamelCase("icelolly_dress2", StringUtils.CamelCaseType.Lower));
55-
Assert.AreEqual("icelollyDress", StringUtils.ToCamelCase("ICelolly_DRess", StringUtils.CamelCaseType.Lower));
56-
Assert.AreEqual("icelollyDress daiSuki", StringUtils.ToCamelCase("iCelolly_dRess dai_suki", StringUtils.CamelCaseType.Lower));
57-
Assert.AreEqual("icelollyDress daiSuki404", StringUtils.ToCamelCase("iCelolly_dRess dai_suki_404", StringUtils.CamelCaseType.Lower));
61+
Assert.AreEqual("icelollyDress2", StringUtils.ToCamelCase("icelolly_dress_2", StringUtils.CamelCaseType.Lower));
62+
63+
// ambiguous case, not supports
64+
Assert.AreEqual("iCelollyDRess", StringUtils.ToCamelCase("ICelolly_DRess", StringUtils.CamelCaseType.Lower));
65+
66+
Assert.AreEqual("iCelollyDRess daiSuki", StringUtils.ToCamelCase("iCelolly_dRess dai_suki", StringUtils.CamelCaseType.Lower));
67+
Assert.AreEqual("iCelollyDRess daiSuki404", StringUtils.ToCamelCase("iCelolly_dRess dai_suki_404", StringUtils.CamelCaseType.Lower));
68+
Assert.AreEqual("iCelollyDRess", StringUtils.ToCamelCase("iCelolly_----dRess", StringUtils.CamelCaseType.Lower));
5869
}
5970

6071
[TestMethod]
@@ -65,11 +76,11 @@ public void ToUpperCamelTest()
6576
Assert.AreEqual("QQID", StringUtils.ToCamelCase("qq_id", StringUtils.CamelCaseType.Upper, lockedWords));
6677
Assert.AreEqual("Icelolly", StringUtils.ToCamelCase("icelolly", StringUtils.CamelCaseType.Upper));
6778
Assert.AreEqual("Icelolly", StringUtils.ToCamelCase("Icelolly", StringUtils.CamelCaseType.Upper));
68-
Assert.AreEqual("Icelolly", StringUtils.ToCamelCase("IceLOlly", StringUtils.CamelCaseType.Upper));
79+
Assert.AreEqual("IceLOlly", StringUtils.ToCamelCase("IceLOlly", StringUtils.CamelCaseType.Upper));
6980
Assert.AreEqual("IcelollyDress", StringUtils.ToCamelCase("icelolly_dress", StringUtils.CamelCaseType.Upper));
7081
Assert.AreEqual("IcelollyDress2", StringUtils.ToCamelCase("icelolly_dress2", StringUtils.CamelCaseType.Upper));
71-
Assert.AreEqual("IcelollyDress", StringUtils.ToCamelCase("ICelolly_DRess", StringUtils.CamelCaseType.Upper));
72-
Assert.AreEqual("IcelollyDress DaiSuki", StringUtils.ToCamelCase("iCelolly_dRess dai_suki", StringUtils.CamelCaseType.Upper));
73-
Assert.AreEqual("IcelollyDress DaiSuki404", StringUtils.ToCamelCase("iCelolly_dRess dai_suki_404", StringUtils.CamelCaseType.Upper));
82+
Assert.AreEqual("ICelollyDRess", StringUtils.ToCamelCase("ICelolly_DRess", StringUtils.CamelCaseType.Upper));
83+
Assert.AreEqual("ICelollyDRess DaiSuki", StringUtils.ToCamelCase("iCelolly_dRess dai_suki", StringUtils.CamelCaseType.Upper));
84+
Assert.AreEqual("ICelollyDRess DaiSuki404", StringUtils.ToCamelCase("iCelolly_dRess dai_suki_404", StringUtils.CamelCaseType.Upper));
7485
}
7586
}

0 commit comments

Comments
 (0)