github.com/jxskiss/gopkg/v2@v2.14.9-0.20240514120614-899f3e7952b4/utils/strutil/strcase.go (about)

     1  package strutil
     2  
     3  import (
     4  	"unicode"
     5  )
     6  
     7  // ToSnakeCase convert the given string to snake case following the Golang format:
     8  // acronyms are converted to lower-case and preceded by an underscore.
     9  func ToSnakeCase(in string) string {
    10  	runes := []rune(in)
    11  	length := len(runes)
    12  
    13  	var out []rune
    14  	for i := 0; i < length; i++ {
    15  		if i > 0 && unicode.IsUpper(runes[i]) &&
    16  			((i+1 < length && unicode.IsLower(runes[i+1])) || unicode.IsLower(runes[i-1])) {
    17  			out = append(out, '_')
    18  		}
    19  		out = append(out, unicode.ToLower(runes[i]))
    20  	}
    21  
    22  	return string(out)
    23  }
    24  
    25  // ToCamelCase converts the given string to CamelCase.
    26  func ToCamelCase(in string) string {
    27  	return string(toCamelCase([]rune(in)))
    28  }
    29  
    30  // ToLowerCamelCase converts the given string to lowerCamelCase.
    31  func ToLowerCamelCase(in string) string {
    32  	out := toCamelCase([]rune(in))
    33  	length := len(out)
    34  	for i := 0; i < length; i++ {
    35  		isUpper := unicode.IsUpper(out[i])
    36  		if isUpper && (i == 0 || i+1 == length || unicode.IsUpper(out[i+1])) {
    37  			out[i] -= 'A' - 'a'
    38  			continue
    39  		}
    40  		break
    41  	}
    42  	return string(out)
    43  }
    44  
    45  func toCamelCase(runes []rune) []rune {
    46  	var out []rune
    47  	var capNext = true
    48  	for _, v := range runes {
    49  		isUpper, isLower := unicode.IsUpper(v), unicode.IsLower(v)
    50  		if capNext && isLower {
    51  			v += 'A' - 'a'
    52  		}
    53  		if isUpper || isLower {
    54  			out = append(out, v)
    55  			capNext = false
    56  		} else if unicode.IsNumber(v) {
    57  			out = append(out, v)
    58  			capNext = true
    59  		} else {
    60  			capNext = v == '_' || v == ' ' || v == '-' || v == '.'
    61  		}
    62  	}
    63  	return out
    64  }