Skip to content

Commit 8c89ac9

Browse files
committed
[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.
1 parent 185495d commit 8c89ac9

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

idna/src/uts46.rs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,19 @@ fn passes_bidi(label: &str, transitional_processing: bool) -> bool {
110110
|| (class == BidiClass::ON && transitional_processing) // starts with \u200D
111111
|| (class == BidiClass::ES && transitional_processing) // hack: 1.35.+33.49
112112
|| class == BidiClass::EN // hack: starts with number 0à.\u05D0
113-
{ // LTR
113+
{
114+
// LTR label
114115
// Rule 5
115116
loop {
116117
match chars.next() {
117118
Some(c) => {
118-
let c = bidi_class(c);
119-
if !matches!(c, BidiClass::L | BidiClass::EN |
120-
BidiClass::ES | BidiClass::CS |
121-
BidiClass::ET | BidiClass::ON |
122-
BidiClass::BN | BidiClass::NSM) {
119+
let class = bidi_class(c);
120+
if !matches!(class,
121+
BidiClass::L | BidiClass::EN |
122+
BidiClass::ES | BidiClass::CS |
123+
BidiClass::ET | BidiClass::ON |
124+
BidiClass::BN | BidiClass::NSM
125+
) {
123126
return false;
124127
}
125128
},
@@ -128,27 +131,27 @@ fn passes_bidi(label: &str, transitional_processing: bool) -> bool {
128131
}
129132

130133
// Rule 6
134+
// must end in L or EN followed by 0 or more NSM
131135
let mut rev_chars = label.chars().rev();
132-
let mut last = rev_chars.next();
133-
loop { // must end in L or EN followed by 0 or more NSM
134-
match last {
136+
let mut last_non_nsm = rev_chars.next();
137+
loop {
138+
match last_non_nsm {
135139
Some(c) if bidi_class(c) == BidiClass::NSM => {
136-
last = rev_chars.next();
140+
last_non_nsm = rev_chars.next();
137141
continue;
138142
}
139143
_ => { break; },
140144
}
141145
}
146+
match last_non_nsm {
147+
Some(c) if bidi_class(c) == BidiClass::L
148+
|| bidi_class(c) == BidiClass::EN => {},
149+
Some(_) => { return false; },
150+
_ => {}
151+
}
142152

143-
// TODO: does not pass for àˇ.\u05D0
144-
// match last {
145-
// Some(c) if bidi_class(c) == BidiClass::L
146-
// || bidi_class(c) == BidiClass::EN => {},
147-
// Some(c) => { return false; },
148-
// _ => {}
149-
// }
150-
151-
} else if class == BidiClass::R || class == BidiClass::AL { // RTL
153+
} else if class == BidiClass::R || class == BidiClass::AL {
154+
// RTL label
152155
let mut found_en = false;
153156
let mut found_an = false;
154157

0 commit comments

Comments
 (0)