Skip to content

Commit 81dcbb4

Browse files
committed
DOM.Anchor
1 parent 31fbd6f commit 81dcbb4

File tree

6 files changed

+64
-30
lines changed

6 files changed

+64
-30
lines changed

SwiftDraw/DOM.PresentationAttributes.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ extension DOM.GraphicsElement {
166166
return "image"
167167
case is DOM.Group:
168168
return "g"
169+
case is DOM.Anchor:
170+
return "a"
169171
case is DOM.SVG:
170172
return "svg"
171173
default:

SwiftDraw/DOM.Text.swift

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,24 @@
2929
// 3. This notice may not be removed or altered from any source distribution.
3030
//
3131

32+
import Foundation
33+
3234
extension DOM {
33-
34-
final class Text: GraphicsElement {
35-
var x: Coordinate?
36-
var y: Coordinate?
37-
var value: String
3835

39-
init(x: Coordinate? = nil, y: Coordinate? = nil, value: String) {
40-
self.x = x
41-
self.y = y
42-
self.value = value
36+
final class Text: GraphicsElement {
37+
var x: Coordinate?
38+
var y: Coordinate?
39+
var value: String
40+
41+
init(x: Coordinate? = nil, y: Coordinate? = nil, value: String) {
42+
self.x = x
43+
self.y = y
44+
self.value = value
45+
}
46+
}
47+
48+
final class Anchor: GraphicsElement, ContainerElement {
49+
var href: URL?
50+
var childElements = [GraphicsElement]()
4351
}
44-
}
4552
}

SwiftDraw/Parser.XML.Element.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ extension XMLParser {
9292
case "text":
9393
guard let text = try parseText(att, element: e) else { return nil }
9494
ge = text
95+
case "a":
96+
guard let anchor = try parseAnchor(att, element: e) else { return nil }
97+
ge = anchor
9598
case "use": ge = try parseUse(att)
9699
case "switch": ge = try parseSwitch(e)
97100
case "image": ge = try parseImage(att)
@@ -114,7 +117,8 @@ extension XMLParser {
114117
e.name == "mask" ||
115118
e.name == "defs" ||
116119
e.name == "switch" ||
117-
e.name == "g" else {
120+
e.name == "g" ||
121+
e.name == "a" else {
118122
throw Error.invalid
119123
}
120124

SwiftDraw/Parser.XML.Text.swift

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,30 @@
3232
import Foundation
3333

3434
extension XMLParser {
35-
36-
func parseText(_ att: AttributeParser, element: XML.Element) throws -> DOM.Text? {
37-
guard
38-
let text = element.innerText?.trimmingCharacters(in: .whitespacesAndNewlines),
39-
!text.isEmpty else {
40-
return nil
35+
36+
func parseText(_ att: AttributeParser, element: XML.Element) throws -> DOM.Text? {
37+
guard
38+
let text = element.innerText?.trimmingCharacters(in: .whitespacesAndNewlines),
39+
!text.isEmpty else {
40+
return nil
41+
}
42+
43+
return try parseText(att, value: text)
44+
}
45+
46+
func parseAnchor(_ att: AttributeParser, element: XML.Element) throws -> DOM.Anchor? {
47+
let anchor = DOM.Anchor()
48+
anchor.href = try att.parseUrl("href")
49+
anchor.childElements = try parseContainerChildren(element)
50+
return anchor
51+
}
52+
53+
func parseText(_ att: AttributeParser, value: String) throws -> DOM.Text {
54+
let element = DOM.Text(value: value)
55+
element.x = try att.parseCoordinate("x")
56+
element.y = try att.parseCoordinate("y")
57+
element.attributes.fontFamily = (try att.parseString("font-family"))?.trimmingCharacters(in: .whitespacesAndNewlines)
58+
element.attributes.fontSize = try att.parseFloat("font-size")
59+
return element
4160
}
42-
43-
return try parseText(att, value: text)
44-
}
45-
46-
func parseText(_ att: AttributeParser, value: String) throws -> DOM.Text {
47-
let element = DOM.Text(value: value)
48-
element.x = try att.parseCoordinate("x")
49-
element.y = try att.parseCoordinate("y")
50-
element.attributes.fontFamily = (try att.parseString("font-family"))?.trimmingCharacters(in: .whitespacesAndNewlines)
51-
element.attributes.fontSize = try att.parseFloat("font-size")
52-
return element
53-
}
5461
}

SwiftDraw/Renderer.SFSymbol.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,10 @@ extension DOM.SVG {
211211
<text x="250px" y="30px">Ultralight</text>
212212
<text x="450px" y="30px">Regular</text>
213213
<text x="650px" y="30px">Black</text>
214-
<text id="template-version" x="730px" y="590px" fill="#555">Template v.3.0</text>
214+
<text id="template-version" fill="#505050" x="730.0" y="575.0">Template v.3.0</text>
215+
<a href="https://github.com/swhitty/SwiftDraw">
216+
<text fill="#505050" x="627.0" y="590.0">https://github.com/swhitty/SwiftDraw</text>
217+
</a>
215218
</g>
216219
</g>
217220

SwiftDraw/XML.Formatter.SVG.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ extension XML.Formatter {
173173
element = makeElement(from: group)
174174
} else if let text = graphic as? DOM.Text {
175175
element = makeElement(from: text)
176+
} else if let anchor = graphic as? DOM.Anchor {
177+
element = makeElement(from: anchor)
176178
} else if let path = graphic as? DOM.Path {
177179
element = makeElement(from: path)
178180
} else {
@@ -235,6 +237,15 @@ extension XML.Formatter {
235237
return element
236238
}
237239

240+
func makeElement(from anchor: DOM.Anchor) -> XML.Element {
241+
let element = XML.Element(
242+
name: "a",
243+
attributes: makeGraphicsAttributes(from: anchor)
244+
)
245+
element.attributes["href"] = anchor.href?.absoluteString
246+
return element
247+
}
248+
238249
func makeElement(from path: DOM.Path) -> XML.Element {
239250
let element = XML.Element(
240251
name: "path",

0 commit comments

Comments
 (0)