Skip to content

Instantly share code, notes, and snippets.

@AndrewVos
Created April 20, 2022 17:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndrewVos/73d22998b300e1dfe846c92860da6762 to your computer and use it in GitHub Desktop.
Save AndrewVos/73d22998b300e1dfe846c92860da6762 to your computer and use it in GitHub Desktop.
Slug generator in vlang
fn generate_slug(name string) string {
mut slug := name
slug = slug.to_lower()
bad := 'àáâäæãåāăąçćčđďèéêëēėęěğǵḧîïíīįìıİłḿñńǹňôöòóœøōõőṕŕřßśšşșťțûüùúūǘůűųẃẍÿýžźż·/_,:;'
good := 'aaaaaaaaaacccddeeeeeeeegghiiiiiiiilmnnnnoooooooooprrsssssttuuuuuuuuuwxyyzzz------'
for i := 0; i < utf8.len(bad); i++ {
bad_character := utf8.raw_index(bad, i)
good_character := utf8.raw_index(good, i)
for {
found := slug.index(bad_character) or { -1 }
if found > -1 {
slug = slug[0..found] + good_character + slug[found + 1..]
} else {
break
}
}
}
mut white_space := regex.regex_opt(r'\s+') or { panic(err) }
slug = white_space.replace_simple(slug, '-')
slug = slug.replace('&', '-and-')
mut non_words := regex.regex_opt(r'[^a-z0-9\-]') or { panic(err) }
slug = non_words.replace_simple(slug, '')
mut multiple_hyphens := regex.regex_opt(r'-{2,}') or { panic(err) }
slug = multiple_hyphens.replace_simple(slug, '-')
slug = slug.trim('-')
return slug
}
fn test_generate_slug() {
assert generate_slug('SLUG') == 'slug'
assert generate_slug('ãéǵ1') == 'aeg1'
assert generate_slug('øø') == 'oo'
assert generate_slug('slug slug') == 'slug-slug'
assert generate_slug('slug slug') == 'slug-slug'
assert generate_slug('slug slug') == 'slug-slug'
assert generate_slug('and&and') == 'and-and-and'
assert generate_slug('!!!') == ''
assert generate_slug('multiple---hyphens') == 'multiple-hyphens'
assert generate_slug('-start') == 'start'
assert generate_slug('end-') == 'end'
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment