diff options
| author | Mikkel Hjortshøj <fyoucon@gmail.com> | 2020-05-24 12:52:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-24 12:52:38 +0200 |
| commit | 732c745bb3a5e4528b5042628cd130d77e1cf5aa (patch) | |
| tree | 3d45ce084f61458ee4fac0e74a09a46db0beb37a | |
| parent | cbfbff7240d7ce649137cede82ccf07b78888179 (diff) | |
| parent | c035fc337fdaaa4abacbacb3c2ac1c6466f0d731 (diff) | |
Merge pull request #655 from ThisDrunkDane/master
Add case conversions by @dotbmp
| -rw-r--r-- | core/strings/strings.odin | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/core/strings/strings.odin b/core/strings/strings.odin index fd3808684..83bdbcca4 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -707,6 +707,192 @@ scrub :: proc(s: string, replacement: string, allocator := context.allocator) -> return to_string(b); } +to_snake_case :: proc(str: string, allocator := context.allocator) -> string { + buf := make_builder(allocator); + + last_chars: [2]rune; + for char, _ in str { + switch char { + case 'A'..'Z': + switch last_chars[1] { + case 'a'..'z', '0'..'9': + write_rune(&buf, '_'); + case 'A'..'Z': + write_rune(&buf, last_chars[1] + ('a'-'A')); + } + case 'a'..'z': + switch last_chars[1] { + case 'A'..'Z': + switch last_chars[0] { + case 'A'..'Z': + write_rune(&buf, '_'); + } + write_rune(&buf, last_chars[1] + ('a'-'A')); + case '0'..'9': + write_rune(&buf, '_'); + } + write_rune(&buf, char); + case '0'..'9': + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1] + ('a'-'A')); + write_rune(&buf, '_'); + case 'a'..'z': + write_rune(&buf, '_'); + } + write_rune(&buf, char); + case '_': + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1] + ('a'-'A')); + } + write_rune(&buf, char); + case: + unimplemented(); + } + + last_chars[0] = last_chars[1]; + last_chars[1] = char; + } + + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1] + ('a'-'A')); + } + + return to_string(buf); +} + +to_ada_case :: proc(str: string, allocator := context.allocator) -> string { + buf := make_builder(allocator); + + last_chars: [2]rune; + for char, _ in str { + switch char { + case 'A'..'Z': + switch last_chars[1] { + case 'a'..'z', '0'..'9': + write_rune(&buf, '_'); + case 'A'..'Z': + switch last_chars[0] { + case '_', '\x00': + write_rune(&buf, last_chars[1]); + case: + write_rune(&buf, last_chars[1] + ('a'-'A')); + } + } + case 'a'..'z': + switch last_chars[1] { + case 'A'..'Z': + switch last_chars[0] { + case 'A'..'Z': + write_rune(&buf, '_'); + write_rune(&buf, last_chars[1]); + case: + write_rune(&buf, last_chars[1]); + } + write_rune(&buf, char); + case '0'..'9': + write_rune(&buf, '_'); + write_rune(&buf, char); + case 'a'..'z': + write_rune(&buf, char); + case '_', '\x00': + write_rune(&buf, char - ('a'-'A')); + } + case '0'..'9': + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1] + ('a'-'A')); + write_rune(&buf, '_'); + case 'a'..'z': + write_rune(&buf, '_'); + } + write_rune(&buf, char); + case '_': + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1] + ('a'-'A')); + } + write_rune(&buf, char); + case: + write_rune(&buf, char); + } + + last_chars[0] = last_chars[1]; + last_chars[1] = char; + } + + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1] + ('a'-'A')); + } + + return to_string(buf); +} + +to_screaming_snake_case :: proc(str: string, allocator := context.allocator) -> string { + buf := make_builder(allocator); + + last_chars: [2]rune; + for char, _ in str { + switch char { + case 'A'..'Z': + switch last_chars[1] { + case 'a'..'z', '0'..'9': + write_rune(&buf, '_'); + case 'A'..'Z': + write_rune(&buf, last_chars[1]); + } + case 'a'..'z': + switch last_chars[1] { + case 'A'..'Z': + switch last_chars[0] { + case 'A'..'Z': + write_rune(&buf, '_'); + write_rune(&buf, last_chars[1]); + case: + write_rune(&buf, last_chars[1]); + } + write_rune(&buf, char - ('a'-'A')); + case '0'..'9': + write_rune(&buf, '_'); + write_rune(&buf, char - ('a'-'A')); + case 'a'..'z': + write_rune(&buf, char - ('a'-'A')); + case '_', '\x00': + write_rune(&buf, char - ('a'-'A')); + } + case '0'..'9': + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1]); + write_rune(&buf, '_'); + case 'a'..'z': + write_rune(&buf, '_'); + } + write_rune(&buf, char); + case '_': + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1]); + } + write_rune(&buf, char); + case: + unimplemented(); + } + + last_chars[0] = last_chars[1]; + last_chars[1] = char; + } + + switch last_chars[1] { + case 'A'..'Z': + write_rune(&buf, last_chars[1]); + } + + return to_string(buf); +} reverse :: proc(s: string, allocator := context.allocator) -> string { str := s; |