47 lines
766 B
Go
47 lines
766 B
Go
package slug
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/gosimple/unidecode"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
type Slug string
|
|
|
|
var (
|
|
ErrInvalidSlug = errors.New("invalid slug")
|
|
|
|
regexpNonAuthorizedChars = regexp.MustCompile("[^a-zA-Z0-9-_]")
|
|
regexpMultipleDashes = regexp.MustCompile("-+")
|
|
)
|
|
|
|
func New(s string) Slug {
|
|
s = unidecode.Unidecode(s)
|
|
s = strings.ToLower(s)
|
|
s = regexpNonAuthorizedChars.ReplaceAllString(s, "-")
|
|
s = regexpMultipleDashes.ReplaceAllString(s, "-")
|
|
s = strings.Trim(s, "-_")
|
|
|
|
return Slug(s)
|
|
}
|
|
|
|
func NewString(s string) string {
|
|
return New(s).String()
|
|
}
|
|
|
|
func Validate(s string) error {
|
|
if s == "" {
|
|
return ErrInvalidSlug
|
|
}
|
|
|
|
if s == NewString(s) {
|
|
return nil
|
|
}
|
|
|
|
return ErrInvalidSlug
|
|
}
|
|
|
|
func (s Slug) String() string {
|
|
return string(s)
|
|
}
|