pluralize.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package flect
  2. import (
  3. "strings"
  4. "sync"
  5. )
  6. var pluralMoot = &sync.RWMutex{}
  7. // Pluralize returns a plural version of the string
  8. // user = users
  9. // person = people
  10. // datum = data
  11. func Pluralize(s string) string {
  12. return New(s).Pluralize().String()
  13. }
  14. // PluralizeWithSize will pluralize a string taking a number number into account.
  15. // PluralizeWithSize("user", 1) = user
  16. // PluralizeWithSize("user", 2) = users
  17. func PluralizeWithSize(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. // Pluralize returns a plural version of the string
  24. // user = users
  25. // person = people
  26. // datum = data
  27. func (i Ident) Pluralize() Ident {
  28. s := i.LastPart()
  29. if len(s) == 0 {
  30. return New("")
  31. }
  32. pluralMoot.RLock()
  33. defer pluralMoot.RUnlock()
  34. ls := strings.ToLower(s)
  35. if _, ok := pluralToSingle[ls]; ok {
  36. return i
  37. }
  38. if p, ok := singleToPlural[ls]; ok {
  39. return i.ReplaceSuffix(s, p)
  40. }
  41. for _, r := range pluralRules {
  42. if strings.HasSuffix(ls, r.suffix) {
  43. return i.ReplaceSuffix(s, r.fn(s))
  44. }
  45. }
  46. if strings.HasSuffix(ls, "s") {
  47. return i
  48. }
  49. return New(i.String() + "s")
  50. }