1
1
mirror of https://github.com/exyte/Macaw.git synced 2024-10-26 13:01:25 +03:00

Improve SVG Serializer

- Support transform and placing
- Expose height and width
This commit is contained in:
Yuriy Kashnikov 2017-09-13 11:54:54 +03:00
parent 2845efb93c
commit 524b734fc1

View File

@ -25,29 +25,14 @@ open class SVGSerializer {
self.indent = indent
}
fileprivate init(indent:Int) {
self.width = SVGDefaultWidth
self.height = SVGDefaultHeight
self.id = SVGDefaultId
self.indent = indent
}
fileprivate init() {
self.width = SVGDefaultWidth
self.height = SVGDefaultHeight
self.id = SVGDefaultId
self.indent = 1
}
// header and footer
fileprivate let SVGDefaultHeader = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\""
fileprivate let SVGDefaultId = ""
fileprivate let SVGDefaultWidth=400
fileprivate let SVGDefaultHeight=210
fileprivate static let SVGDefaultId = ""
fileprivate static let SVGUndefinedSize = -1
fileprivate let SVGFooter = "</svg>"
// groups
fileprivate let SVGGroupOpenTag = "<g>"
fileprivate let SVGGroupOpenTag = "<g"
fileprivate let SVGGroupCloseTag = "</g>"
// shapes
@ -224,6 +209,15 @@ open class SVGSerializer {
}
if let group = node as? Group {
var result = indentTextWithOffset(SVGGroupOpenTag, offset)
if ([group.place.dx, group.place.dy].map{ Int($0) } != [0, 0]) {
if ([group.place.m11, group.place.m12, group.place.m21, group.place.m22].map { Int($0) } == [1, 0, 0, 1]) {
result += " transform=\"translate(\(Int(group.place.dx)),\(Int(group.place.dy)))\""
} else {
let matrixArgs = [group.place.m11, group.place.m12, group.place.m21, group.place.m22, group.place.dx, group.place.dy].map{ String($0) }.joined(separator: ",")
result += " transform=\"matrix(\(matrixArgs))\""
}
}
result += SVGGenericEndTag
for child in group.contentsVar.value {
result += serialize(node: child, offset: offset + 1)
}
@ -240,14 +234,21 @@ open class SVGSerializer {
}
fileprivate func serialize(node:Node) -> String {
var result = [SVGDefaultHeader, "id=\"\(self.id)\"", "width=\"\(self.width)\"", "height=\"\(self.height)\"", SVGGenericEndTag].joined(separator: " ")
var sizes = ""
if width != -1 {
sizes += "width=\"\(self.width)\""
}
if height != -1 {
sizes += "height=\"\(self.height)\""
}
var result = [SVGDefaultHeader, "id=\"\(self.id)\"", sizes, SVGGenericEndTag].joined(separator: " ")
result += serialize(node: node, offset: 1)
result += indentTextWithOffset(SVGFooter, 0)
return result
}
open class func serialize(node: Node, indent: Int = 1) -> String {
return SVGSerializer(indent:indent).serialize(node: node)
open class func serialize(node: Node, width: Int = SVGUndefinedSize, height: Int = SVGUndefinedSize, id: String = SVGDefaultId, indent: Int = 1) -> String {
return SVGSerializer(width: width, height:height, id: id, indent:indent).serialize(node: node)
}
}