| @@ -27,6 +27,7 @@ pub(crate) mod function { · 26 unmodified lines |
| 27 | 27 | const SLASH: u8 = b'/'; |
| 28 | 28 | const BRACKET_OPEN: u8 = b'['; |
| 29 | 29 | const BRACKET_CLOSE: u8 = b']'; |
| 30 | + const COLON: u8 = b':'; |
| 30 | 31 | |
| 31 | 32 | const NEGATE_CLASS: u8 = b'!'; |
| 32 | 33 | |
| @@ -175,7 +176,7 @@ pub(crate) mod function { · 142 unmodified lines |
| 175 | 176 | loop { |
| 176 | 177 | match next { |
| 177 | 178 | None => return AbortAll, |
| 178 | | − Some((_p_idx, mut p_ch)) => match p_ch { |
| 179 | + Some((p_idx, mut p_ch)) => match p_ch { |
| 179 | 180 | BACKSLASH => match p.next() { |
| 180 | 181 | Some((_, p_ch)) => { |
| 181 | 182 | if p_ch == t_ch { |
| @@ -211,7 +212,47 @@ pub(crate) mod function { · 29 unmodified lines |
| 211 | 212 | } |
| 212 | 213 | prev_p_ch = 0; |
| 213 | 214 | } |
| 214 | | − BRACKET_OPEN => todo!("class open"), |
| 215 | + BRACKET_OPEN if matches!(p.peek(), Some((_, COLON))) => { |
| 216 | + p.next(); |
| 217 | + while p.peek().map_or(false, |t| t.1 != BRACKET_CLOSE) { |
| 218 | + p.next(); |
| 219 | + } |
| 220 | + let closing_bracket_idx = match p.next() { |
| 221 | + Some((idx, _)) => idx, |
| 222 | + None => return AbortAll, |
| 223 | + }; |
| 224 | + const BRACKET__COLON__BRACKET: usize = 3; |
| 225 | + if closing_bracket_idx - p_idx < BRACKET__COLON__BRACKET |
| 226 | + || pattern[closing_bracket_idx - 1] != COLON |
| 227 | + { |
| 228 | + if t_ch == BRACKET_OPEN { |
| 229 | + matched = true |
| 230 | + } |
| 231 | + p = pattern[p_idx + 1..] |
| 232 | + .iter() |
| 233 | + .map(possibly_lowercase) |
| 234 | + .enumerate() |
| 235 | + .peekable(); |
| 236 | + } else { |
| 237 | + let class = &pattern.as_ref()[p_idx + 2..closing_bracket_idx - 1]; |
| 238 | + match class { |
| 239 | + b"alnum" => todo!("alnum"), |
| 240 | + b"alpha" => todo!("alpha"), |
| 241 | + b"blank" => todo!("blank"), |
| 242 | + b"cntrl" => todo!("cntrl"), |
| 243 | + b"digit" => todo!("digit"), |
| 244 | + b"graph" => todo!("graph"), |
| 245 | + b"lower" => todo!("lower"), |
| 246 | + b"print" => todo!("print"), |
| 247 | + b"punct" => todo!("punct"), |
| 248 | + b"space" => todo!("space"), |
| 249 | + b"upper" => todo!("upper"), |
| 250 | + b"xdigit" => todo!("xdigit"), |
| 251 | + _ => return AbortAll, |
| 252 | + }; |
| 253 | + prev_p_ch = 0; |
| 254 | + } |
| 255 | + } |
| 215 | 256 | _ => { |
| 216 | 257 | prev_p_ch = p_ch; |
| 217 | 258 | if p_ch == t_ch { |