RosettaCodeData/Task/Camel-case-and-snake-case/Mathematica/camel-case-and-snake-case.math
2025-08-11 18:05:26 -07:00

85 lines
2.6 KiB
Text

(* String case conversion functions in Mathematica *)
snakeToCamelCase[nam_String, sep_String : "[_]+", lcmiddle_ : False] := Module[{words},
If[nam == "", Return[nam]];
words = StringSplit[StringTrim[nam], RegularExpression[sep]];
If[lcmiddle, words = ToLowerCase /@ words];
words[[2 ;;]] = StringJoin[ToUpperCase[StringTake[#, 1]], StringDrop[#, 1]] & /@ Select[words[[2 ;;]], StringLength[#] > 0 &];
StringJoin[words]
]
spaceToCamelCase[nam_String] := snakeToCamelCase[nam, "\\s+"]
kebabToCamelCase[nam_String] := snakeToCamelCase[nam, "[\\-]+"]
periodToCamelCase[nam_String] := snakeToCamelCase[nam, "[\\.]+"]
allsepToCamelCase[nam_String] := snakeToCamelCase[nam, "[ \\-_\\.]+"]
lowermiddleAllsepToCamelCase[nam_String] := snakeToCamelCase[nam, "[ \\-_\\.]+", True]
camelToSnakeCase[nam_String, sep_String : "_", allsep_String : "[_]+", lcmiddle_ : True] := Module[{result, sep1, words},
result = StringReplace[StringTrim[nam], RegularExpression["([A-Z]+)"] -> sep <> "$1"];
sep1 = If[sep == ".", "\\.", sep];
If[lcmiddle,
words = Select[StringSplit[result, sep1], StringLength[#] > 0 &];
result = StringRiffle[ToLowerCase /@ words, sep],
words = Select[StringSplit[result, sep1], StringLength[#] > 0 &];
result = StringRiffle[StringJoin[ToLowerCase[StringTake[#, 1]], StringDrop[#, 1]] & /@ words, sep]
];
StringReplace[result, RegularExpression[allsep] -> sep]
]
preserveMidcapsCamelToSnakeCase[nam_String] := camelToSnakeCase[nam, "_", "[_]+", False]
allsepToSnakeCase[nam_String] := camelToSnakeCase[nam, "_", "[ \\-\\._]+"]
allsepToKebabCase[nam_String] := camelToSnakeCase[nam, "-", "[ \\-\\._]+"]
allsepToSpaceCase[nam_String] := camelToSnakeCase[nam, " ", "[ \\-\\._]+"]
allsepToPeriodCase[nam_String] := camelToSnakeCase[nam, ".", "[ \\-\\._]+"]
allsepToSlashCase[nam_String] := camelToSnakeCase[nam, "/", "[ \\-\\._]+"]
(* Test the functions *)
testFunctions = {
snakeToCamelCase,
spaceToCamelCase,
kebabToCamelCase,
periodToCamelCase,
allsepToCamelCase,
lowermiddleAllsepToCamelCase,
camelToSnakeCase,
preserveMidcapsCamelToSnakeCase,
allsepToSnakeCase,
allsepToKebabCase,
allsepToSpaceCase,
allsepToPeriodCase,
allsepToSlashCase
};
testStrings = {
"snakeCase",
"snake_case",
"snake-case",
"snake case",
"snake CASE",
"snake.case",
"variable_10_case",
"variable10Case",
"ɛrgo rE tHis",
"hurry-up-joe!",
"c://my-docs/happy_Flag-Day/12.doc",
" spaces "
};
Do[
Print["Testing function ", f, ":"];
Do[
Print[StringPadLeft[testString, 36], " => ", f[testString]],
{testString, testStrings}
];
Print[""],
{f, testFunctions}
]