From b1bcf4b55abee4a2a89f15ba0d2debd4295c31c6 Mon Sep 17 00:00:00 2001 From: Niels Saurer Date: Sun, 3 Sep 2023 19:17:53 +0200 Subject: [PATCH 1/2] add hardcoded inverses --- .../transliterator_parser/src/parse.rs | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/experimental/transliterator_parser/src/parse.rs b/experimental/transliterator_parser/src/parse.rs index 7bd353f196d..ada4a45509b 100644 --- a/experimental/transliterator_parser/src/parse.rs +++ b/experimental/transliterator_parser/src/parse.rs @@ -108,21 +108,26 @@ pub(crate) struct BasicId { } impl BasicId { - pub(crate) fn is_null(&self) -> bool { - self.source.to_lowercase() == "any" - && self.target.to_lowercase() == "null" - && self.variant.is_none() - } - pub(crate) fn reverse(self) -> Self { - if self.is_null() { - return self; - } - // TODO(#3736): add hardcoded reverses here + let source = self.source.to_lowercase(); + let target = self.target.to_lowercase(); + let (new_source, new_target) = match (source.as_str(), target.as_str()) { + // hardcoded inverses + ("any", "lower") => (self.source, "Upper".to_string()), + ("any", "upper") => (self.source, "Lower".to_string()), + ("any", "nfc") => (self.source, "NFD".to_string()), + ("any", "nfd") => (self.source, "NFC".to_string()), + ("any", "nfkc") => (self.source, "NFKD".to_string()), + ("any", "nfkd") => (self.source, "NFKC".to_string()), + // no-ops + ("any", "remove" | "null") => (self.source, self.target), + // default inverse swaps source and target + _ => (self.target, self.source), + }; Self { - source: self.target, - target: self.source, + source: new_source, + target: new_target, variant: self.variant, } } From d59d871221ebd08e7b2e2b288a4790b2ab18ecb0 Mon Sep 17 00:00:00 2001 From: Niels Saurer Date: Sun, 3 Sep 2023 19:23:45 +0200 Subject: [PATCH 2/2] add tests --- experimental/transliterator_parser/src/lib.rs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/experimental/transliterator_parser/src/lib.rs b/experimental/transliterator_parser/src/lib.rs index 4f3a3c48b3f..e451acea54c 100644 --- a/experimental/transliterator_parser/src/lib.rs +++ b/experimental/transliterator_parser/src/lib.rs @@ -191,6 +191,7 @@ mod tests { # splits up the forward rules forward rule that > splits up rule groups ; :: InterIndic-Devanagari ; + :: NFC ; "; let t_map = HashMap::from([( @@ -219,10 +220,16 @@ mod tests { filter: parse_set_cp(r"[\ ]"), id: Cow::Borrowed("x-any-remove"), }]; - let expected_id_group3 = vec![ds::SimpleId { - filter: FilterSet::all(), - id: Cow::Borrowed("x-interindic-devanagari"), - }]; + let expected_id_group3 = vec![ + ds::SimpleId { + filter: FilterSet::all(), + id: Cow::Borrowed("x-interindic-devanagari"), + }, + ds::SimpleId { + filter: FilterSet::all(), + id: Cow::Borrowed("x-any-nfc"), + }, + ]; let expected_id_group_list: Vec> = vec![ VarZeroVec::from(&expected_id_group1), @@ -293,6 +300,7 @@ mod tests { variable_table: expected_var_table, visibility: true, dependencies: VarZeroVec::from(&[ + "x-any-nfc", "x-any-remove", "x-interindic-devanagari", "x-latin-interindic", @@ -304,6 +312,10 @@ mod tests { let expected_filter = FilterSet::all(); let expected_id_group1 = vec![ + ds::SimpleId { + filter: FilterSet::all(), + id: Cow::Borrowed("x-any-nfd"), + }, ds::SimpleId { filter: FilterSet::all(), id: Cow::Borrowed("x-devanagari-interindic"), @@ -390,6 +402,7 @@ mod tests { visibility: true, dependencies: VarZeroVec::from(&[ "und-t-s0-anyrev-d0-addrndsp-m0-fifty", + "x-any-nfd", "x-any-revfncall", "x-devanagari-interindic", "x-interindic-latin",