/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

  1. package str
  2. import (
  3. "strings"
  4. )
  5. func gonicCasedName(name string) string {
  6. newstr := make([]rune, 0, len(name)+3)
  7. for idx, chr := range name {
  8. if isASCIIUpper(chr) && idx > 0 {
  9. if !isASCIIUpper(newstr[len(newstr)-1]) {
  10. newstr = append(newstr, '_')
  11. }
  12. }
  13. if !isASCIIUpper(chr) && idx > 1 {
  14. l := len(newstr)
  15. if isASCIIUpper(newstr[l-1]) && isASCIIUpper(newstr[l-2]) {
  16. newstr = append(newstr, newstr[l-1])
  17. newstr[l-1] = '_'
  18. }
  19. }
  20. newstr = append(newstr, chr)
  21. }
  22. return strings.ToLower(string(newstr))
  23. }
  24. func isASCIIUpper(r rune) bool {
  25. return 'A' <= r && r <= 'Z'
  26. }
  27. func toASCIIUpper(r rune) rune {
  28. if 'a' <= r && r <= 'z' {
  29. r -= ('a' - 'A')
  30. }
  31. return r
  32. }
  33. // GonicMapper implements IMapper. It will consider initialisms when mapping names.
  34. // E.g. id -> ID, user -> Admin and to table names: UserID -> user_id, MyUID -> my_uid
  35. type GonicMapper map[string]bool
  36. func (mapper GonicMapper) Obj2Table(name string) string {
  37. return gonicCasedName(name)
  38. }
  39. //大驼峰命名
  40. func (mapper GonicMapper) Table2Obj(name string) string {
  41. newstr := make([]rune, 0)
  42. name = strings.ToLower(name)
  43. parts := strings.Split(name, "_")
  44. for _, p := range parts {
  45. _, isInitialism := mapper[strings.ToUpper(p)]
  46. for i, r := range p {
  47. if i == 0 || isInitialism {
  48. r = toASCIIUpper(r)
  49. }
  50. newstr = append(newstr, r)
  51. }
  52. }
  53. return string(newstr)
  54. }
  55. var LintGonicMapper = GonicMapper{
  56. "API": true,
  57. "ASCII": true,
  58. "CPU": true,
  59. "CSS": true,
  60. "DNS": true,
  61. "EOF": true,
  62. "GUID": true,
  63. "HTML": true,
  64. "HTTP": true,
  65. "HTTPS": true,
  66. "ID": true,
  67. "IP": true,
  68. "JSON": true,
  69. "LHS": true,
  70. "QPS": true,
  71. "RAM": true,
  72. "RHS": true,
  73. "RPC": true,
  74. "SLA": true,
  75. "SMTP": true,
  76. "SSH": true,
  77. "TLS": true,
  78. "TTL": true,
  79. "UI": true,
  80. "UID": true,
  81. "UUID": true,
  82. "URI": true,
  83. "URL": true,
  84. "UTF8": true,
  85. "VM": true,
  86. "XML": true,
  87. "XSRF": true,
  88. "XSS": true,
  89. }
  90. /**
  91. 小驼峰命名
  92. * 字符串首字母转化为大写 ios_bbbbbbbb -> iosBbbbbbbbb
  93. */
  94. func FirstToUpper(str string) string {
  95. temp := strings.Split(str, "_")
  96. var upperStr string
  97. for y := 0; y < len(temp); y++ {
  98. vv := []rune(temp[y])
  99. if y != 0 {
  100. for i := 0; i < len(vv); i++ {
  101. if i == 0 {
  102. vv[i] -= 32
  103. upperStr += string(vv[i]) // + string(vv[i+1])
  104. } else {
  105. upperStr += string(vv[i])
  106. }
  107. }
  108. }
  109. }
  110. return temp[0] + upperStr
  111. }
  112. /**
  113. 小驼峰命名
  114. * 字符串首字母转化为大写 ios_bbbbbbbb -> iosBbbbbbbbb
  115. */
  116. func LittleCamelCase(str string) string {
  117. //str = LintGonicMapper.Table2Obj(str)
  118. //reg := regexp.MustCompile(`^\w{1}`)
  119. //return reg.ReplaceAllStringFunc(str, func(s string) string {
  120. // return strings.ToUpper(s)
  121. //})
  122. return FirstToUpper(str)
  123. }
  124. /**
  125. 大驼峰命名
  126. * 字符串首字母转化为大写 ios_bbbbbbbb -> IosBbbbbbbbb
  127. */
  128. func BigCamelCase(str string) string {
  129. return LintGonicMapper.Table2Obj(str)
  130. }