155 lines
3 KiB
Go
155 lines
3 KiB
Go
package utilities
|
|
|
|
import (
|
|
"golang.org/x/text/cases"
|
|
"golang.org/x/text/language"
|
|
"golang.org/x/text/runes"
|
|
"golang.org/x/text/transform"
|
|
"golang.org/x/text/unicode/norm"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
const Version = "1.0"
|
|
|
|
var normalizeTransformer = transform.Chain(
|
|
norm.NFKD,
|
|
runes.Map(func(r rune) rune {
|
|
switch r {
|
|
|
|
}
|
|
return r
|
|
}),
|
|
norm.NFC,
|
|
)
|
|
|
|
var normalizeKeyTransformer = transform.Chain(
|
|
norm.NFKD,
|
|
runes.Remove(runes.In(unicode.Cc)),
|
|
runes.Remove(runes.In(unicode.Cf)),
|
|
runes.Remove(runes.In(unicode.Mn)),
|
|
runes.Remove(runes.In(unicode.Me)),
|
|
runes.Remove(runes.In(unicode.Mc)),
|
|
runes.Remove(runes.In(unicode.Po)),
|
|
runes.Remove(runes.In(unicode.Pe)),
|
|
runes.Remove(runes.In(unicode.Ps)),
|
|
runes.Remove(runes.In(unicode.Pf)),
|
|
runes.Remove(runes.In(unicode.Pi)),
|
|
runes.Remove(runes.In(unicode.Pd)),
|
|
runes.Remove(runes.In(unicode.Pc)),
|
|
runes.Remove(runes.In(unicode.Sc)),
|
|
runes.Remove(runes.In(unicode.Sk)),
|
|
runes.Remove(runes.In(unicode.Sm)),
|
|
runes.Remove(runes.In(unicode.So)),
|
|
runes.Remove(runes.In(unicode.Space)),
|
|
cases.Lower(language.Und),
|
|
norm.NFC,
|
|
)
|
|
|
|
func NormalizeUnicode(text string) (normalized string) {
|
|
normalized, _, _ = transform.String(normalizeTransformer, text)
|
|
return
|
|
}
|
|
|
|
func NormalizeKeyUnicode(text string) (normalized string) {
|
|
normalized, _, _ = transform.String(normalizeKeyTransformer, text)
|
|
return
|
|
}
|
|
|
|
func GetMimeTypeFromExtension(ext string) string {
|
|
|
|
if len(ext) > 0 {
|
|
switch strings.ToLower(ext[1:]) {
|
|
|
|
//Audio types
|
|
case "flac":
|
|
return "audio/flac"
|
|
case "mp3":
|
|
return "audio/mpeg;codecs=mp3"
|
|
case "m4a":
|
|
return "audio/mp4"
|
|
case "mka":
|
|
return "audio/x-matroska"
|
|
case "ogg":
|
|
return "audio/ogg"
|
|
case "opus":
|
|
return "audio/opus"
|
|
case "tta":
|
|
return "audio/tta"
|
|
case "aac":
|
|
return "audio/aac"
|
|
case "alac":
|
|
return "audio/alac"
|
|
case "wav":
|
|
return "audio/wav"
|
|
case "ape":
|
|
return "audio/ape"
|
|
|
|
//Image types
|
|
case "png":
|
|
return "image/png"
|
|
case "jfif":
|
|
fallthrough
|
|
case "jpeg":
|
|
fallthrough
|
|
case "jpg":
|
|
return "image/jpeg"
|
|
case "gif":
|
|
return "image/gif"
|
|
case "svg":
|
|
return "image/svg+xml"
|
|
case "tiff":
|
|
fallthrough
|
|
case "tif":
|
|
return "image/tiff"
|
|
case "webp":
|
|
return "image/webp"
|
|
case "bmp":
|
|
return "image/bmp"
|
|
|
|
//Text types
|
|
case "txt":
|
|
return "text/plain"
|
|
case "log":
|
|
return "text/x-log"
|
|
case "accurip":
|
|
return "text/x-accurip"
|
|
case "cue":
|
|
return "text/x-cue"
|
|
case "toc":
|
|
return "text/x-toc"
|
|
|
|
//Text subtitles
|
|
case "lrc":
|
|
return "text/x-subtitle-lrc"
|
|
case "ssa":
|
|
return "text/x-subtitle-ssa"
|
|
case "ass":
|
|
return "text/x-subtitle-ass"
|
|
case "srt":
|
|
return "text/x-subtitle-subrip"
|
|
|
|
//Web types
|
|
case "js":
|
|
return "text/javascript"
|
|
case "wasm":
|
|
return "application/wasm"
|
|
case "html":
|
|
return "text/html"
|
|
case "css":
|
|
return "text/css"
|
|
case "ttf":
|
|
return "font/ttf"
|
|
case "otf":
|
|
return "font/otf"
|
|
case "woff":
|
|
return "font/woff"
|
|
case "woff2":
|
|
return "font/woff2"
|
|
|
|
}
|
|
}
|
|
|
|
return "application/octet-stream"
|
|
}
|