parseSelector parses a selector that may include combinators.
()
| 763 | |
| 764 | // parseSelector parses a selector that may include combinators. |
| 765 | func (p *parser) parseSelector() (result Selector, err error) { |
| 766 | p.skipWhitespace() |
| 767 | result, err = p.parseSimpleSelectorSequence() |
| 768 | if err != nil { |
| 769 | return |
| 770 | } |
| 771 | |
| 772 | for { |
| 773 | var combinator byte |
| 774 | if p.skipWhitespace() { |
| 775 | combinator = ' ' |
| 776 | } |
| 777 | if p.i >= len(p.s) { |
| 778 | return |
| 779 | } |
| 780 | |
| 781 | switch p.s[p.i] { |
| 782 | case '+', '>', '~': |
| 783 | combinator = p.s[p.i] |
| 784 | p.i++ |
| 785 | p.skipWhitespace() |
| 786 | case ',', ')': |
| 787 | // These characters can't begin a selector, but they can legally occur after one. |
| 788 | return |
| 789 | } |
| 790 | |
| 791 | if combinator == 0 { |
| 792 | return |
| 793 | } |
| 794 | |
| 795 | c, err := p.parseSimpleSelectorSequence() |
| 796 | if err != nil { |
| 797 | return nil, err |
| 798 | } |
| 799 | |
| 800 | switch combinator { |
| 801 | case ' ': |
| 802 | result = descendantSelector(result, c) |
| 803 | case '>': |
| 804 | result = childSelector(result, c) |
| 805 | case '+': |
| 806 | result = siblingSelector(result, c, true) |
| 807 | case '~': |
| 808 | result = siblingSelector(result, c, false) |
| 809 | } |
| 810 | } |
| 811 | |
| 812 | panic("unreachable") |
| 813 | } |
| 814 | |
| 815 | // parseSelectorGroup parses a group of selectors, separated by commas. |
| 816 | func (p *parser) parseSelectorGroup() (result Selector, err error) { |
no test coverage detected