1#![forbid(unsafe_code)]
2#![cfg_attr(docsrs, feature(doc_cfg))]
3#![cfg_attr(docsrs, doc = include_str!("../README.md"))]
4
5mod locale;
6mod options;
7mod slug;
8
9pub use crate::locale::Locale;
10pub use crate::options::Options;
11#[cfg(feature = "parallel")]
12pub use crate::slug::par_slugify_many;
13pub use crate::slug::{slugify_many, slugify_many_auto, slugify_with_options, Slugifier};
14
15pub fn slugify(input: &str) -> String {
17 slugify_with_options(input, &Options::default())
18}
19
20#[cfg(test)]
21mod tests {
22 use super::*;
23 use regex::Regex;
24
25 #[test]
26 fn basic_english() {
27 assert_eq!(slugify("Hello, World!"), "hello-world");
28 assert_eq!(
29 slugify(" Multiple spaces\tand\nlines "),
30 "multiple-spaces-and-lines"
31 );
32 }
33
34 #[test]
35 fn custom_separator() {
36 let opts = Options::default().separator("_");
37 assert_eq!(slugify_with_options("A B C", &opts), "a_b_c");
38 }
39
40 #[test]
41 fn german_locale() {
42 let opts = Options::default().locale(Some(Locale::De));
43 assert_eq!(
44 slugify_with_options("Füße lösen Ärger", &opts),
45 "fuesse-loesen-aerger"
46 );
47 }
48
49 #[test]
50 fn turkish_locale() {
51 let opts = Options::default().locale(Some(Locale::Tr));
52 assert_eq!(
53 slugify_with_options("İstanbul'a hoş geldiniz!", &opts),
54 "istanbula-hos-geldiniz"
55 );
56 }
57
58 #[test]
59 fn remove_pattern() {
60 let opts = Options::default().remove(Some(Regex::new("[']").unwrap()));
61 assert_eq!(slugify_with_options("rock 'n' roll", &opts), "rock-n-roll");
62 }
63
64 #[test]
65 fn fluent_builder_usage() {
66 use crate::slug::Slugifier;
67 use regex::Regex;
68
69 let s = Slugifier::new()
70 .separator("_")
71 .locale(Some(Locale::Tr))
72 .remove(Some(Regex::new("[0-9]").unwrap()))
73 .lowercase(true)
74 .trim(true);
75
76 assert_eq!(
77 s.slugify("İstanbul'a 123 hoş geldiniz!"),
78 "istanbula_hos_geldiniz"
79 );
80 }
81
82 #[test]
83 fn auto_batch_usage() {
84 let v = slugify_many_auto(&["Hello World", "Crème Brûlée"], &Options::default());
85 assert_eq!(v, vec!["hello-world", "creme-brulee"]);
86 }
87}