string.go raw

   1  package data
   2  
   3  // The following code is a modified copy of functions found in strcase, found here: https://github.com/iancoleman/strcase
   4  
   5  import (
   6  	"bytes"
   7  	"regexp"
   8  	"strings"
   9  	"unicode"
  10  )
  11  
  12  // ToCamel converts a string to CamelCase
  13  func ToCamel(s string) string {
  14  	s = addWordBoundariesToNumbers(s)
  15  	s = strings.TrimSpace(s)
  16  	b := bytes.NewBuffer(make([]byte, 0))
  17  	c := true
  18  	for _, v := range s {
  19  		if v >= 'A' && v <= 'Z' {
  20  			b.WriteString(string(v))
  21  		}
  22  		if v >= '0' && v <= '9' {
  23  			b.WriteString(string(v))
  24  		}
  25  		if v >= 'a' && v <= 'z' {
  26  			if c {
  27  				b.WriteString(string(unicode.ToUpper(v)))
  28  			} else {
  29  				b.WriteString(string(v))
  30  			}
  31  		}
  32  		if v == '_' || v == ' ' || v == '-' {
  33  			c = true
  34  		} else {
  35  			c = false
  36  		}
  37  	}
  38  	return strings.TrimSpace(b.String())
  39  }
  40  
  41  var numberSequence = regexp.MustCompile(`([a-zA-Z])(\d+)([a-zA-Z]?)`)
  42  var numberReplacement = []byte(`$1 $2 $3`)
  43  
  44  func addWordBoundariesToNumbers(s string) string {
  45  	b := []byte(s)
  46  	b = numberSequence.ReplaceAll(b, numberReplacement)
  47  	return string(b)
  48  }
  49