...
1 package flect
2
3 import (
4 "strings"
5 "sync"
6 )
7
8 var pluralMoot = &sync.RWMutex{}
9
10
11
12
13
14 func Pluralize(s string) string {
15 return New(s).Pluralize().String()
16 }
17
18
19
20
21 func PluralizeWithSize(s string, i int) string {
22 if i == 1 || i == -1 {
23 return New(s).Singularize().String()
24 }
25 return New(s).Pluralize().String()
26 }
27
28
29
30
31
32 func (i Ident) Pluralize() Ident {
33 s := i.LastPart()
34 if len(s) == 0 {
35 return New("")
36 }
37
38 pluralMoot.RLock()
39 defer pluralMoot.RUnlock()
40
41
42 if p, ok := singleToPlural[i.Original]; ok {
43 return i.ReplaceSuffix(i.Original, p)
44 }
45 if _, ok := pluralToSingle[i.Original]; ok {
46 return i
47 }
48
49 ls := strings.ToLower(s)
50 if _, ok := pluralToSingle[ls]; ok {
51 return i
52 }
53
54 if p, ok := singleToPlural[ls]; ok {
55 if s == Capitalize(s) {
56 p = Capitalize(p)
57 }
58 return i.ReplaceSuffix(s, p)
59 }
60
61 for _, r := range pluralRules {
62 if strings.HasSuffix(s, r.suffix) {
63 return i.ReplaceSuffix(s, r.fn(s))
64 }
65 }
66
67 if strings.HasSuffix(ls, "s") {
68 return i
69 }
70
71 return New(i.String() + "s")
72 }
73
View as plain text