diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 359d7fb..f9b213c 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -18,10 +18,15 @@ jobs: toolchain: 1.32 default: true profile: minimal - - name: Build + - name: Build default uses: actions-rs/cargo@v1 with: command: build + - name: Build with unicode segmentation on + uses: actions-rs/cargo@v1 + with: + args: --features unicode + command: build # Use stable for other jobs - uses: actions-rs/toolchain@v1 with: diff --git a/Cargo.toml b/Cargo.toml index fc9242c..a3a9fa5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,5 +12,9 @@ keywords = ["string", "case", "camel", "snake", "unicode"] readme = "README.md" include = ["src/**/*", "LICENSE-*", "README.md", "CHANGELOG.md"] +[features] +default = [] +unicode = ["unicode-segmentation"] + [dependencies] -unicode-segmentation = "1.2.0" +unicode-segmentation = { version = "1.2.0", optional = true } diff --git a/src/kebab.rs b/src/kebab.rs index 75d64a5..6cce5a5 100644 --- a/src/kebab.rs +++ b/src/kebab.rs @@ -64,6 +64,7 @@ mod tests { t!(test6: "SHOUTY_SNAKE_CASE" => "shouty-snake-case"); t!(test7: "snake_case" => "snake-case"); t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "this-contains-all-kinds-of-word-boundaries"); + #[cfg(feature = "unicode")] t!(test9: "XΣXΣ baffle" => "xσxς-baffle"); t!(test10: "XMLHttpRequest" => "xml-http-request"); } diff --git a/src/lib.rs b/src/lib.rs index 9a9965c..21a45f0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -62,7 +62,15 @@ pub use upper_camel::{ use std::fmt; -use unicode_segmentation::UnicodeSegmentation; +#[cfg(feature = "unicode")] +fn get_iterator(s: &str) -> unicode_segmentation::UnicodeWords { + use unicode_segmentation::UnicodeSegmentation; + s.unicode_words() +} +#[cfg(not(feature = "unicode"))] +fn get_iterator(s: &str) -> impl Iterator { + s.split(|letter: char| !letter.is_ascii_alphanumeric()) +} fn transform( s: &str, @@ -96,7 +104,7 @@ where let mut first_word = true; - for word in s.unicode_words() { + for word in get_iterator(s) { let mut char_indices = word.char_indices().peekable(); let mut init = 0; let mut mode = WordMode::Boundary; diff --git a/src/lower_camel.rs b/src/lower_camel.rs index 5962096..f1d6c94 100644 --- a/src/lower_camel.rs +++ b/src/lower_camel.rs @@ -78,6 +78,7 @@ mod tests { t!(test6: "SHOUTY_SNAKE_CASE" => "shoutySnakeCase"); t!(test7: "snake_case" => "snakeCase"); t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "thisContainsAllKindsOfWordBoundaries"); + #[cfg(feature = "unicode")] t!(test9: "XΣXΣ baffle" => "xσxςBaffle"); t!(test10: "XMLHttpRequest" => "xmlHttpRequest"); // TODO unicode tests diff --git a/src/shouty_kebab.rs b/src/shouty_kebab.rs index d865d8c..e679978 100644 --- a/src/shouty_kebab.rs +++ b/src/shouty_kebab.rs @@ -65,6 +65,7 @@ mod tests { t!(test6: "SHOUTY_SNAKE_CASE" => "SHOUTY-SNAKE-CASE"); t!(test7: "snake_case" => "SNAKE-CASE"); t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "THIS-CONTAINS-ALL-KINDS-OF-WORD-BOUNDARIES"); + #[cfg(feature = "unicode")] t!(test9: "XΣXΣ baffle" => "XΣXΣ-BAFFLE"); t!(test10: "XMLHttpRequest" => "XML-HTTP-REQUEST"); t!(test11: "SHOUTY-KEBAB-CASE" => "SHOUTY-KEBAB-CASE"); diff --git a/src/shouty_snake.rs b/src/shouty_snake.rs index 0146696..d504375 100644 --- a/src/shouty_snake.rs +++ b/src/shouty_snake.rs @@ -79,6 +79,7 @@ mod tests { t!(test6: "SHOUTY_SNAKE_CASE" => "SHOUTY_SNAKE_CASE"); t!(test7: "snake_case" => "SNAKE_CASE"); t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "THIS_CONTAINS_ALL_KINDS_OF_WORD_BOUNDARIES"); + #[cfg(feature = "unicode")] t!(test9: "XΣXΣ baffle" => "XΣXΣ_BAFFLE"); t!(test10: "XMLHttpRequest" => "XML_HTTP_REQUEST"); } diff --git a/src/snake.rs b/src/snake.rs index 8a466fe..127a864 100644 --- a/src/snake.rs +++ b/src/snake.rs @@ -77,6 +77,7 @@ mod tests { t!(test6: "SHOUTY_SNAKE_CASE" => "shouty_snake_case"); t!(test7: "snake_case" => "snake_case"); t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "this_contains_all_kinds_of_word_boundaries"); + #[cfg(feature = "unicode")] t!(test9: "XΣXΣ baffle" => "xσxς_baffle"); t!(test10: "XMLHttpRequest" => "xml_http_request"); t!(test11: "FIELD_NAME11" => "field_name11"); diff --git a/src/title.rs b/src/title.rs index 5932bfd..fdf175b 100644 --- a/src/title.rs +++ b/src/title.rs @@ -65,6 +65,7 @@ mod tests { t!(test6: "SHOUTY_SNAKE_CASE" => "Shouty Snake Case"); t!(test7: "snake_case" => "Snake Case"); t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "This Contains All Kinds Of Word Boundaries"); + #[cfg(feature = "unicode")] t!(test9: "XΣXΣ baffle" => "Xσxς Baffle"); t!(test10: "XMLHttpRequest" => "Xml Http Request"); } diff --git a/src/upper_camel.rs b/src/upper_camel.rs index 9fdd43a..70bf4ac 100644 --- a/src/upper_camel.rs +++ b/src/upper_camel.rs @@ -78,6 +78,7 @@ mod tests { t!(test6: "SHOUTY_SNAKE_CASE" => "ShoutySnakeCase"); t!(test7: "snake_case" => "SnakeCase"); t!(test8: "this-contains_ ALLKinds OfWord_Boundaries" => "ThisContainsAllKindsOfWordBoundaries"); + #[cfg(feature = "unicode")] t!(test9: "XΣXΣ baffle" => "XσxςBaffle"); t!(test10: "XMLHttpRequest" => "XmlHttpRequest"); }