github.com/fretkak/mattermost-mattermost-server@v5.11.1+incompatible/app/svg.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"encoding/xml"
     8  	"io"
     9  	"regexp"
    10  	"strconv"
    11  
    12  	"github.com/pkg/errors"
    13  )
    14  
    15  type SVGInfo struct {
    16  	Width  int
    17  	Height int
    18  }
    19  
    20  func parseSVG(svgReader io.Reader) (SVGInfo, error) {
    21  	var parsedSVG struct {
    22  		Width   string `xml:"width,attr,omitempty"`
    23  		Height  string `xml:"height,attr,omitempty"`
    24  		ViewBox string `xml:"viewBox,attr,omitempty"`
    25  	}
    26  	svgInfo := SVGInfo{
    27  		Width:  0,
    28  		Height: 0,
    29  	}
    30  	viewBoxPattern := regexp.MustCompile("^([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)$")
    31  	dimensionPattern := regexp.MustCompile("(?i)^([0-9]+)(?:px)?$")
    32  
    33  	// decode provided SVG
    34  	if err := xml.NewDecoder(svgReader).Decode(&parsedSVG); err != nil {
    35  		return svgInfo, err
    36  	}
    37  
    38  	// prefer viewbox for SVG dimensions over width/height
    39  	if viewBoxMatches := viewBoxPattern.FindStringSubmatch(parsedSVG.ViewBox); len(viewBoxMatches) == 5 {
    40  		svgInfo.Width, _ = strconv.Atoi(viewBoxMatches[3])
    41  		svgInfo.Height, _ = strconv.Atoi(viewBoxMatches[4])
    42  	} else if len(parsedSVG.Width) > 0 && len(parsedSVG.Height) > 0 {
    43  		widthMatches := dimensionPattern.FindStringSubmatch(parsedSVG.Width)
    44  		heightMatches := dimensionPattern.FindStringSubmatch(parsedSVG.Height)
    45  		if len(widthMatches) == 2 && len(heightMatches) == 2 {
    46  			svgInfo.Width, _ = strconv.Atoi(widthMatches[1])
    47  			svgInfo.Height, _ = strconv.Atoi(heightMatches[1])
    48  		}
    49  	}
    50  
    51  	// if width and/or height are still zero, create new error
    52  	if svgInfo.Width == 0 || svgInfo.Height == 0 {
    53  		return svgInfo, errors.New("unable to extract SVG dimensions")
    54  	}
    55  	return svgInfo, nil
    56  }