package utils import ( "strings" "unicode" ) var transliterations = strings.NewReplacer( "À", "A", "Á", "A", "Â", "A", "Ã", "A", "Ä", "A", "Å", "A", "Æ", "AE", "Ç", "C", "È", "E", "É", "E", "Ê", "E", "Ë", "E", "Ì", "I", "Í", "I", "Î", "I", "Ï", "I", "Ð", "D", "Ñ", "N", "Ò", "O", "Ó", "O", "Ô", "O", "Õ", "O", "Ö", "O", "Ø", "O", "Ù", "U", "Ú", "U", "Û", "U", "Ü", "U", "Ý", "Y", "Þ", "TH", "ß", "ss", "à", "a", "á", "a", "â", "a", "ã", "a", "ä", "a", "å", "a", "æ", "ae", "ç", "c", "è", "e", "é", "e", "ê", "e", "ë", "e", "ì", "i", "í", "i", "î", "i", "ï", "i", "ð", "d", "ñ", "n", "ò", "o", "ó", "o", "ô", "o", "õ", "o", "ö", "o", "ø", "o", "ù", "u", "ú", "u", "û", "u", "ü", "u", "ý", "y", "þ", "th", "ÿ", "y", ) // Slugify converts a string to a URL-friendly slug // It converts letters to lowercase, replaces spaces and special characters with dashes, // and removes consecutive dashes and leading/trailing dashes. // It also transliterates common accented characters to their ASCII equivalents. func Slugify(s string) string { // Transliterate common accented characters to their ASCII equivalents s = transliterations.Replace(s) var result strings.Builder result.Grow(len(s)) for _, r := range s { if unicode.IsLetter(r) || unicode.IsNumber(r) { result.WriteRune(unicode.ToLower(r)) } else if r == ' ' || r == '-' || r == '_' { result.WriteRune('-') } } slug := result.String() // Remove consecutive dashes for strings.Contains(slug, "--") { slug = strings.ReplaceAll(slug, "--", "-") } // Remove leading/trailing dashes slug = strings.Trim(slug, "-") return slug }