svg/parser.go

Functions

Functions

func Parse

Parse parses SVG XML data into a reusable [Document].

The Document can be rendered multiple times at different sizes.

 

Only the SVG subset needed for icon rendering is supported.

Unsupported elements are silently skipped.

func Parse(data []byte) (*Document, error) {
	decoder := xml.NewDecoder(bytes.NewReader(data))

	doc := &Document{
		ViewBox: ViewBox{Width: 16, Height: 16},	// sensible default
	}

	// Find the root  element.
	for {
		tok, err := decoder.Token()
		if err != nil {
			return nil, fmt.Errorf("svg: failed to find  root element: %w", err)
		}
		if se, ok := tok.(xml.StartElement); ok && se.Name.Local == "svg" {
			if err := parseSVGRoot(doc, se); err != nil {
				return nil, err
			}
			// Parse children.
			children, err := parseChildren(decoder)
			if err != nil {
				return nil, err
			}
			doc.Elements = children
			return doc, nil
		}
	}
}