Przeglądaj źródła

[idna] Enable code to fail on IDNA2008 Bidi Rule 6 [B6]

* The code was disabled to allow tests pass. Now that `IdnaTest.txt` is
fixed for this failure, we can re-enable the code.
Behnam Esfahbod 9 lat temu
rodzic
commit
8c89ac9097
1 zmienionych plików z 22 dodań i 19 usunięć
  1. 22 19
      idna/src/uts46.rs

+ 22 - 19
idna/src/uts46.rs

@@ -110,16 +110,19 @@ fn passes_bidi(label: &str, transitional_processing: bool) -> bool {
        || (class == BidiClass::ON && transitional_processing) // starts with \u200D
        || (class == BidiClass::ES && transitional_processing) // hack: 1.35.+33.49
        || class == BidiClass::EN // hack: starts with number 0à.\u05D0
-    { // LTR
+    {
+        // LTR label
         // Rule 5
         loop {
             match chars.next() {
                 Some(c) => {
-                    let c = bidi_class(c);
-                    if !matches!(c, BidiClass::L | BidiClass::EN |
-                                    BidiClass::ES | BidiClass::CS |
-                                    BidiClass::ET | BidiClass::ON |
-                                    BidiClass::BN | BidiClass::NSM) {
+                    let class = bidi_class(c);
+                    if !matches!(class,
+                                 BidiClass::L | BidiClass::EN |
+                                 BidiClass::ES | BidiClass::CS |
+                                 BidiClass::ET | BidiClass::ON |
+                                 BidiClass::BN | BidiClass::NSM
+                     ) {
                         return false;
                     }
                 },
@@ -128,27 +131,27 @@ fn passes_bidi(label: &str, transitional_processing: bool) -> bool {
         }
 
         // Rule 6
+        // must end in L or EN followed by 0 or more NSM
         let mut rev_chars = label.chars().rev();
-        let mut last = rev_chars.next();
-        loop { // must end in L or EN followed by 0 or more NSM
-            match last {
+        let mut last_non_nsm = rev_chars.next();
+        loop {
+            match last_non_nsm {
                 Some(c) if bidi_class(c) == BidiClass::NSM => {
-                    last = rev_chars.next();
+                    last_non_nsm = rev_chars.next();
                     continue;
                 }
                 _ => { break; },
             }
         }
+        match last_non_nsm {
+            Some(c) if bidi_class(c) == BidiClass::L
+                    || bidi_class(c) == BidiClass::EN => {},
+            Some(_) => { return false; },
+            _ => {}
+        }
 
-        // TODO: does not pass for àˇ.\u05D0
-        // match last {
-        //     Some(c) if bidi_class(c) == BidiClass::L
-        //             || bidi_class(c) == BidiClass::EN => {},
-        //     Some(c) => { return false; },
-        //     _ => {}
-        // }
-
-    } else if class == BidiClass::R || class == BidiClass::AL { // RTL
+    } else if class == BidiClass::R || class == BidiClass::AL {
+        // RTL label
         let mut found_en = false;
         let mut found_an = false;