singularize.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package flect
  2. import (
  3. "strings"
  4. "sync"
  5. )
  6. var singularMoot = &sync.RWMutex{}
  7. // Singularize returns a singular version of the string
  8. // users = user
  9. // data = datum
  10. // people = person
  11. func Singularize(s string) string {
  12. return New(s).Singularize().String()
  13. }
  14. // SingularizeWithSize will singular a string taking a number number into account.
  15. // SingularizeWithSize("user", 1) = user
  16. // SingularizeWithSize("user", 2) = users
  17. func SingularizeWithSize(s string, i int) string {
  18. if i == 1 || i == -1 {
  19. return New(s).Singularize().String()
  20. }
  21. return New(s).Pluralize().String()
  22. }
  23. // Singularize returns a singular version of the string
  24. // users = user
  25. // data = datum
  26. // people = person
  27. func (i Ident) Singularize() Ident {
  28. s := i.Original
  29. if len(s) == 0 {
  30. return i
  31. }
  32. singularMoot.RLock()
  33. defer singularMoot.RUnlock()
  34. ls := strings.ToLower(s)
  35. if p, ok := pluralToSingle[ls]; ok {
  36. return New(p)
  37. }
  38. if _, ok := singleToPlural[ls]; ok {
  39. return i
  40. }
  41. for _, r := range singularRules {
  42. if strings.HasSuffix(ls, r.suffix) {
  43. return New(r.fn(s))
  44. }
  45. }
  46. if strings.HasSuffix(s, "s") {
  47. return New(s[:len(s)-1])
  48. }
  49. return i
  50. }