/util/str/camel_case.go
https://github.com/foxiswho/echo-go · Go · 145 lines · 110 code · 15 blank · 20 comment · 23 complexity · b818e1bf5e0b3d78d899a7b9a2e1fecb MD5 · raw file
- package str
- import (
- "strings"
- )
- func gonicCasedName(name string) string {
- newstr := make([]rune, 0, len(name)+3)
- for idx, chr := range name {
- if isASCIIUpper(chr) && idx > 0 {
- if !isASCIIUpper(newstr[len(newstr)-1]) {
- newstr = append(newstr, '_')
- }
- }
- if !isASCIIUpper(chr) && idx > 1 {
- l := len(newstr)
- if isASCIIUpper(newstr[l-1]) && isASCIIUpper(newstr[l-2]) {
- newstr = append(newstr, newstr[l-1])
- newstr[l-1] = '_'
- }
- }
- newstr = append(newstr, chr)
- }
- return strings.ToLower(string(newstr))
- }
- func isASCIIUpper(r rune) bool {
- return 'A' <= r && r <= 'Z'
- }
- func toASCIIUpper(r rune) rune {
- if 'a' <= r && r <= 'z' {
- r -= ('a' - 'A')
- }
- return r
- }
- // GonicMapper implements IMapper. It will consider initialisms when mapping names.
- // E.g. id -> ID, user -> Admin and to table names: UserID -> user_id, MyUID -> my_uid
- type GonicMapper map[string]bool
- func (mapper GonicMapper) Obj2Table(name string) string {
- return gonicCasedName(name)
- }
- //大驼峰命名
- func (mapper GonicMapper) Table2Obj(name string) string {
- newstr := make([]rune, 0)
- name = strings.ToLower(name)
- parts := strings.Split(name, "_")
- for _, p := range parts {
- _, isInitialism := mapper[strings.ToUpper(p)]
- for i, r := range p {
- if i == 0 || isInitialism {
- r = toASCIIUpper(r)
- }
- newstr = append(newstr, r)
- }
- }
- return string(newstr)
- }
- var LintGonicMapper = GonicMapper{
- "API": true,
- "ASCII": true,
- "CPU": true,
- "CSS": true,
- "DNS": true,
- "EOF": true,
- "GUID": true,
- "HTML": true,
- "HTTP": true,
- "HTTPS": true,
- "ID": true,
- "IP": true,
- "JSON": true,
- "LHS": true,
- "QPS": true,
- "RAM": true,
- "RHS": true,
- "RPC": true,
- "SLA": true,
- "SMTP": true,
- "SSH": true,
- "TLS": true,
- "TTL": true,
- "UI": true,
- "UID": true,
- "UUID": true,
- "URI": true,
- "URL": true,
- "UTF8": true,
- "VM": true,
- "XML": true,
- "XSRF": true,
- "XSS": true,
- }
- /**
- 小驼峰命名
- * 字符串首字母转化为大写 ios_bbbbbbbb -> iosBbbbbbbbb
- */
- func FirstToUpper(str string) string {
- temp := strings.Split(str, "_")
- var upperStr string
- for y := 0; y < len(temp); y++ {
- vv := []rune(temp[y])
- if y != 0 {
- for i := 0; i < len(vv); i++ {
- if i == 0 {
- vv[i] -= 32
- upperStr += string(vv[i]) // + string(vv[i+1])
- } else {
- upperStr += string(vv[i])
- }
- }
- }
- }
- return temp[0] + upperStr
- }
- /**
- 小驼峰命名
- * 字符串首字母转化为大写 ios_bbbbbbbb -> iosBbbbbbbbb
- */
- func LittleCamelCase(str string) string {
- //str = LintGonicMapper.Table2Obj(str)
- //reg := regexp.MustCompile(`^\w{1}`)
- //return reg.ReplaceAllStringFunc(str, func(s string) string {
- // return strings.ToUpper(s)
- //})
- return FirstToUpper(str)
- }
- /**
- 大驼峰命名
- * 字符串首字母转化为大写 ios_bbbbbbbb -> IosBbbbbbbbb
- */
- func BigCamelCase(str string) string {
- return LintGonicMapper.Table2Obj(str)
- }