Use encoding/xml to encode svg
This commit is contained in:
parent
295a8365b3
commit
cdf301b7be
4 changed files with 96 additions and 8 deletions
|
@ -2,18 +2,21 @@ package draw2dsvg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"bytes"
|
"encoding/xml"
|
||||||
_ "errors"
|
_ "errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SaveToSvgFile(filePath string, svg *SVG) error {
|
func SaveToSvgFile(filePath string, svg *Svg) error {
|
||||||
f, err := os.Create(filePath)
|
f, err := os.Create(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
bytes.NewBuffer((*bytes.Buffer)(svg).Bytes()).WriteTo(f) // clone buffer to make multiple writes possible
|
f.Write([]byte(xml.Header))
|
||||||
|
encoder := xml.NewEncoder(f)
|
||||||
|
encoder.Indent("", "\t")
|
||||||
|
err = encoder.Encode(svg)
|
||||||
|
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
|
@ -19,18 +19,18 @@ var (
|
||||||
|
|
||||||
type SVG bytes.Buffer
|
type SVG bytes.Buffer
|
||||||
|
|
||||||
func NewSvg() *SVG {
|
func NewSvg() *Svg {
|
||||||
return &SVG{}
|
return &Svg{Xmlns: "http://www.w3.org/2000/svg"}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GraphicContext implements the draw2d.GraphicContext interface
|
// GraphicContext implements the draw2d.GraphicContext interface
|
||||||
// It provides draw2d with a svg backend
|
// It provides draw2d with a svg backend
|
||||||
type GraphicContext struct {
|
type GraphicContext struct {
|
||||||
*draw2dbase.StackGraphicContext
|
*draw2dbase.StackGraphicContext
|
||||||
svg *SVG
|
svg *Svg
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGraphicContext(svg *SVG) *GraphicContext {
|
func NewGraphicContext(svg *Svg) *GraphicContext {
|
||||||
gc := &GraphicContext{draw2dbase.NewStackGraphicContext(), svg}
|
gc := &GraphicContext{draw2dbase.NewStackGraphicContext(), svg}
|
||||||
return gc
|
return gc
|
||||||
}
|
}
|
||||||
|
|
28
draw2dsvg/svg.go
Normal file
28
draw2dsvg/svg.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2015 The draw2d Authors. All rights reserved.
|
||||||
|
// created: 16/12/2017 by Drahoslav Bednář
|
||||||
|
package draw2dsvg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Svg struct {
|
||||||
|
XMLName xml.Name `xml:"svg"`
|
||||||
|
Xmlns string `xml:"xmlns,attr"`
|
||||||
|
Groups []Group `xml:"g"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Group struct {
|
||||||
|
Groups []Group `xml:"g"`
|
||||||
|
Paths []Path `xml:"path"`
|
||||||
|
Texts []Text `xml:"text"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Path struct {
|
||||||
|
Data string `xml:"d,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Text struct {
|
||||||
|
Text string `xml:",innerxml"`
|
||||||
|
Style string `xml:",attr,omitempty"`
|
||||||
|
}
|
57
draw2dsvg/xml_test.go
Normal file
57
draw2dsvg/xml_test.go
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// Copyright 2015 The draw2d Authors. All rights reserved.
|
||||||
|
// created: 16/12/2017 by Drahoslav Bednář
|
||||||
|
|
||||||
|
// Package draw2dsvg_test gives test coverage with the command:
|
||||||
|
// go test -cover ./... | grep -v "no test"
|
||||||
|
// (It should be run from its parent draw2d directory.)
|
||||||
|
package draw2dsvg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"encoding/xml"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Test basic encoding of svg/xml elements
|
||||||
|
func TestXml(t *testing.T) {
|
||||||
|
|
||||||
|
svg := NewSvg()
|
||||||
|
svg.Groups = []Group{Group{
|
||||||
|
Groups: []Group{
|
||||||
|
Group{}, // nested groups
|
||||||
|
Group{},
|
||||||
|
},
|
||||||
|
Texts: []Text{
|
||||||
|
Text{Text: "Hello"}, // text
|
||||||
|
Text{Text: "world", Style: "opacity: 0.5"}, // text with style
|
||||||
|
},
|
||||||
|
Paths: []Path{
|
||||||
|
Path{Data: "M100,200 C100,100 250,100 250,200 S400,300 400,200"}, // simple path
|
||||||
|
Path{}, // empty path
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
|
||||||
|
expectedOut := `<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g>
|
||||||
|
<g></g>
|
||||||
|
<g></g>
|
||||||
|
<path d="M100,200 C100,100 250,100 250,200 S400,300 400,200"></path>
|
||||||
|
<path d=""></path>
|
||||||
|
<text>Hello</text>
|
||||||
|
<text Style="opacity: 0.5">world</text>
|
||||||
|
</g>
|
||||||
|
</svg>`
|
||||||
|
|
||||||
|
out, err := xml.MarshalIndent(svg, "", " ")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if string(out) != expectedOut {
|
||||||
|
t.Errorf("svg output is not as expected\n"+
|
||||||
|
"got:\n%s\n\n"+
|
||||||
|
"want:\n%s\n",
|
||||||
|
string(out),
|
||||||
|
expectedOut,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue