package strutil
import (
"fmt"
"regexp"
"strings"
"unicode"
)
var (
UpWords = UpperWord
LoFirst = LowerFirst
UpFirst = UpperFirst
Snake = SnakeCase
)
func Title (s string ) string { return strings .ToTitle (s ) }
func Lower (s string ) string { return strings .ToLower (s ) }
func Lowercase (s string ) string { return strings .ToLower (s ) }
func Upper (s string ) string { return strings .ToUpper (s ) }
func Uppercase (s string ) string { return strings .ToUpper (s ) }
func UpperWord (s string ) string {
if len (s ) == 0 {
return s
}
if len (s ) == 1 {
return strings .ToUpper (s )
}
inWord := true
buf := make ([]byte , 0 , len (s ))
i := 0
rs := []rune (s )
if RuneIsLower (rs [i ]) {
buf = append (buf , []byte (string (unicode .ToUpper (rs [i ])))...)
} else {
buf = append (buf , []byte (string (rs [i ]))...)
}
for j := i + 1 ; j < len (rs ); j ++ {
if !RuneIsWord (rs [i ]) && RuneIsWord (rs [j ]) {
inWord = false
}
if RuneIsLower (rs [j ]) && !inWord {
buf = append (buf , []byte (string (unicode .ToUpper (rs [j ])))...)
inWord = true
} else {
buf = append (buf , []byte (string (rs [j ]))...)
}
if RuneIsWord (rs [j ]) {
inWord = true
}
i ++
}
return string (buf )
}
func LowerFirst (s string ) string {
if len (s ) == 0 {
return s
}
rs := []rune (s )
f := rs [0 ]
if 'A' <= f && f <= 'Z' {
return string (unicode .ToLower (f )) + string (rs [1 :])
}
return s
}
func UpperFirst (s string ) string {
if len (s ) == 0 {
return s
}
rs := []rune (s )
f := rs [0 ]
if 'a' <= f && f <= 'z' {
return string (unicode .ToUpper (f )) + string (rs [1 :])
}
return s
}
func SnakeCase (s string , sep ...string ) string {
sepChar := "_"
if len (sep ) > 0 {
sepChar = sep [0 ]
}
str := toSnakeReg .ReplaceAllStringFunc (s , func (s string ) string {
return sepChar + LowerFirst (s )
})
return strings .TrimLeft (str , sepChar )
}
func Camel (s string , sep ...string ) string { return CamelCase (s , sep ...) }
func CamelCase (s string , sep ...string ) string {
sepChar := "_"
if len (sep ) > 0 {
sepChar = sep [0 ]
}
if !strings .Contains (s , sepChar ) {
return s
}
rgx , ok := toCamelRegs [sepChar ]
if !ok {
rgx = regexp .MustCompile (regexp .QuoteMeta (sepChar ) + "+[a-zA-Z]" )
}
return rgx .ReplaceAllStringFunc (s , func (s string ) string {
s = strings .TrimLeft (s , sepChar )
return UpperFirst (s )
})
}
func Indent (s , prefix string ) string {
return string (IndentBytes ([]byte (s ), []byte (prefix )))
}
func IndentBytes (b , prefix []byte ) []byte {
if len (b ) == 0 {
return b
}
bol := true
res := make ([]byte , 0 , len (b )+len (prefix )*4 )
for _ , c := range b {
if bol && c != '\n' {
res = append (res , prefix ...)
}
res = append (res , c )
bol = c == '\n'
}
return res
}
func Replaces (str string , pairs map [string ]string ) string {
return NewReplacer (pairs ).Replace (str )
}
func ReplaceVars (s string , vars map [string ]string ) string {
if !ContainsByte (s , '{' ) {
return s
}
pairs := make (map [string ]string )
for k , v := range vars {
vName := "{" + k + "}"
pairs [vName ] = v
}
return NewReplacer (pairs ).Replace (s )
}
func NewReplacer (pairs map [string ]string ) *strings .Replacer {
ss := make ([]string , len (pairs )*2 )
for old , newVal := range pairs {
ss = append (ss , old , newVal )
}
return strings .NewReplacer (ss ...)
}
func WrapTag (s , tag string ) string {
if s == "" {
return s
}
return fmt .Sprintf ("<%s>%s</%s>" , tag , s , tag )
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .