| 25426 | } |
| 25427 | |
| 25428 | func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (any, bool) { |
| 25429 | if p.debug { |
| 25430 | defer p.out(p.in("parseCharClassMatcher")) |
| 25431 | } |
| 25432 | |
| 25433 | cur := p.pt.rn |
| 25434 | start := p.pt |
| 25435 | |
| 25436 | // can't match EOF |
| 25437 | if cur == utf8.RuneError && p.pt.w == 0 { // see utf8.DecodeRune |
| 25438 | p.failAt(false, start.position, chr.val) |
| 25439 | return nil, false |
| 25440 | } |
| 25441 | |
| 25442 | if chr.ignoreCase { |
| 25443 | cur = unicode.ToLower(cur) |
| 25444 | } |
| 25445 | |
| 25446 | // try to match in the list of available chars |
| 25447 | for _, rn := range chr.chars { |
| 25448 | if rn == cur { |
| 25449 | if chr.inverted { |
| 25450 | p.failAt(false, start.position, chr.val) |
| 25451 | return nil, false |
| 25452 | } |
| 25453 | p.read() |
| 25454 | p.failAt(true, start.position, chr.val) |
| 25455 | return p.sliceFrom(start), true |
| 25456 | } |
| 25457 | } |
| 25458 | |
| 25459 | // try to match in the list of ranges |
| 25460 | for i := 0; i < len(chr.ranges); i += 2 { |
| 25461 | if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { |
| 25462 | if chr.inverted { |
| 25463 | p.failAt(false, start.position, chr.val) |
| 25464 | return nil, false |
| 25465 | } |
| 25466 | p.read() |
| 25467 | p.failAt(true, start.position, chr.val) |
| 25468 | return p.sliceFrom(start), true |
| 25469 | } |
| 25470 | } |
| 25471 | |
| 25472 | // try to match in the list of Unicode classes |
| 25473 | for _, cl := range chr.classes { |
| 25474 | if unicode.Is(cl, cur) { |
| 25475 | if chr.inverted { |
| 25476 | p.failAt(false, start.position, chr.val) |
| 25477 | return nil, false |
| 25478 | } |
| 25479 | p.read() |
| 25480 | p.failAt(true, start.position, chr.val) |
| 25481 | return p.sliceFrom(start), true |
| 25482 | } |
| 25483 | } |
| 25484 | |
| 25485 | if chr.inverted { |