101 lines
1.9 KiB
Go
101 lines
1.9 KiB
Go
package utils
|
||
|
||
import (
|
||
"math/rand/v2"
|
||
"strings"
|
||
|
||
"github.com/gosimple/slug"
|
||
)
|
||
|
||
// BinarySearch BinarySearch
|
||
func BinarySearch(s []string, t string, n int) (idx int) {
|
||
idx = -1
|
||
if n == 0 {
|
||
return
|
||
}
|
||
start, end := 0, n-1
|
||
for start <= end {
|
||
mid := (start + end) >> 1
|
||
if s[mid] < t {
|
||
start = mid + 1
|
||
} else if s[mid] > t {
|
||
end = mid - 1
|
||
} else {
|
||
idx = mid
|
||
break
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
var YesOrNo = map[bool]string{
|
||
true: "是",
|
||
false: "否",
|
||
}
|
||
|
||
func GetRandomLetters(n int) string {
|
||
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||
b := make([]byte, n)
|
||
for i := range b {
|
||
b[i] = letters[rand.IntN(len(letters))]
|
||
}
|
||
return string(b)
|
||
}
|
||
|
||
func GetPrefix(s string, n int) string {
|
||
runes := []rune(s)
|
||
if len(runes) <= n {
|
||
return s
|
||
}
|
||
return string(runes[:n])
|
||
}
|
||
|
||
func GetSlugInfo(text string) string {
|
||
return SanitizeSlug(slug.Make(text))
|
||
}
|
||
|
||
// SanitizeSlug 去掉 slug 中的横杠等特殊符号,只保留字母和数字
|
||
func SanitizeSlug(s string) string {
|
||
s = strings.TrimSpace(s)
|
||
if s == "" {
|
||
return ""
|
||
}
|
||
var b strings.Builder
|
||
b.Grow(len(s))
|
||
for _, r := range s {
|
||
if r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z' || r >= '0' && r <= '9' {
|
||
b.WriteRune(r)
|
||
}
|
||
}
|
||
return b.String()
|
||
}
|
||
|
||
// IsSlugAllDigits 判断 slug 是否全为数字
|
||
func IsSlugAllDigits(s string) bool {
|
||
s = strings.TrimSpace(s)
|
||
if s == "" {
|
||
return false
|
||
}
|
||
for _, r := range s {
|
||
if r < '0' || r > '9' {
|
||
return false
|
||
}
|
||
}
|
||
return true
|
||
}
|
||
|
||
// MakeUniqueSlug 生成唯一 slug;exists 返回 true 表示已被占用。生成结果不能全是数字。
|
||
func MakeUniqueSlug(source string, exists func(string) bool) string {
|
||
pinyin := GetSlugInfo(source)
|
||
if pinyin == "" {
|
||
pinyin = GetRandomLetters(5)
|
||
} else if IsSlugAllDigits(pinyin) {
|
||
pinyin = pinyin + GetRandomLetters(3)
|
||
}
|
||
finalSlug := pinyin
|
||
for exists(finalSlug) {
|
||
finalSlug = pinyin + GetRandomLetters(3)
|
||
}
|
||
return finalSlug
|
||
}
|