-
Notifications
You must be signed in to change notification settings - Fork 0
/
string.go
154 lines (135 loc) · 3.13 KB
/
string.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package stringx
import (
"bytes"
"strings"
"unicode"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
var WhiteSpace = []rune{'\n', '\t', '\f', '\v', ' '}
// String provides for converting the source text into other spell case,like lower,snake,camel
type String struct {
source string
}
// From converts the input text to String and returns it
func From(data string) String {
return String{source: data}
}
// IsEmptyOrSpace returns true if the length of the string value is 0 after call strings.TrimSpace, or else returns false
func (s String) IsEmptyOrSpace() bool {
if len(s.source) == 0 {
return true
}
if strings.TrimSpace(s.source) == "" {
return true
}
return false
}
// Lower calls the strings.ToLower
func (s String) Lower() string {
return strings.ToLower(s.source)
}
// Upper calls the strings.ToUpper
func (s String) Upper() string {
return strings.ToUpper(s.source)
}
// ReplaceAll calls the strings.ReplaceAll
func (s String) ReplaceAll(old, new string) string {
return strings.Replace(s.source, old, new, -1)
}
// Source returns the source string value
func (s String) Source() string {
return s.source
}
// Title calls the cases.Title
func (s String) Title() string {
if s.IsEmptyOrSpace() {
return s.source
}
return cases.Title(language.English, cases.NoLower).String(s.source)
}
// ToCamel converts the input text into camel case
func (s String) ToCamel() string {
list := s.splitBy(func(r rune) bool {
return r == '_'
}, true)
var target []string
for _, item := range list {
target = append(target, From(item).Title())
}
return strings.Join(target, "")
}
// ToSnake converts the input text into snake case
func (s String) ToSnake() string {
list := s.splitBy(unicode.IsUpper, false)
var target []string
for _, item := range list {
target = append(target, From(item).Lower())
}
return strings.Join(target, "_")
}
// Untitle return the original string if rune is not letter at index 0
func (s String) Untitle() string {
if s.IsEmptyOrSpace() {
return s.source
}
r := rune(s.source[0])
if !unicode.IsUpper(r) && !unicode.IsLower(r) {
return s.source
}
return string(unicode.ToLower(r)) + s.source[1:]
}
// it will not ignore spaces
func (s String) splitBy(fn func(r rune) bool, remove bool) []string {
if s.IsEmptyOrSpace() {
return nil
}
var list []string
buffer := new(bytes.Buffer)
for _, r := range s.source {
if fn(r) {
if buffer.Len() != 0 {
list = append(list, buffer.String())
buffer.Reset()
}
if !remove {
buffer.WriteRune(r)
}
continue
}
buffer.WriteRune(r)
}
if buffer.Len() != 0 {
list = append(list, buffer.String())
}
return list
}
func ContainsAny(s string, runes ...rune) bool {
if len(runes) == 0 {
return true
}
tmp := make(map[rune]struct{}, len(runes))
for _, r := range runes {
tmp[r] = struct{}{}
}
for _, r := range s {
if _, ok := tmp[r]; ok {
return true
}
}
return false
}
func ContainsWhiteSpace(s string) bool {
return ContainsAny(s, WhiteSpace...)
}
func IsWhiteSpace(text string) bool {
if len(text) == 0 {
return true
}
for _, r := range text {
if !unicode.IsSpace(r) {
return false
}
}
return true
}