pub(super) fn java_knows(name: &str, unicode_classes: bool) -> bool {
if let Some((key, value)) = name.split_once('=') {
return match key.to_lowercase().as_str() {
"sc" | "script" => is_script(value),
"gc" | "general_category" => FOR_PROPERTY.contains(&value),
"blk" | "block" => true,
_ => false,
};
}
if name.starts_with("In") {
return true;
}
if let Some(short) = name.strip_prefix("Is") {
let upper = short.to_uppercase();
return UNICODE_PROPERTIES.contains(&upper.as_str())
|| POSIX_NAMES.contains(&upper.as_str())
|| FOR_PROPERTY.contains(&short)
|| is_script(short);
}
(unicode_classes && POSIX_NAMES.contains(&name.to_uppercase().as_str()))
|| FOR_PROPERTY.contains(&name)
}
fn is_script(name: &str) -> bool { SCRIPTS.binary_search(&name.to_uppercase().as_str()).is_ok() }
const UNICODE_PROPERTIES: &[&str] = &[
"ALPHABETIC",
"ASSIGNED",
"CONTROL",
"EMOJI",
"EMOJI_PRESENTATION",
"EMOJI_MODIFIER",
"EMOJI_MODIFIER_BASE",
"EMOJI_COMPONENT",
"EXTENDED_PICTOGRAPHIC",
"HEXDIGIT",
"HEX_DIGIT",
"IDEOGRAPHIC",
"JOINCONTROL",
"JOIN_CONTROL",
"LETTER",
"LOWERCASE",
"NONCHARACTERCODEPOINT",
"NONCHARACTER_CODE_POINT",
"TITLECASE",
"PUNCTUATION",
"UPPERCASE",
"WHITESPACE",
"WHITE_SPACE",
"WORD",
];
const POSIX_NAMES: &[&str] = &[
"ALPHA", "LOWER", "UPPER", "SPACE", "PUNCT", "XDIGIT", "ALNUM", "CNTRL", "DIGIT", "BLANK",
"GRAPH", "PRINT",
];
const FOR_PROPERTY: &[&str] = &[
"Cn",
"Lu",
"Ll",
"Lt",
"Lm",
"Lo",
"Mn",
"Me",
"Mc",
"Nd",
"Nl",
"No",
"Zs",
"Zl",
"Zp",
"Cc",
"Cf",
"Co",
"Cs",
"Pd",
"Ps",
"Pe",
"Pc",
"Po",
"Sm",
"Sc",
"Sk",
"So",
"Pi",
"Pf",
"L",
"M",
"N",
"Z",
"C",
"P",
"S",
"LC",
"LD",
"L1",
"all",
"ASCII",
"Alnum",
"Alpha",
"Blank",
"Cntrl",
"Digit",
"Graph",
"Lower",
"Print",
"Punct",
"Space",
"Upper",
"XDigit",
"javaLowerCase",
"javaUpperCase",
"javaAlphabetic",
"javaIdeographic",
"javaTitleCase",
"javaDigit",
"javaDefined",
"javaLetter",
"javaLetterOrDigit",
"javaJavaIdentifierStart",
"javaJavaIdentifierPart",
"javaUnicodeIdentifierStart",
"javaUnicodeIdentifierPart",
"javaIdentifierIgnorable",
"javaSpaceChar",
"javaWhitespace",
"javaISOControl",
"javaMirrored",
];
const SCRIPTS: &[&str] = &[
"ADLAM",
"ADLM",
"AGHB",
"AHOM",
"ANATOLIAN_HIEROGLYPHS",
"ARAB",
"ARABIC",
"ARMENIAN",
"ARMI",
"ARMN",
"AVESTAN",
"AVST",
"BALI",
"BALINESE",
"BAMU",
"BAMUM",
"BASS",
"BASSA_VAH",
"BATAK",
"BATK",
"BENG",
"BENGALI",
"BHAIKSUKI",
"BHKS",
"BOPO",
"BOPOMOFO",
"BRAH",
"BRAHMI",
"BRAI",
"BRAILLE",
"BUGI",
"BUGINESE",
"BUHD",
"BUHID",
"CAKM",
"CANADIAN_ABORIGINAL",
"CANS",
"CARI",
"CARIAN",
"CAUCASIAN_ALBANIAN",
"CHAKMA",
"CHAM",
"CHER",
"CHEROKEE",
"CHORASMIAN",
"CHRS",
"COMMON",
"COPT",
"COPTIC",
"CPMN",
"CPRT",
"CUNEIFORM",
"CYPRIOT",
"CYPRO_MINOAN",
"CYRILLIC",
"CYRL",
"DESERET",
"DEVA",
"DEVANAGARI",
"DIAK",
"DIVES_AKURU",
"DOGR",
"DOGRA",
"DSRT",
"DUPL",
"DUPLOYAN",
"EGYP",
"EGYPTIAN_HIEROGLYPHS",
"ELBA",
"ELBASAN",
"ELYM",
"ELYMAIC",
"ETHI",
"ETHIOPIC",
"GARA",
"GARAY",
"GEOR",
"GEORGIAN",
"GLAG",
"GLAGOLITIC",
"GONG",
"GONM",
"GOTH",
"GOTHIC",
"GRAN",
"GRANTHA",
"GREEK",
"GREK",
"GUJARATI",
"GUJR",
"GUKH",
"GUNJALA_GONDI",
"GURMUKHI",
"GURU",
"GURUNG_KHEMA",
"HAN",
"HANG",
"HANGUL",
"HANI",
"HANIFI_ROHINGYA",
"HANO",
"HANUNOO",
"HATR",
"HATRAN",
"HEBR",
"HEBREW",
"HIRA",
"HIRAGANA",
"HLUW",
"HMNG",
"HMNP",
"HUNG",
"IMPERIAL_ARAMAIC",
"INHERITED",
"INSCRIPTIONAL_PAHLAVI",
"INSCRIPTIONAL_PARTHIAN",
"ITAL",
"JAVA",
"JAVANESE",
"KAITHI",
"KALI",
"KANA",
"KANNADA",
"KATAKANA",
"KAWI",
"KAYAH_LI",
"KHAR",
"KHAROSHTHI",
"KHITAN_SMALL_SCRIPT",
"KHMER",
"KHMR",
"KHOJ",
"KHOJKI",
"KHUDAWADI",
"KIRAT_RAI",
"KITS",
"KNDA",
"KRAI",
"KTHI",
"LANA",
"LAO",
"LAOO",
"LATIN",
"LATN",
"LEPC",
"LEPCHA",
"LIMB",
"LIMBU",
"LINA",
"LINB",
"LINEAR_A",
"LINEAR_B",
"LISU",
"LYCI",
"LYCIAN",
"LYDI",
"LYDIAN",
"MAHAJANI",
"MAHJ",
"MAKA",
"MAKASAR",
"MALAYALAM",
"MAND",
"MANDAIC",
"MANI",
"MANICHAEAN",
"MARC",
"MARCHEN",
"MASARAM_GONDI",
"MEDEFAIDRIN",
"MEDF",
"MEETEI_MAYEK",
"MEND",
"MENDE_KIKAKUI",
"MERC",
"MERO",
"MEROITIC_CURSIVE",
"MEROITIC_HIEROGLYPHS",
"MIAO",
"MLYM",
"MODI",
"MONG",
"MONGOLIAN",
"MRO",
"MROO",
"MTEI",
"MULT",
"MULTANI",
"MYANMAR",
"MYMR",
"NABATAEAN",
"NAGM",
"NAG_MUNDARI",
"NAND",
"NANDINAGARI",
"NARB",
"NBAT",
"NEWA",
"NEW_TAI_LUE",
"NKO",
"NKOO",
"NSHU",
"NUSHU",
"NYIAKENG_PUACHUE_HMONG",
"OGAM",
"OGHAM",
"OLCK",
"OLD_HUNGARIAN",
"OLD_ITALIC",
"OLD_NORTH_ARABIAN",
"OLD_PERMIC",
"OLD_PERSIAN",
"OLD_SOGDIAN",
"OLD_SOUTH_ARABIAN",
"OLD_TURKIC",
"OLD_UYGHUR",
"OL_CHIKI",
"OL_ONAL",
"ONAO",
"ORIYA",
"ORKH",
"ORYA",
"OSAGE",
"OSGE",
"OSMA",
"OSMANYA",
"OUGR",
"PAHAWH_HMONG",
"PALM",
"PALMYRENE",
"PAUC",
"PAU_CIN_HAU",
"PERM",
"PHAG",
"PHAGS_PA",
"PHLI",
"PHLP",
"PHNX",
"PHOENICIAN",
"PLRD",
"PRTI",
"PSALTER_PAHLAVI",
"REJANG",
"RJNG",
"ROHG",
"RUNIC",
"RUNR",
"SAMARITAN",
"SAMR",
"SARB",
"SAUR",
"SAURASHTRA",
"SGNW",
"SHARADA",
"SHAVIAN",
"SHAW",
"SHRD",
"SIDD",
"SIDDHAM",
"SIGNWRITING",
"SIND",
"SINH",
"SINHALA",
"SOGD",
"SOGDIAN",
"SOGO",
"SORA",
"SORA_SOMPENG",
"SOYO",
"SOYOMBO",
"SUND",
"SUNDANESE",
"SUNU",
"SUNUWAR",
"SYLO",
"SYLOTI_NAGRI",
"SYRC",
"SYRIAC",
"TAGALOG",
"TAGB",
"TAGBANWA",
"TAI_LE",
"TAI_THAM",
"TAI_VIET",
"TAKR",
"TAKRI",
"TALE",
"TALU",
"TAMIL",
"TAML",
"TANG",
"TANGSA",
"TANGUT",
"TAVT",
"TELU",
"TELUGU",
"TFNG",
"TGLG",
"THAA",
"THAANA",
"THAI",
"TIBETAN",
"TIBT",
"TIFINAGH",
"TIRH",
"TIRHUTA",
"TNSA",
"TODHRI",
"TODR",
"TOTO",
"TULU_TIGALARI",
"TUTG",
"UGAR",
"UGARITIC",
"UNKNOWN",
"VAI",
"VAII",
"VITH",
"VITHKUQI",
"WANCHO",
"WARA",
"WARANG_CITI",
"WCHO",
"XPEO",
"XSUX",
"YEZI",
"YEZIDI",
"YI",
"YIII",
"ZANABAZAR_SQUARE",
"ZANB",
"ZINH",
"ZYYY",
"ZZZZ",
];
#[cfg(test)]
mod tests {
use {super::*, assert2::check};
#[test]
fn the_scripts_are_sorted_for_the_binary_search() {
check!(SCRIPTS.is_sorted());
}
}