3 | import Text.SVG.Attribute as A
5 | import Text.SVG.Types
10 | data SVGNode : Type where
13 | -> List (SVGAttribute tag)
16 | Txt : String -> SVGNode
17 | Raw : String -> SVGNode
21 | el : (s : String) -> List (SVGAttribute s) -> SVGNode
22 | el t as = El t as []
25 | circle : List (SVGAttribute "circle") -> SVGNode
29 | ellipse : List (SVGAttribute "ellipse") -> SVGNode
33 | g : List (SVGAttribute "g") -> List SVGNode -> SVGNode
37 | image : List (SVGAttribute "image") -> SVGNode
41 | line : List (SVGAttribute "line") -> SVGNode
45 | mask : List (SVGAttribute "mask") -> List SVGNode -> SVGNode
49 | rect : List (SVGAttribute "rect") -> SVGNode
53 | path : List (SVGAttribute "path") -> SVGNode
57 | polygon : List (SVGAttribute "polygon") -> SVGNode
61 | polyline : List (SVGAttribute "polyline") -> SVGNode
65 | svg : List (SVGAttribute "svg") -> List SVGNode -> SVGNode
69 | symbol : List (SVGAttribute "symbol") -> List SVGNode -> SVGNode
73 | text1 : List (SVGAttribute "text") -> String -> SVGNode
74 | text1 as s = El _ as [Txt s]
77 | text : List (SVGAttribute "text") -> List SVGNode -> SVGNode
81 | tspan : List (SVGAttribute "tspan") -> List SVGNode -> SVGNode
85 | use : List (SVGAttribute "use") -> SVGNode
89 | view : List (SVGAttribute "view") -> SVGNode
97 | escape : String -> String
98 | escape = fastConcat . map esc . unpack
101 | esc : Char -> String
110 | esc c = if c < ' ' then "" else singleton c
112 | attrs : {0 t : _} -> List (SVGAttribute t) -> String
113 | attrs as = let s = displayAttributes as in if null s then "" else " " ++ s
116 | render : SVGNode -> String
117 | render n = case n of
120 | El tag as [] => "<\{tag}\{attrs as}/>"
121 | El tag as ns => "<\{tag}\{attrs as}>\{go [<] ns}</\{tag}>"
125 | go : SnocList String -> List SVGNode -> String
126 | go ss (n :: ns) = go (ss :< render n) ns
127 | go ss [] = concat $
ss <>> []
130 | renderMany : List SVGNode -> String
131 | renderMany = fastConcat . map render