You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zk/internal/util/strings/strings.go

128 lines
2.8 KiB
Go

package strings
import (
"bufio"
"net/url"
"strconv"
"strings"
)
// Prepend prefixes each lines of a string with the given prefix.
// It can be used to indent or quote (> ) a paragraph, for example.
func Prepend(text string, prefix string) string {
if text == "" || prefix == "" {
return text
}
lines := strings.SplitAfter(text, "\n")
if len(lines[len(lines)-1]) == 0 {
lines = lines[:len(lines)-1]
}
return strings.Join(append([]string{""}, lines...), prefix)
}
// Pluralize adds an `s` at the end of word if the count is more than 1.
func Pluralize(word string, count int) string {
if word == "" || (count >= -1 && count <= 1) {
return word
} else {
return word + "s"
}
}
// SplitLines splits a string by the newlines character in a portable way
// Using only `strings.Split(s, "\n")` doesn't work on Windows.
func SplitLines(s string) []string {
var lines []string
scanner := bufio.NewScanner(strings.NewReader(s))
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
return lines
}
// JoinLines joins each lines of the given string by replacing the newlines by
// a single space.
func JoinLines(s string) string {
return strings.Join(SplitLines(s), " ")
}
// JoinInt64 joins a list of int64 into a single string with the given
// delimiter.
func JoinInt64(ints []int64, delimiter string) string {
strs := make([]string, 0)
for _, i := range ints {
strs = append(strs, strconv.FormatInt(i, 10))
}
return strings.Join(strs, delimiter)
}
// IsURL returns whether the given string is a valid URL.
func IsURL(s string) bool {
_, err := url.ParseRequestURI(s)
if err != nil {
return false
}
u, err := url.Parse(s)
if err != nil || u.Scheme == "" || u.Host == "" {
return false
}
return true
}
// RemoveDuplicates keeps only unique strings in the source.
func RemoveDuplicates(strings []string) []string {
if strings == nil {
return nil
}
check := make(map[string]bool)
res := make([]string, 0)
for _, val := range strings {
if _, ok := check[val]; ok {
continue
}
check[val] = true
res = append(res, val)
}
return res
}
// RemoveBlank keeps only non-empty strings in the source.
func RemoveBlank(strs []string) []string {
if strs == nil {
return nil
}
res := make([]string, 0)
for _, val := range strs {
if strings.TrimSpace(val) != "" {
res = append(res, val)
}
}
return res
}
// InList returns whether the string is part of the given list of strings.
func InList(strings []string, s string) bool {
for _, c := range strings {
if c == s {
return true
}
}
return false
}
// Expand literal escaped whitespace characters in the given string to their
// actual character.
func ExpandWhitespaceLiterals(s string) string {
s = strings.ReplaceAll(s, `\n`, "\n")
s = strings.ReplaceAll(s, `\t`, "\t")
return s
}