github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/isc/utf8string.go (about) 1 package isc 2 3 import ( 4 "fmt" 5 "regexp" 6 "strconv" 7 "strings" 8 ) 9 10 type ISCUTF8String []rune 11 12 func NewUTF8String(str string) ISCUTF8String { 13 return ISCUTF8String(str) 14 } 15 16 func (s ISCUTF8String) String() string { 17 return string(s) 18 } 19 20 func (s ISCUTF8String) At(index int) rune { 21 return s[index] 22 } 23 24 func (s ISCUTF8String) Length() int { 25 return len(s) 26 } 27 28 func (s ISCUTF8String) Chars() ISCList[rune] { 29 return ISCList[rune](s) 30 } 31 32 func (s ISCUTF8String) Count(substr ISCUTF8String) int { 33 return strings.Count(string(s), string(substr)) 34 } 35 36 func (s ISCUTF8String) Contains(substr ISCUTF8String) bool { 37 return strings.Contains(string(s), string(substr)) 38 } 39 40 func (s ISCUTF8String) ContainsRune(r rune) bool { 41 return strings.ContainsRune(string(s), r) 42 } 43 44 func (s ISCUTF8String) toIndex(idx int) int { 45 if idx < 0 { 46 return idx 47 } 48 buf := string(s)[:idx] 49 runeBuf := []rune(buf) 50 return len(runeBuf) 51 } 52 53 func (s ISCUTF8String) IndexOf(substr ISCUTF8String) int { 54 i := strings.Index(string(s), string(substr)) 55 return s.toIndex(i) 56 } 57 58 func (s ISCUTF8String) LastIndexOf(substr ISCUTF8String) int { 59 i := strings.LastIndex(string(s), string(substr)) 60 return s.toIndex(i) 61 } 62 63 func (s ISCUTF8String) IndexOfFunc(f func(rune) bool) int { 64 i := strings.IndexFunc(string(s), f) 65 return s.toIndex(i) 66 } 67 68 func (s ISCUTF8String) LastIndexOfFunc(f func(rune) bool) int { 69 i := strings.LastIndexFunc(string(s), f) 70 return s.toIndex(i) 71 } 72 73 func (s ISCUTF8String) SplitN(sep ISCUTF8String, n int) []ISCUTF8String { 74 ss := strings.SplitN(string(s), string(sep), n) 75 return ListToMapFrom[string, ISCUTF8String](ss).Map(func(item string) ISCUTF8String { 76 return ISCUTF8String(item) 77 }) 78 } 79 80 func (s ISCUTF8String) SplitAfterN(sep ISCUTF8String, n int) []ISCUTF8String { 81 ss := strings.SplitAfterN(string(s), string(sep), n) 82 return ListToMapFrom[string, ISCUTF8String](ss).Map(func(item string) ISCUTF8String { 83 return ISCUTF8String(item) 84 }) 85 } 86 87 func (s ISCUTF8String) Split(sep ISCUTF8String) []ISCUTF8String { 88 ss := strings.Split(string(s), string(sep)) 89 return ListToMapFrom[string, ISCUTF8String](ss).Map(func(item string) ISCUTF8String { 90 return ISCUTF8String(item) 91 }) 92 } 93 94 func (s ISCUTF8String) SplitAfter(sep ISCUTF8String) []ISCUTF8String { 95 ss := strings.SplitAfter(string(s), string(sep)) 96 return ListToMapFrom[string, ISCUTF8String](ss).Map(func(item string) ISCUTF8String { 97 return ISCUTF8String(item) 98 }) 99 } 100 101 func (s ISCUTF8String) Fields() []ISCUTF8String { 102 ss := strings.Fields(string(s)) 103 return ListToMapFrom[string, ISCUTF8String](ss).Map(func(item string) ISCUTF8String { 104 return ISCUTF8String(item) 105 }) 106 } 107 108 func (s ISCUTF8String) FieldsFunc(f func(rune) bool) []ISCUTF8String { 109 ss := strings.FieldsFunc(string(s), f) 110 return ListToMapFrom[string, ISCUTF8String](ss).Map(func(item string) ISCUTF8String { 111 return ISCUTF8String(item) 112 }) 113 } 114 115 func (s ISCUTF8String) StartsWith(prefix ISCUTF8String) bool { 116 return strings.HasPrefix(string(s), string(prefix)) 117 } 118 119 func (s ISCUTF8String) EndsWith(suffix ISCUTF8String) bool { 120 return strings.HasSuffix(string(s), string(suffix)) 121 } 122 123 func (s ISCUTF8String) TrimLeftFunc(f func(rune) bool) ISCUTF8String { 124 return ISCUTF8String(strings.TrimLeftFunc(string(s), f)) 125 } 126 127 func (s ISCUTF8String) TrimRightFunc(f func(rune) bool) ISCUTF8String { 128 return ISCUTF8String(strings.TrimRightFunc(string(s), f)) 129 } 130 131 func (s ISCUTF8String) TrimFunc(f func(rune) bool) ISCUTF8String { 132 return ISCUTF8String(strings.TrimFunc(string(s), f)) 133 } 134 135 func (s ISCUTF8String) Trim(cutset ISCUTF8String) ISCUTF8String { 136 return ISCUTF8String(strings.Trim(string(s), string(cutset))) 137 } 138 139 func (s ISCUTF8String) TrimLeft(cutset ISCUTF8String) ISCUTF8String { 140 return ISCUTF8String(strings.TrimLeft(string(s), string(cutset))) 141 } 142 143 func (s ISCUTF8String) TrimRight(cutset ISCUTF8String) ISCUTF8String { 144 return ISCUTF8String(strings.TrimRight(string(s), string(cutset))) 145 } 146 147 func (s ISCUTF8String) TrimSpace() ISCUTF8String { 148 return ISCUTF8String(strings.TrimSpace(string(s))) 149 } 150 151 func (s ISCUTF8String) TrimPrefix(prefix ISCUTF8String) ISCUTF8String { 152 return ISCUTF8String(strings.TrimPrefix(string(s), string(prefix))) 153 } 154 155 func (s ISCUTF8String) TrimSuffix(suffix ISCUTF8String) ISCUTF8String { 156 return ISCUTF8String(strings.TrimSuffix(string(s), string(suffix))) 157 } 158 159 func (s ISCUTF8String) Replace(old, new ISCUTF8String, n int) ISCUTF8String { 160 return ISCUTF8String(strings.Replace(string(s), string(old), string(new), n)) 161 } 162 163 func (s ISCUTF8String) ReplaceAll(old, new ISCUTF8String) ISCUTF8String { 164 return ISCUTF8String(strings.ReplaceAll(string(s), string(old), string(new))) 165 } 166 167 func (s ISCUTF8String) EqualFold(t ISCUTF8String) bool { 168 return strings.EqualFold(string(s), string(t)) 169 } 170 171 func (s ISCUTF8String) ToUpper() ISCUTF8String { 172 return ISCUTF8String(strings.ToUpper(string(s))) 173 } 174 175 func (s ISCUTF8String) ToLower() ISCUTF8String { 176 return ISCUTF8String(strings.ToLower(string(s))) 177 } 178 179 func (s ISCUTF8String) ToTitle() ISCUTF8String { 180 return ISCUTF8String(strings.ToTitle(string(s))) 181 } 182 183 func (s ISCUTF8String) IsEmpty() bool { 184 return len(s) == 0 185 } 186 187 func (s ISCUTF8String) SubStringStart(AStartIndex int) ISCUTF8String { 188 return s[AStartIndex:] 189 } 190 191 func (s ISCUTF8String) SubStringStartEnd(AStartIndex, AEndIndex int) ISCUTF8String { 192 return s[AStartIndex:AEndIndex] 193 } 194 195 func (s ISCUTF8String) SubStringBefore(delimiter ISCUTF8String) ISCUTF8String { 196 if i := s.IndexOf(delimiter); i != -1 { 197 return s[:i] 198 } else { 199 return s 200 } 201 } 202 203 func (s ISCUTF8String) SubStringAfter(delimiter ISCUTF8String) ISCUTF8String { 204 if i := s.IndexOf(delimiter); i != -1 { 205 return s[i+len(delimiter):] 206 } else { 207 return s 208 } 209 } 210 211 func (s ISCUTF8String) SubStringBeforeLast(delimiter ISCUTF8String) ISCUTF8String { 212 if i := s.LastIndexOf(delimiter); i != -1 { 213 return s[:i] 214 } else { 215 return s 216 } 217 } 218 219 func (s ISCUTF8String) SubStringAfterLast(delimiter ISCUTF8String) ISCUTF8String { 220 if i := s.LastIndexOf(delimiter); i != -1 { 221 return s[i+len(delimiter):] 222 } else { 223 return s 224 } 225 } 226 227 func (s ISCUTF8String) Insert(index int, substr ISCUTF8String) ISCUTF8String { 228 ss := string(s[:index]) + string(substr) + string(s[index:]) 229 return ISCUTF8String(ss) 230 } 231 232 func (s ISCUTF8String) Delete(index int, count int) ISCUTF8String { 233 ss := string(s[:index]) + string(s[index+count:]) 234 return ISCUTF8String(ss) 235 } 236 237 func (s ISCUTF8String) Matches(pattern ISCUTF8String) bool { 238 reg := regexp.MustCompile(string(pattern)) 239 return reg.MatchString(string(s)) 240 } 241 242 func (s ISCUTF8String) Lines() []ISCUTF8String { 243 return s.Split(ISCUTF8String("\n")) 244 } 245 246 func (s ISCUTF8String) LinesNoEmpty() []ISCUTF8String { 247 return NewListWithList(s.Split(ISCUTF8String("\n"))).Filter(func(item ISCUTF8String) bool { 248 return !item.IsEmpty() 249 }) 250 } 251 252 func (s ISCUTF8String) ToBoolean() bool { 253 return string(s.ToLower()) == "true" 254 } 255 256 func (s ISCUTF8String) ToInt() int { 257 return ToInt(string(s)) 258 } 259 260 func (s ISCUTF8String) ToInt8() int8 { 261 return ToInt8(string(s)) 262 } 263 264 func (s ISCUTF8String) ToInt16() int16 { 265 return ToInt16(string(s)) 266 } 267 268 func (s ISCUTF8String) ToInt32() int32 { 269 return ToInt32(string(s)) 270 } 271 272 func (s ISCUTF8String) ToInt64() int64 { 273 return ToInt64(string(s)) 274 } 275 276 func (s ISCUTF8String) ToFloat() float32 { 277 return ToFloat32(string(s)) 278 } 279 280 func (s ISCUTF8String) ToFloat64() float64 { 281 return ToFloat64(string(s)) 282 } 283 284 func (s ISCUTF8String) ToIntRadix(radix int) (int64, error) { 285 if radix != 2 && radix != 8 && radix != 10 && radix != 16 { 286 return 0, fmt.Errorf("radix %d is not supported", radix) 287 } 288 size := strconv.IntSize 289 return strconv.ParseInt(string(s), radix, size) 290 } 291 292 func (s ISCUTF8String) ToJSONEncoded() ISCUTF8String { 293 return s.ReplaceAll(ISCUTF8String("\\"), ISCUTF8String("\\\\")).ReplaceAll(ISCUTF8String("\n"), ISCUTF8String("\\n")).ReplaceAll(ISCUTF8String("\""), ISCUTF8String("\\\"")) 294 } 295 296 func (s ISCUTF8String) ToPair() Pair[ISCUTF8String, ISCUTF8String] { 297 sa := s.TrimSpace().Split(ISCUTF8String("=")) 298 return NewPair(sa[0].TrimSpace(), sa[1].TrimSpace()) 299 }