parseSimpleSelectorSequence parses a selector sequence that applies to a single element.
()
| 706 | // parseSimpleSelectorSequence parses a selector sequence that applies to |
| 707 | // a single element. |
| 708 | func (p *parser) parseSimpleSelectorSequence() (Selector, error) { |
| 709 | var result Selector |
| 710 | |
| 711 | if p.i >= len(p.s) { |
| 712 | return nil, errors.New("expected selector, found EOF instead") |
| 713 | } |
| 714 | |
| 715 | switch p.s[p.i] { |
| 716 | case '*': |
| 717 | // It's the universal selector. Just skip over it, since it doesn't affect the meaning. |
| 718 | p.i++ |
| 719 | case '#', '.', '[', ':': |
| 720 | // There's no type selector. Wait to process the other till the main loop. |
| 721 | default: |
| 722 | r, err := p.parseTypeSelector() |
| 723 | if err != nil { |
| 724 | return nil, err |
| 725 | } |
| 726 | result = r |
| 727 | } |
| 728 | |
| 729 | loop: |
| 730 | for p.i < len(p.s) { |
| 731 | var ns Selector |
| 732 | var err error |
| 733 | switch p.s[p.i] { |
| 734 | case '#': |
| 735 | ns, err = p.parseIDSelector() |
| 736 | case '.': |
| 737 | ns, err = p.parseClassSelector() |
| 738 | case '[': |
| 739 | ns, err = p.parseAttributeSelector() |
| 740 | case ':': |
| 741 | ns, err = p.parsePseudoclassSelector() |
| 742 | default: |
| 743 | break loop |
| 744 | } |
| 745 | if err != nil { |
| 746 | return nil, err |
| 747 | } |
| 748 | if result == nil { |
| 749 | result = ns |
| 750 | } else { |
| 751 | result = intersectionSelector(result, ns) |
| 752 | } |
| 753 | } |
| 754 | |
| 755 | if result == nil { |
| 756 | result = func(n *html.Node) bool { |
| 757 | return n.Type == html.ElementNode |
| 758 | } |
| 759 | } |
| 760 | |
| 761 | return result, nil |
| 762 | } |
| 763 | |
| 764 | // parseSelector parses a selector that may include combinators. |
| 765 | func (p *parser) parseSelector() (result Selector, err error) { |
no test coverage detected