...

Source file src/github.com/gobuffalo/flect/pluralize.go

Documentation: github.com/gobuffalo/flect

     1  package flect
     2  
     3  import (
     4  	"strings"
     5  	"sync"
     6  )
     7  
     8  var pluralMoot = &sync.RWMutex{}
     9  
    10  // Pluralize returns a plural version of the string
    11  //	user = users
    12  //	person = people
    13  //	datum = data
    14  func Pluralize(s string) string {
    15  	return New(s).Pluralize().String()
    16  }
    17  
    18  // PluralizeWithSize will pluralize a string taking a number number into account.
    19  //	PluralizeWithSize("user", 1) = user
    20  //	PluralizeWithSize("user", 2) = users
    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  // Pluralize returns a plural version of the string
    29  //	user = users
    30  //	person = people
    31  //	datum = data
    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  	// check if the Original has an explicit entry in the map
    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