120 lines
2.0 KiB
Go
120 lines
2.0 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
var MARKDOWN_ESC []string = []string{"_", "*", "[", "]", "(", ")", "~", "`", ">", "#", "+", "-", "=", "|", "{", "}", ".", "!"}
|
|
|
|
func Contains[T comparable](slice []T, target T) bool {
|
|
for _, v := range slice {
|
|
if v == target {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func WriteMDv2Text(sb *strings.Builder, t string) {
|
|
for _, c := range MARKDOWN_ESC {
|
|
t = strings.Replace(t, c, "\\"+c, -1)
|
|
}
|
|
|
|
sb.WriteString(t)
|
|
}
|
|
|
|
func MDv2Text(t string) string {
|
|
sb := strings.Builder{}
|
|
|
|
for _, c := range MARKDOWN_ESC {
|
|
t = strings.Replace(t, c, "\\"+c, -1)
|
|
}
|
|
|
|
sb.WriteString(t)
|
|
return sb.String()
|
|
}
|
|
|
|
func IsASCIIAlnum(s string) bool {
|
|
if s == "" {
|
|
return false
|
|
}
|
|
for i := 0; i < len(s); i++ {
|
|
c := s[i]
|
|
if !(c >= '0' && c <= '9' ||
|
|
c >= 'A' && c <= 'Z' ||
|
|
c >= 'a' && c <= 'z') {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func ToPower(t string) string {
|
|
for s, r := range POWER_NUMBERS {
|
|
t = strings.ReplaceAll(t, s, r)
|
|
}
|
|
return t
|
|
}
|
|
|
|
func ReadBOM(buff *bytes.Buffer) {
|
|
b, _ := buff.ReadByte()
|
|
if b != 0xef {
|
|
buff.UnreadByte()
|
|
return
|
|
}
|
|
b, _ = buff.ReadByte()
|
|
if b != 0xbb {
|
|
buff.UnreadByte()
|
|
buff.UnreadByte()
|
|
return
|
|
}
|
|
b, _ = buff.ReadByte()
|
|
if b != 0xbf {
|
|
buff.UnreadByte()
|
|
buff.UnreadByte()
|
|
buff.UnreadByte()
|
|
}
|
|
}
|
|
|
|
func TryGetEnv[T any](name string, fallback T) T {
|
|
v := os.Getenv(name)
|
|
|
|
if v != "" {
|
|
switch any(fallback).(type) {
|
|
case uint64:
|
|
p, err := strconv.ParseUint(v, 10, 64)
|
|
if err == nil {
|
|
return any(uint64(p)).(T)
|
|
}
|
|
case uint32:
|
|
p, err := strconv.ParseUint(v, 10, 32)
|
|
if err == nil {
|
|
return any(uint32(p)).(T)
|
|
}
|
|
case int:
|
|
p, err := strconv.ParseInt(v, 10, 32)
|
|
if err == nil {
|
|
return any(int(p)).(T)
|
|
}
|
|
case float64:
|
|
p, err := strconv.ParseFloat(v, 64)
|
|
if err == nil {
|
|
return any(float64(p)).(T)
|
|
}
|
|
case float32:
|
|
p, err := strconv.ParseFloat(v, 32)
|
|
if err == nil {
|
|
return any(float32(p)).(T)
|
|
}
|
|
default:
|
|
return any(v).(T)
|
|
}
|
|
|
|
}
|
|
|
|
return fallback
|
|
}
|