@@ -110,16 +110,19 @@ fn passes_bidi(label: &str, transitional_processing: bool) -> bool {
110
110
|| ( class == BidiClass :: ON && transitional_processing) // starts with \u200D
111
111
|| ( class == BidiClass :: ES && transitional_processing) // hack: 1.35.+33.49
112
112
|| class == BidiClass :: EN // hack: starts with number 0à.\u05D0
113
- { // LTR
113
+ {
114
+ // LTR label
114
115
// Rule 5
115
116
loop {
116
117
match chars. next ( ) {
117
118
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
+ ) {
123
126
return false ;
124
127
}
125
128
} ,
@@ -128,27 +131,27 @@ fn passes_bidi(label: &str, transitional_processing: bool) -> bool {
128
131
}
129
132
130
133
// Rule 6
134
+ // must end in L or EN followed by 0 or more NSM
131
135
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 {
135
139
Some ( c) if bidi_class ( c) == BidiClass :: NSM => {
136
- last = rev_chars. next ( ) ;
140
+ last_non_nsm = rev_chars. next ( ) ;
137
141
continue ;
138
142
}
139
143
_ => { break ; } ,
140
144
}
141
145
}
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
+ }
142
152
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
152
155
let mut found_en = false ;
153
156
let mut found_an = false ;
154
157
0 commit comments