diff options
Diffstat (limited to 'workhorse/internal/utils/svg')
-rw-r--r-- | workhorse/internal/utils/svg/LICENSE | 24 | ||||
-rw-r--r-- | workhorse/internal/utils/svg/README.md | 45 | ||||
-rw-r--r-- | workhorse/internal/utils/svg/svg.go | 42 |
3 files changed, 111 insertions, 0 deletions
diff --git a/workhorse/internal/utils/svg/LICENSE b/workhorse/internal/utils/svg/LICENSE new file mode 100644 index 00000000000..f67807d0070 --- /dev/null +++ b/workhorse/internal/utils/svg/LICENSE @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2016 Tomas Aparicio + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/workhorse/internal/utils/svg/README.md b/workhorse/internal/utils/svg/README.md new file mode 100644 index 00000000000..e5531f47473 --- /dev/null +++ b/workhorse/internal/utils/svg/README.md @@ -0,0 +1,45 @@ +# go-is-svg + +Tiny package to verify if a given file buffer is an SVG image in Go (golang). + +## Installation + +```bash +go get -u github.com/h2non/go-is-svg +``` + +## Example + +```go +package main + +import ( + "fmt" + "io/ioutil" + + svg "github.com/h2non/go-is-svg" +) + +func main() { + buf, err := ioutil.ReadFile("_example/example.svg") + if err != nil { + fmt.Printf("Error: %s\n", err) + return + } + + if svg.Is(buf) { + fmt.Println("File is an SVG") + } else { + fmt.Println("File is NOT an SVG") + } +} +``` + +Run example: +```bash +go run _example/example.go +``` + +## License + +MIT - Tomas Aparicio diff --git a/workhorse/internal/utils/svg/svg.go b/workhorse/internal/utils/svg/svg.go new file mode 100644 index 00000000000..b209cb5bf33 --- /dev/null +++ b/workhorse/internal/utils/svg/svg.go @@ -0,0 +1,42 @@ +// Copyright (c) 2016 Tomas Aparicio. All rights reserved. +// +// Use of this source code is governed by a MIT License +// license that can be found in the LICENSE file or at +// https://github.com/h2non/go-is-svg/blob/master/LICENSE. + +package svg + +import ( + "regexp" + "unicode/utf8" +) + +var ( + htmlCommentRegex = regexp.MustCompile(`(?i)<!--([\s\S]*?)-->`) + svgRegex = regexp.MustCompile(`(?i)^\s*(?:<\?xml[^>]*>\s*)?(?:<!doctype svg[^>]*>\s*)?<svg[^>]*>`) +) + +// isBinary checks if the given buffer is a binary file. +func isBinary(buf []byte) bool { + if len(buf) < 24 { + return false + } + for i := 0; i < 24; i++ { + charCode, _ := utf8.DecodeRuneInString(string(buf[i])) + if charCode == 65533 || charCode <= 8 { + return true + } + } + return false +} + +// Is returns true if the given buffer is a valid SVG image. +func Is(buf []byte) bool { + return !isBinary(buf) && svgRegex.Match(htmlCommentRegex.ReplaceAll(buf, []byte{})) +} + +// IsSVG returns true if the given buffer is a valid SVG image. +// Alias to: Is() +func IsSVG(buf []byte) bool { + return Is(buf) +} |