You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.1 KiB
68 lines
1.1 KiB
2 years ago
|
package internal
|
||
|
|
||
|
func IsUpper(c byte) bool {
|
||
|
return c >= 'A' && c <= 'Z'
|
||
|
}
|
||
|
|
||
|
func IsLower(c byte) bool {
|
||
|
return c >= 'a' && c <= 'z'
|
||
|
}
|
||
|
|
||
|
func ToUpper(c byte) byte {
|
||
|
return c - 32
|
||
|
}
|
||
|
|
||
|
func ToLower(c byte) byte {
|
||
|
return c + 32
|
||
|
}
|
||
|
|
||
|
// Underscore converts "CamelCasedString" to "camel_cased_string".
|
||
|
func Underscore(s string) string {
|
||
|
r := make([]byte, 0, len(s)+5)
|
||
|
for i := 0; i < len(s); i++ {
|
||
|
c := s[i]
|
||
|
if IsUpper(c) {
|
||
|
if i > 0 && i+1 < len(s) && (IsLower(s[i-1]) || IsLower(s[i+1])) {
|
||
|
r = append(r, '_', ToLower(c))
|
||
|
} else {
|
||
|
r = append(r, ToLower(c))
|
||
|
}
|
||
|
} else {
|
||
|
r = append(r, c)
|
||
|
}
|
||
|
}
|
||
|
return string(r)
|
||
|
}
|
||
|
|
||
|
func CamelCased(s string) string {
|
||
|
r := make([]byte, 0, len(s))
|
||
|
upperNext := true
|
||
|
for i := 0; i < len(s); i++ {
|
||
|
c := s[i]
|
||
|
if c == '_' {
|
||
|
upperNext = true
|
||
|
continue
|
||
|
}
|
||
|
if upperNext {
|
||
|
if IsLower(c) {
|
||
|
c = ToUpper(c)
|
||
|
}
|
||
|
upperNext = false
|
||
|
}
|
||
|
r = append(r, c)
|
||
|
}
|
||
|
return string(r)
|
||
|
}
|
||
|
|
||
|
func ToExported(s string) string {
|
||
|
if len(s) == 0 {
|
||
|
return s
|
||
|
}
|
||
|
if c := s[0]; IsLower(c) {
|
||
|
b := []byte(s)
|
||
|
b[0] = ToUpper(c)
|
||
|
return string(b)
|
||
|
}
|
||
|
return s
|
||
|
}
|