Skip to content

A Rust crate to handle unicode title casing

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

Teh-Bobo/unicode-title-case

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Unicode Titlecase

Unicode titlecasing operations for chars and strings. The crate supports additional functionality for the TR/AZ locales.

GitHub Workflow Status docs.rs Crates.io Crates.io

Usage

Chars

To turn a char into its titlecase equivalent [char; 3]array:

use unicode_titlecase::to_titlecase;

assert_eq!(to_titlecase('A'), ['A', '\0', '\0']);
assert_eq!(to_titlecase('DŽ'), ['Dž', '\0', '\0']);
assert_eq!(to_titlecase('ffl'), ['F', 'f', 'l']);

Or use the iterator version that follows the same format as the std library. The crate defines a Trait that is implemented on char:

use unicode_titlecase::TitleCase;
assert_eq!('i'.to_titlecase().to_string(), "I");
assert_eq!('A'.to_titlecase().to_string(), "A");
assert_eq!('DŽ'.to_titlecase().to_string(), "Dž");
assert_eq!('ffl'.to_titlecase().to_string(), "Ffl");

Strings

A similar trait is defined on str. This will titlecase the first char of the string, leave the rest unchanged, and return a newly allocated String.

use unicode_titlecase::StrTitleCase;
assert_eq!("iii".to_titlecase(), "Iii");
assert_eq!("ABC".to_titlecase(), "ABC");
assert_eq!("DŽDŽ".to_titlecase(), "DžDŽ");
assert_eq!("fflabc".to_titlecase(), "Fflabc");

Alternatively, you could lowercase the rest of the str:

use unicode_titlecase::StrTitleCase;
assert_eq!("iIi".to_titlecase_lower_rest(), "Iii");
assert_eq!("ABC".to_titlecase_lower_rest(), "Abc");
assert_eq!("DŽDŽ".to_titlecase_lower_rest(), "Dždž");
assert_eq!("fflabc".to_titlecase_lower_rest(), "Fflabc");

Testing a char or str

To see if the char is already titlecase, is_titlecase is provided:

use unicode_titlecase::TitleCase;
assert!('A'.is_titlecase());
assert!('Dž'.is_titlecase());
assert!('İ'.is_titlecase());

assert!(!'a'.is_titlecase());
assert!(!'DŽ'.is_titlecase());
assert!(!'ffl'.is_titlecase());

To test if a str is already titlecase, two options are provided. The first, starts_titlecase returns true if the first character is titlecased--ignoring the rest of the str. The second starts_titlecase_rest_lower only returns true if the first char is titlecase and the rest of the str is lowercase.

use unicode_titlecase::StrTitleCase;
assert!("Abc".starts_titlecase());
assert!("ABC".starts_titlecase());
assert!(!"abc".starts_titlecase());

assert!("Abc".starts_titlecase_rest_lower());
assert!("İbc".starts_titlecase_rest_lower());
assert!(!"abc".starts_titlecase_rest_lower());
assert!(!"ABC".starts_titlecase_rest_lower());
assert!(!"İİ".starts_titlecase_rest_lower());

All testing functions work the same regardless of locale.

Locale

The Turkish and Azeri (TR/AZ) locales have different rules for how to titlecase certain characters. The to_titlecase functions assume the locale is neither of these locations. A "tr_or_az" version of each function is provided instead.

use unicode_titlecase::{to_titlecase_tr_or_az, StrTitleCase, TitleCase};
assert_eq!(to_titlecase_tr_or_az('i'), ['İ', '\0', '\0']);
assert_eq!('i'.to_titlecase_tr_or_az().to_string(), "İ");
assert_eq!("iIi".to_titlecase_tr_or_az(), "İIi");
assert_eq!("iIi".to_titlecase_tr_or_az_lower_rest(), "İıi");

Additionally, there are upper and lower case utilities for the Turkish and Azeri located in the tr_az module.

use unicode_titlecase::tr_az::{to_uppercase_tr_or_az, to_lowercase_tr_or_az, StrTrAzCasing};
assert_eq!(to_uppercase_tr_or_az('i').to_string(), "İ");
assert_eq!(to_lowercase_tr_or_az('I'), 'ı');
assert_eq!("İIAb".to_lowercase_tr_az(), "iıab");
assert_eq!("iıab".to_uppercase_tr_az(), "İIAB");

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

About

A Rust crate to handle unicode title casing

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Languages