MCPcopy
hub / github.com/tdewolff/canvas / parseStyle

Method parseStyle

svg.go:772–835  ·  view source on GitHub ↗
(b []byte)

Source from the content-addressed store, hash-verified

770}
771
772func (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,

Callers 2

parseTagMethod · 0.95
ParseSVGFunction · 0.95

Calls 4

WriteMethod · 0.80
NextMethod · 0.45
ValuesMethod · 0.45
StringMethod · 0.45

Tested by

no test coverage detected