slugrs/
lib.rs

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
15/// Slugify with default options.
16pub 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}