2
0

pluralize.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. // check if the Original has an explicit entry in the map
  35. if p, ok := singleToPlural[i.Original]; ok {
  36. return i.ReplaceSuffix(i.Original, p)
  37. }
  38. if _, ok := pluralToSingle[i.Original]; ok {
  39. return i
  40. }
  41. ls := strings.ToLower(s)
  42. if _, ok := pluralToSingle[ls]; ok {
  43. return i
  44. }
  45. if p, ok := singleToPlural[ls]; ok {
  46. if s == Capitalize(s) {
  47. p = Capitalize(p)
  48. }
  49. return i.ReplaceSuffix(s, p)
  50. }
  51. for _, r := range pluralRules {
  52. if strings.HasSuffix(s, r.suffix) {
  53. return i.ReplaceSuffix(s, r.fn(s))
  54. }
  55. }
  56. if strings.HasSuffix(ls, "s") {
  57. return i
  58. }
  59. return New(i.String() + "s")
  60. }