package util import "strings" // Slugify returns input as lowercase ASCII letters, digits and hyphens, which // is safe to put in a URL path, a filename or a fragment identifier. Every run // of other characters becomes a single hyphen, and the result never starts or // ends with one. // // Characters outside ASCII are treated as separators rather than being folded // to their nearest ASCII relative, because doing that properly needs a Unicode // table that this package does not carry. Text with no ASCII letters or digits // in it therefore slugifies to an empty string. func Slugify(input string) string { var out strings.Builder pendingHyphen := false for _, character := range strings.ToLower(input) { if (character >= 'a' && character <= 'z') || (character >= '0' && character <= '9') { if pendingHyphen { out.WriteByte('-') pendingHyphen = false } out.WriteRune(character) continue } // Remember that a separator was seen, but only write a hyphen once // another usable character turns up, so nothing trails off the end. if out.Len() > 0 { pendingHyphen = true } } return out.String() }