Andrew Gallant b1489c8445
syntax: make \p{cf} work
It turns out that 'cf' is also an abbreviation for the 'Case_Folding'
property. Even though we don't actually support a 'Case_Folding'
property, a quirk of our code caused 'cf' to fail since it was treated
as a normal boolean property instead of a general category. We fix it be
special casing it.

Note that '\p{gc=cf}' worked and continues to work.

If we ever do add the 'Case_Folding' property, we'll not be able to
support its abbreviation since it is now taken by 'Format'.

Fixes #719
2020-10-13 10:29:03 -04:00

235 lines
6.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

mat!(uni_literal, r"☃", "", Some((0, 3)));
mat!(uni_literal_plus, r"☃+", "", Some((0, 3)));
mat!(uni_literal_casei_plus, r"(?i)☃+", "", Some((0, 3)));
mat!(uni_class_plus, r"[☃Ⅰ]+", "", Some((0, 3)));
mat!(uni_one, r"\pN", "", Some((0, 3)));
mat!(uni_mixed, r"\pN+", "1Ⅱ2", Some((0, 8)));
mat!(uni_not, r"\PN+", "ab", Some((0, 2)));
mat!(uni_not_class, r"[\PN]+", "ab", Some((0, 2)));
mat!(uni_not_class_neg, r"[^\PN]+", "ab", Some((2, 5)));
mat!(uni_case, r"(?i)Δ", "δ", Some((0, 2)));
mat!(uni_case_upper, r"\p{Lu}+", "ΛΘΓΔα", Some((0, 8)));
mat!(uni_case_upper_nocase_flag, r"(?i)\p{Lu}+", "ΛΘΓΔα", Some((0, 10)));
mat!(uni_case_upper_nocase, r"\p{L}+", "ΛΘΓΔα", Some((0, 10)));
mat!(uni_case_lower, r"\p{Ll}+", "ΛΘΓΔα", Some((8, 10)));
// Test the Unicode friendliness of Perl character classes.
mat!(uni_perl_w, r"\w+", "dδd", Some((0, 4)));
mat!(uni_perl_w_not, r"\w+", "", None);
mat!(uni_perl_w_neg, r"\W+", "", Some((0, 3)));
mat!(uni_perl_d, r"\d+", "1२३9", Some((0, 8)));
mat!(uni_perl_d_not, r"\d+", "", None);
mat!(uni_perl_d_neg, r"\D+", "", Some((0, 3)));
mat!(uni_perl_s, r"\s+", "", Some((0, 3)));
mat!(uni_perl_s_not, r"\s+", "", None);
mat!(uni_perl_s_neg, r"\S+", "", Some((0, 3)));
// And do the same for word boundaries.
mat!(uni_boundary_none, r"\d\b", "", None);
mat!(uni_boundary_ogham, r"\d\b", "6", Some((0, 1)));
mat!(uni_not_boundary_none, r"\d\B", "", Some((0, 1)));
mat!(uni_not_boundary_ogham, r"\d\B", "6", None);
// Test general categories.
//
// We should test more, but there's a lot. Write a script to generate more of
// these tests.
mat!(uni_class_gencat_cased_letter, r"\p{Cased_Letter}", "", Some((0, 3)));
mat!(
uni_class_gencat_close_punctuation,
r"\p{Close_Punctuation}",
"",
Some((0, 3))
);
mat!(
uni_class_gencat_connector_punctuation,
r"\p{Connector_Punctuation}",
"",
Some((0, 3))
);
mat!(uni_class_gencat_control, r"\p{Control}", "\u{9f}", Some((0, 2)));
mat!(
uni_class_gencat_currency_symbol,
r"\p{Currency_Symbol}",
"",
Some((0, 3))
);
mat!(
uni_class_gencat_dash_punctuation,
r"\p{Dash_Punctuation}",
"",
Some((0, 3))
);
mat!(uni_class_gencat_decimal_numer, r"\p{Decimal_Number}", "𑓙", Some((0, 4)));
mat!(
uni_class_gencat_enclosing_mark,
r"\p{Enclosing_Mark}",
"\u{A672}",
Some((0, 3))
);
mat!(
uni_class_gencat_final_punctuation,
r"\p{Final_Punctuation}",
"",
Some((0, 3))
);
mat!(uni_class_gencat_format, r"\p{Format}", "\u{E007F}", Some((0, 4)));
// See: https://github.com/rust-lang/regex/issues/719
mat!(uni_class_gencat_format_abbrev1, r"\p{cf}", "\u{E007F}", Some((0, 4)));
mat!(uni_class_gencat_format_abbrev2, r"\p{gc=cf}", "\u{E007F}", Some((0, 4)));
mat!(
uni_class_gencat_initial_punctuation,
r"\p{Initial_Punctuation}",
"",
Some((0, 3))
);
mat!(uni_class_gencat_letter, r"\p{Letter}", "Έ", Some((0, 2)));
mat!(uni_class_gencat_letter_number, r"\p{Letter_Number}", "", Some((0, 3)));
mat!(
uni_class_gencat_line_separator,
r"\p{Line_Separator}",
"\u{2028}",
Some((0, 3))
);
mat!(
uni_class_gencat_lowercase_letter,
r"\p{Lowercase_Letter}",
"ϛ",
Some((0, 2))
);
mat!(uni_class_gencat_mark, r"\p{Mark}", "\u{E01EF}", Some((0, 4)));
mat!(uni_class_gencat_math, r"\p{Math}", "", Some((0, 3)));
mat!(
uni_class_gencat_modifier_letter,
r"\p{Modifier_Letter}",
"𖭃",
Some((0, 4))
);
mat!(
uni_class_gencat_modifier_symbol,
r"\p{Modifier_Symbol}",
"🏿",
Some((0, 4))
);
mat!(
uni_class_gencat_nonspacing_mark,
r"\p{Nonspacing_Mark}",
"\u{1E94A}",
Some((0, 4))
);
mat!(uni_class_gencat_number, r"\p{Number}", "", Some((0, 3)));
mat!(
uni_class_gencat_open_punctuation,
r"\p{Open_Punctuation}",
"",
Some((0, 3))
);
mat!(uni_class_gencat_other, r"\p{Other}", "\u{bc9}", Some((0, 3)));
mat!(uni_class_gencat_other_letter, r"\p{Other_Letter}", "", Some((0, 3)));
mat!(uni_class_gencat_other_number, r"\p{Other_Number}", "", Some((0, 3)));
mat!(
uni_class_gencat_other_punctuation,
r"\p{Other_Punctuation}",
"𞥞",
Some((0, 4))
);
mat!(uni_class_gencat_other_symbol, r"\p{Other_Symbol}", "", Some((0, 3)));
mat!(
uni_class_gencat_paragraph_separator,
r"\p{Paragraph_Separator}",
"\u{2029}",
Some((0, 3))
);
mat!(
uni_class_gencat_private_use,
r"\p{Private_Use}",
"\u{10FFFD}",
Some((0, 4))
);
mat!(uni_class_gencat_punctuation, r"\p{Punctuation}", "𑁍", Some((0, 4)));
mat!(uni_class_gencat_separator, r"\p{Separator}", "\u{3000}", Some((0, 3)));
mat!(
uni_class_gencat_space_separator,
r"\p{Space_Separator}",
"\u{205F}",
Some((0, 3))
);
mat!(
uni_class_gencat_spacing_mark,
r"\p{Spacing_Mark}",
"\u{16F7E}",
Some((0, 4))
);
mat!(uni_class_gencat_symbol, r"\p{Symbol}", "", Some((0, 3)));
mat!(
uni_class_gencat_titlecase_letter,
r"\p{Titlecase_Letter}",
"",
Some((0, 3))
);
mat!(
uni_class_gencat_unassigned,
r"\p{Unassigned}",
"\u{10FFFF}",
Some((0, 4))
);
mat!(
uni_class_gencat_uppercase_letter,
r"\p{Uppercase_Letter}",
"",
Some((0, 3))
);
// Test a smattering of properties.
mat!(uni_class_prop_emoji1, r"\p{Emoji}", "\u{23E9}", Some((0, 3)));
mat!(uni_class_prop_emoji2, r"\p{emoji}", "\u{1F21A}", Some((0, 4)));
mat!(
uni_class_prop_picto1,
r"\p{extendedpictographic}",
"\u{1FA6E}",
Some((0, 4))
);
mat!(
uni_class_prop_picto2,
r"\p{extendedpictographic}",
"\u{1FFFD}",
Some((0, 4))
);
// grapheme_cluster_break
mat!(
uni_class_gcb_prepend,
r"\p{grapheme_cluster_break=prepend}",
"\u{11D46}",
Some((0, 4))
);
mat!(
uni_class_gcb_ri1,
r"\p{gcb=regional_indicator}",
"\u{1F1E6}",
Some((0, 4))
);
mat!(uni_class_gcb_ri2, r"\p{gcb=ri}", "\u{1F1E7}", Some((0, 4)));
mat!(
uni_class_gcb_ri3,
r"\p{gcb=regionalindicator}",
"\u{1F1FF}",
Some((0, 4))
);
mat!(uni_class_gcb_lvt, r"\p{gcb=lvt}", "\u{C989}", Some((0, 3)));
mat!(uni_class_gcb_zwj, r"\p{gcb=zwj}", "\u{200D}", Some((0, 3)));
// word_break
mat!(uni_class_wb1, r"\p{word_break=Hebrew_Letter}", "\u{FB46}", Some((0, 3)));
mat!(uni_class_wb2, r"\p{wb=hebrewletter}", "\u{FB46}", Some((0, 3)));
mat!(uni_class_wb3, r"\p{wb=ExtendNumLet}", "\u{FF3F}", Some((0, 3)));
mat!(uni_class_wb4, r"\p{wb=WSegSpace}", "\u{3000}", Some((0, 3)));
mat!(uni_class_wb5, r"\p{wb=numeric}", "\u{1E950}", Some((0, 4)));
// sentence_break
mat!(uni_class_sb1, r"\p{sentence_break=Lower}", "\u{0469}", Some((0, 2)));
mat!(uni_class_sb2, r"\p{sb=lower}", "\u{0469}", Some((0, 2)));
mat!(uni_class_sb3, r"\p{sb=Close}", "\u{FF60}", Some((0, 3)));
mat!(uni_class_sb4, r"\p{sb=Close}", "\u{1F677}", Some((0, 4)));
mat!(uni_class_sb5, r"\p{sb=SContinue}", "\u{FF64}", Some((0, 3)));