Initial commit
This commit is contained in:
77
furcadia/util.go
Normal file
77
furcadia/util.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package furcadia
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// GetShortName returns a "shortname" derived from a given Furcadia display name
|
||||
func GetShortName(displayName string) string {
|
||||
sb := &strings.Builder{}
|
||||
for _, r := range displayName {
|
||||
if unicode.IsLetter(r) || unicode.IsNumber(r) {
|
||||
sb.WriteRune(unicode.ToLower(r))
|
||||
}
|
||||
}
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// GetShortDreamURL converts a regular "furc://uploader:name/" dream url into
|
||||
// a "short" form that can be used as a hash key (e.g., "uploader:name").
|
||||
//
|
||||
// ErrInvalidDreamURL is returned if the given url is not a valid dream URL.
|
||||
func GetShortDreamURL(url string) (string, error) {
|
||||
// cut prefix
|
||||
u, found := strings.CutPrefix(strings.ToLower(url), "furc://")
|
||||
if !found {
|
||||
return "", ErrInvalidDreamURL
|
||||
}
|
||||
|
||||
// cut suffix
|
||||
u = strings.SplitN(u, "/", 2)[0]
|
||||
|
||||
// split uploader name and dream name
|
||||
var uploaderName string
|
||||
var dreamName string
|
||||
|
||||
elements := strings.Split(u, ":")
|
||||
switch len(elements) {
|
||||
case 0:
|
||||
panic(fmt.Sprintf("len(%v) == 0", elements))
|
||||
case 1:
|
||||
uploaderName = elements[0]
|
||||
dreamName = ""
|
||||
case 2:
|
||||
uploaderName = elements[0]
|
||||
dreamName = elements[1]
|
||||
default:
|
||||
return "", ErrInvalidDreamURL
|
||||
}
|
||||
|
||||
short := GetShortDreamURLFromName(uploaderName, dreamName)
|
||||
if short == "" || short[0] == ':' {
|
||||
// furc://
|
||||
// furc:///
|
||||
// furc://:/
|
||||
// furc://:something/
|
||||
return "", ErrInvalidDreamURL
|
||||
}
|
||||
|
||||
return short, nil
|
||||
}
|
||||
|
||||
func GetShortDreamURLFromName(uploaderName, dreamName string) (short string) {
|
||||
shortName := GetShortName(uploaderName)
|
||||
shortDream := GetShortName(dreamName)
|
||||
if shortDream == "" {
|
||||
short = shortName
|
||||
} else {
|
||||
short = shortName + ":" + shortDream
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user