| 770 | } |
| 771 | |
| 772 | func (svg *svgParser) parseStyle(b []byte) { |
| 773 | p := css.NewParser(parse.NewInputBytes(b), false) |
| 774 | selectors := []cssSelector{} |
| 775 | for { |
| 776 | gt, _, _ := p.Next() |
| 777 | if gt == css.ErrorGrammar { |
| 778 | break |
| 779 | } else if gt == css.BeginRulesetGrammar || gt == css.QualifiedRuleGrammar { |
| 780 | selector := cssSelector{} |
| 781 | node := cssSelectorNode{op: ' '} |
| 782 | vals := p.Values() |
| 783 | for i := 0; i < len(vals); i++ { |
| 784 | t := vals[i] |
| 785 | if t.TokenType == css.WhitespaceToken || t.TokenType == css.DelimToken && t.Data[0] == '>' { |
| 786 | selector = append(selector, node) |
| 787 | node = cssSelectorNode{op: ' '} |
| 788 | if t.TokenType == css.DelimToken { |
| 789 | node.op = '>' |
| 790 | } |
| 791 | } else if t.TokenType == css.IdentToken || t.TokenType == css.DelimToken && t.Data[0] == '*' { |
| 792 | node.typ = string(t.Data) |
| 793 | } else if t.TokenType == css.DelimToken && (t.Data[0] == '.' || t.Data[0] == '#') && i+1 < len(vals) && vals[i+1].TokenType == css.IdentToken { |
| 794 | if t.Data[0] == '#' { |
| 795 | node.attrs = append(node.attrs, cssAttrSelector{op: '=', attr: "id", val: string(vals[i+1].Data)}) |
| 796 | } else { |
| 797 | node.attrs = append(node.attrs, cssAttrSelector{op: '~', attr: "class", val: string(vals[i+1].Data)}) |
| 798 | } |
| 799 | i++ |
| 800 | } else if t.TokenType == css.DelimToken && t.Data[0] == '[' && i+2 < len(vals) && vals[i+1].TokenType == css.IdentToken && vals[i+2].TokenType == css.DelimToken { |
| 801 | if vals[i+2].Data[0] == ']' { |
| 802 | node.attrs = append(node.attrs, cssAttrSelector{op: 0, attr: string(vals[i+1].Data)}) |
| 803 | i += 2 |
| 804 | } else if i+4 < len(vals) && vals[i+3].TokenType == css.IdentToken && vals[i+4].TokenType == css.DelimToken && vals[i+4].Data[0] == ']' { |
| 805 | node.attrs = append(node.attrs, cssAttrSelector{op: vals[i+2].Data[0], attr: string(vals[i+1].Data), val: string(vals[i+3].Data)}) |
| 806 | i += 4 |
| 807 | } |
| 808 | } |
| 809 | } |
| 810 | selector = append(selector, node) |
| 811 | selectors = append(selectors, selector) |
| 812 | } |
| 813 | |
| 814 | if gt == css.BeginRulesetGrammar { |
| 815 | props := []cssProperty{} |
| 816 | for { |
| 817 | gt, _, data := p.Next() |
| 818 | if gt != css.DeclarationGrammar { |
| 819 | break |
| 820 | } |
| 821 | |
| 822 | val := strings.Builder{} |
| 823 | for _, t := range p.Values() { |
| 824 | val.Write(t.Data) |
| 825 | } |
| 826 | props = append(props, cssProperty{string(data), val.String()}) |
| 827 | } |
| 828 | svg.cssRules = append(svg.cssRules, cssRule{ |
| 829 | selectors: selectors, |