forked from JoshVarga/svgparser
/
render.go
92 lines (73 loc) · 1.7 KB
/
render.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package svg
import (
"encoding/xml"
"fmt"
"io"
"sort"
)
var sortAttributes = false
// SetSortAttributes override value whether we need
// to sort attribute during serialization
func SetSortAttributes(v bool) {
sortAttributes = v
}
// Serialize serializes element
func (e *Element) Serialize() xml.StartElement {
var attributes []xml.Attr
if sortAttributes {
// get keys
var keys []string
for key := range e.Attributes {
keys = append(keys, key)
}
sort.Strings(keys)
for _, key := range keys {
value := e.Attributes[key]
attr := xml.Attr{
Name: xml.Name{Local: key},
Value: string(xml.CharData(value)),
}
attributes = append(attributes, attr)
}
} else {
for name, value := range e.Attributes {
attr := xml.Attr{
Name: xml.Name{Local: name},
Value: string(xml.CharData(value)),
}
attributes = append(attributes, attr)
}
}
return xml.StartElement{
Name: xml.Name{Local: e.Name},
Attr: attributes,
}
}
// Encode encodes the element
func (e *Element) Encode(encoder *xml.Encoder) error {
start := e.Serialize()
if err := encoder.EncodeToken(start); err != nil {
return err
}
end := start.End()
var content xml.Token
content = xml.CharData(e.Content)
encoder.EncodeToken(content)
for _, child := range e.Children {
if err := child.Encode(encoder); err != nil {
return err
}
}
return encoder.EncodeToken(end)
}
// Render renders element to SVG
func Render(e *Element, w io.Writer, vars ...bool) error {
encoder := xml.NewEncoder(w)
if len(vars) == 0 || vars[0] == true {
encoder.Indent("", " ")
}
if err := e.Encode(encoder); err != nil {
return fmt.Errorf("Could not render element: %s", err)
}
return encoder.Flush()
}