Files
QSfera/vendor/github.com/gookit/goutil/strutil/encode.go
T
2023-04-19 20:24:34 +02:00

203 lines
3.8 KiB
Go

package strutil
import (
"bytes"
"crypto/md5"
"encoding/base32"
"encoding/base64"
"encoding/hex"
"fmt"
"net/url"
"strings"
"text/template"
)
//
// -------------------- escape --------------------
//
// EscapeJS escape javascript string
func EscapeJS(s string) string {
return template.JSEscapeString(s)
}
// EscapeHTML escape html string
func EscapeHTML(s string) string {
return template.HTMLEscapeString(s)
}
// AddSlashes add slashes for the string.
func AddSlashes(s string) string {
if ln := len(s); ln == 0 {
return ""
}
var buf bytes.Buffer
for _, char := range s {
switch char {
case '\'', '"', '\\':
buf.WriteRune('\\')
}
buf.WriteRune(char)
}
return buf.String()
}
// StripSlashes strip slashes for the string.
func StripSlashes(s string) string {
ln := len(s)
if ln == 0 {
return ""
}
var skip bool
var buf bytes.Buffer
for i, char := range s {
if skip {
skip = false
} else if char == '\\' {
if i+1 < ln && s[i+1] == '\\' {
skip = true
}
continue
}
buf.WriteRune(char)
}
return buf.String()
}
//
// -------------------- encode --------------------
//
// Md5 Generate a 32-bit md5 string
func Md5(src any) string {
return hex.EncodeToString(Md5Bytes(src))
}
// MD5 Generate a 32-bit md5 string
func MD5(src any) string { return Md5(src) }
// GenMd5 Generate a 32-bit md5 string
func GenMd5(src any) string { return Md5(src) }
// Md5Bytes Generate a 32-bit md5 bytes
func Md5Bytes(src any) []byte {
h := md5.New()
if s, ok := src.(string); ok {
h.Write([]byte(s))
} else {
h.Write([]byte(fmt.Sprint(src)))
}
return h.Sum(nil)
}
// URLEncode encode url string.
func URLEncode(s string) string {
if pos := strings.IndexRune(s, '?'); pos > -1 { // escape query data
return s[0:pos+1] + url.QueryEscape(s[pos+1:])
}
return s
}
// URLDecode decode url string.
func URLDecode(s string) string {
if pos := strings.IndexRune(s, '?'); pos > -1 { // un-escape query data
qy, err := url.QueryUnescape(s[pos+1:])
if err == nil {
return s[0:pos+1] + qy
}
}
return s
}
//
// -------------------- base encode --------------------
//
// B32Encode base32 encode
func B32Encode(str string) string {
return base32.StdEncoding.EncodeToString([]byte(str))
}
// B32Decode base32 decode
func B32Decode(str string) string {
dec, _ := base32.StdEncoding.DecodeString(str)
return string(dec)
}
// B64Encode base64 encode
func B64Encode(str string) string {
return base64.StdEncoding.EncodeToString([]byte(str))
}
// B64EncodeBytes base64 encode
func B64EncodeBytes(src []byte) []byte {
buf := make([]byte, base64.StdEncoding.EncodedLen(len(src)))
base64.StdEncoding.Encode(buf, src)
return buf
}
// B64Decode base64 decode
func B64Decode(str string) string {
dec, _ := base64.StdEncoding.DecodeString(str)
return string(dec)
}
// B64DecodeBytes base64 decode
func B64DecodeBytes(str string) []byte {
dbuf := make([]byte, base64.StdEncoding.DecodedLen(len(str)))
n, _ := base64.StdEncoding.Decode(dbuf, []byte(str))
return dbuf[:n]
}
// BaseEncoder interface
type BaseEncoder interface {
Encode(dst []byte, src []byte)
EncodeToString(src []byte) string
Decode(dst []byte, src []byte) (n int, err error)
DecodeString(s string) ([]byte, error)
}
// BaseType for base encoding
type BaseType uint8
// types for base encoding
const (
BaseTypeStd BaseType = iota
BaseTypeHex
BaseTypeURL
BaseTypeRawStd
BaseTypeRawURL
)
// Encoding instance
func Encoding(base int, typ BaseType) BaseEncoder {
if base == 32 {
switch typ {
case BaseTypeHex:
return base32.HexEncoding
default:
return base32.StdEncoding
}
}
// base 64
switch typ {
case BaseTypeURL:
return base64.URLEncoding
case BaseTypeRawURL:
return base64.RawURLEncoding
case BaseTypeRawStd:
return base64.RawStdEncoding
default:
return base64.StdEncoding
}
}