packages feed

svg-tree 0.6.2 → 0.6.2.1

raw patch · 3 files changed

+2703/−1632 lines, 3 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Graphics.Svg.Types: instance Graphics.Svg.Types.HasGroup (Graphics.Svg.Types.Group a0) a0
+ Graphics.Svg.Types: instance Graphics.Svg.Types.HasGroup (Graphics.Svg.Types.Group a) a
- Graphics.Svg.Types: aspectRatioAlign :: HasPreserveAspectRatio c_aCMk => Lens' c_aCMk Alignment
+ Graphics.Svg.Types: aspectRatioAlign :: HasPreserveAspectRatio a => Lens' a Alignment
- Graphics.Svg.Types: aspectRatioDefer :: HasPreserveAspectRatio c_aCMk => Lens' c_aCMk Bool
+ Graphics.Svg.Types: aspectRatioDefer :: HasPreserveAspectRatio a => Lens' a Bool
- Graphics.Svg.Types: aspectRatioMeetSlice :: HasPreserveAspectRatio c_aCMk => Lens' c_aCMk (Maybe MeetSlice)
+ Graphics.Svg.Types: aspectRatioMeetSlice :: HasPreserveAspectRatio a => Lens' a (Maybe MeetSlice)
- Graphics.Svg.Types: attrClass :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ [Text]
+ Graphics.Svg.Types: attrClass :: HasDrawAttributes a => Lens' a [Text]
- Graphics.Svg.Types: attrId :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Maybe String)
+ Graphics.Svg.Types: attrId :: HasDrawAttributes a => Lens' a (Maybe String)
- Graphics.Svg.Types: circle :: HasCircle c_aFET => Lens' c_aFET Circle
+ Graphics.Svg.Types: circle :: HasCircle a => Lens' a Circle
- Graphics.Svg.Types: circleCenter :: HasCircle c_aFET => Lens' c_aFET Point
+ Graphics.Svg.Types: circleCenter :: HasCircle a => Lens' a Point
- Graphics.Svg.Types: circleDrawAttributes :: HasCircle c_aFET => Lens' c_aFET DrawAttributes
+ Graphics.Svg.Types: circleDrawAttributes :: HasCircle a => Lens' a DrawAttributes
- Graphics.Svg.Types: circleRadius :: HasCircle c_aFET => Lens' c_aFET Number
+ Graphics.Svg.Types: circleRadius :: HasCircle a => Lens' a Number
- Graphics.Svg.Types: class HasCircle c_aFET where circleCenter = (.) circle circleCenter circleDrawAttributes = (.) circle circleDrawAttributes circleRadius = (.) circle circleRadius
+ Graphics.Svg.Types: class HasCircle a
- Graphics.Svg.Types: class HasClipPath c_aIaM where clipPathContent = (.) clipPath clipPathContent clipPathDrawAttributes = (.) clipPath clipPathDrawAttributes clipPathUnits = (.) clipPath clipPathUnits
+ Graphics.Svg.Types: class HasClipPath c_apZq
- Graphics.Svg.Types: class HasDocument c_aIzp where definitions = (.) document definitions description = (.) document description documentLocation = (.) document documentLocation elements = (.) document elements height = (.) document height styleRules = (.) document styleRules viewBox = (.) document viewBox width = (.) document width
+ Graphics.Svg.Types: class HasDocument c_aqpq
- Graphics.Svg.Types: class HasDrawAttributes c_aDhQ where attrClass = (.) drawAttributes attrClass attrId = (.) drawAttributes attrId clipPathRef = (.) drawAttributes clipPathRef clipRule = (.) drawAttributes clipRule fillColor = (.) drawAttributes fillColor fillOpacity = (.) drawAttributes fillOpacity fillRule = (.) drawAttributes fillRule fontFamily = (.) drawAttributes fontFamily fontSize = (.) drawAttributes fontSize fontStyle = (.) drawAttributes fontStyle groupOpacity = (.) drawAttributes groupOpacity markerEnd = (.) drawAttributes markerEnd markerMid = (.) drawAttributes markerMid markerStart = (.) drawAttributes markerStart maskRef = (.) drawAttributes maskRef strokeColor = (.) drawAttributes strokeColor strokeDashArray = (.) drawAttributes strokeDashArray strokeLineCap = (.) drawAttributes strokeLineCap strokeLineJoin = (.) drawAttributes strokeLineJoin strokeMiterLimit = (.) drawAttributes strokeMiterLimit strokeOffset = (.) drawAttributes strokeOffset strokeOpacity = (.) drawAttributes strokeOpacity strokeWidth = (.) drawAttributes strokeWidth textAnchor = (.) drawAttributes textAnchor transform = (.) drawAttributes transform
+ Graphics.Svg.Types: class HasDrawAttributes a
- Graphics.Svg.Types: class HasEllipse c_aFKF where ellipseCenter = (.) ellipse ellipseCenter ellipseDrawAttributes = (.) ellipse ellipseDrawAttributes ellipseXRadius = (.) ellipse ellipseXRadius ellipseYRadius = (.) ellipse ellipseYRadius
+ Graphics.Svg.Types: class HasEllipse c_amWt
- Graphics.Svg.Types: class HasGradientStop c_aFRg where gradientColor = (.) gradientStop gradientColor gradientOffset = (.) gradientStop gradientOffset gradientOpacity = (.) gradientStop gradientOpacity gradientPath = (.) gradientStop gradientPath
+ Graphics.Svg.Types: class HasGradientStop c_anhM
- Graphics.Svg.Types: class HasGroup c_aFrM a_aE8z | c_aFrM -> a_aE8z where groupAspectRatio = (.) group groupAspectRatio groupChildren = (.) group groupChildren groupDrawAttributes = (.) group groupDrawAttributes groupViewBox = (.) group groupViewBox
+ Graphics.Svg.Types: class HasGroup g a | g -> a
- Graphics.Svg.Types: class HasImage c_aGeL where imageAspectRatio = (.) image imageAspectRatio imageCornerUpperLeft = (.) image imageCornerUpperLeft imageDrawAttributes = (.) image imageDrawAttributes imageHeight = (.) image imageHeight imageHref = (.) image imageHref imageWidth = (.) image imageWidth
+ Graphics.Svg.Types: class HasImage c_anI7
- Graphics.Svg.Types: class HasLine c_aDVe where lineDrawAttributes = (.) line lineDrawAttributes linePoint1 = (.) line linePoint1 linePoint2 = (.) line linePoint2
+ Graphics.Svg.Types: class HasLine a
- Graphics.Svg.Types: class HasLinearGradient c_aHH8 where linearGradientSpread = (.) linearGradient linearGradientSpread linearGradientStart = (.) linearGradient linearGradientStart linearGradientStop = (.) linearGradient linearGradientStop linearGradientStops = (.) linearGradient linearGradientStops linearGradientTransform = (.) linearGradient linearGradientTransform linearGradientUnits = (.) linearGradient linearGradientUnits
+ Graphics.Svg.Types: class HasLinearGradient c_apmJ
- Graphics.Svg.Types: class HasMarker c_aHdz where markerAspectRatio = (.) marker markerAspectRatio markerDrawAttributes = (.) marker markerDrawAttributes markerElements = (.) marker markerElements markerHeight = (.) marker markerHeight markerOrient = (.) marker markerOrient markerOverflow = (.) marker markerOverflow markerRefPoint = (.) marker markerRefPoint markerUnits = (.) marker markerUnits markerViewBox = (.) marker markerViewBox markerWidth = (.) marker markerWidth
+ Graphics.Svg.Types: class HasMarker c_aoKc
- Graphics.Svg.Types: class HasMask c_aI1M where maskContent = (.) mask maskContent maskContentUnits = (.) mask maskContentUnits maskDrawAttributes = (.) mask maskDrawAttributes maskHeight = (.) mask maskHeight maskPosition = (.) mask maskPosition maskUnits = (.) mask maskUnits maskWidth = (.) mask maskWidth
+ Graphics.Svg.Types: class HasMask c_apHI
- Graphics.Svg.Types: class HasMeshGradient c_aG4B where meshGradientDrawAttributes = (.) meshGradient meshGradientDrawAttributes meshGradientRows = (.) meshGradient meshGradientRows meshGradientTransform = (.) meshGradient meshGradientTransform meshGradientType = (.) meshGradient meshGradientType meshGradientUnits = (.) meshGradient meshGradientUnits meshGradientX = (.) meshGradient meshGradientX meshGradientY = (.) meshGradient meshGradientY
+ Graphics.Svg.Types: class HasMeshGradient c_anxG
- Graphics.Svg.Types: class HasMeshGradientPatch c_aFWD where meshGradientPatchStops = (.) meshGradientPatch meshGradientPatchStops
+ Graphics.Svg.Types: class HasMeshGradientPatch c_annx
- Graphics.Svg.Types: class HasMeshGradientRow c_aFZu where meshGradientRowPatches = (.) meshGradientRow meshGradientRowPatches
+ Graphics.Svg.Types: class HasMeshGradientRow c_antr
- Graphics.Svg.Types: class HasPath c_aE8g where pathDefinition = (.) path pathDefinition pathDrawAttributes = (.) path pathDrawAttributes
+ Graphics.Svg.Types: class HasPath c_alhy
- Graphics.Svg.Types: class HasPattern c_aIhO where patternAspectRatio = (.) pattern patternAspectRatio patternDrawAttributes = (.) pattern patternDrawAttributes patternElements = (.) pattern patternElements patternHeight = (.) pattern patternHeight patternHref = (.) pattern patternHref patternPos = (.) pattern patternPos patternTransform = (.) pattern patternTransform patternUnit = (.) pattern patternUnit patternViewBox = (.) pattern patternViewBox patternWidth = (.) pattern patternWidth
+ Graphics.Svg.Types: class HasPattern c_aq6G
- Graphics.Svg.Types: class HasPolyLine c_aDMp where polyLineDrawAttributes = (.) polyLine polyLineDrawAttributes polyLinePoints = (.) polyLine polyLinePoints
+ Graphics.Svg.Types: class HasPolyLine a
- Graphics.Svg.Types: class HasPolygon c_aDQD where polygonDrawAttributes = (.) polygon polygonDrawAttributes polygonPoints = (.) polygon polygonPoints
+ Graphics.Svg.Types: class HasPolygon a
- Graphics.Svg.Types: class HasPreserveAspectRatio c_aCMk where aspectRatioAlign = (.) preserveAspectRatio aspectRatioAlign aspectRatioDefer = (.) preserveAspectRatio aspectRatioDefer aspectRatioMeetSlice = (.) preserveAspectRatio aspectRatioMeetSlice
+ Graphics.Svg.Types: class HasPreserveAspectRatio a
- Graphics.Svg.Types: class HasRadialGradient c_aHQG where radialGradientCenter = (.) radialGradient radialGradientCenter radialGradientFocusX = (.) radialGradient radialGradientFocusX radialGradientFocusY = (.) radialGradient radialGradientFocusY radialGradientRadius = (.) radialGradient radialGradientRadius radialGradientSpread = (.) radialGradient radialGradientSpread radialGradientStops = (.) radialGradient radialGradientStops radialGradientTransform = (.) radialGradient radialGradientTransform radialGradientUnits = (.) radialGradient radialGradientUnits
+ Graphics.Svg.Types: class HasRadialGradient c_apwt
- Graphics.Svg.Types: class HasRectangle c_aE1y where rectCornerRadius = (.) rectangle rectCornerRadius rectDrawAttributes = (.) rectangle rectDrawAttributes rectHeight = (.) rectangle rectHeight rectUpperLeftCorner = (.) rectangle rectUpperLeftCorner rectWidth = (.) rectangle rectWidth
+ Graphics.Svg.Types: class HasRectangle a
- Graphics.Svg.Types: class HasText c_aGVu where textAdjust = (.) text textAdjust textRoot = (.) text textRoot
+ Graphics.Svg.Types: class HasText c_aorD
- Graphics.Svg.Types: class HasTextInfo c_aGwB where textInfoDX = (.) textInfo textInfoDX textInfoDY = (.) textInfo textInfoDY textInfoLength = (.) textInfo textInfoLength textInfoRotate = (.) textInfo textInfoRotate textInfoX = (.) textInfo textInfoX textInfoY = (.) textInfo textInfoY
+ Graphics.Svg.Types: class HasTextInfo c_ao0m
- Graphics.Svg.Types: class HasTextPath c_aGO7 where textPathData = (.) textPath textPathData textPathMethod = (.) textPath textPathMethod textPathName = (.) textPath textPathName textPathSpacing = (.) textPath textPathSpacing textPathStartOffset = (.) textPath textPathStartOffset
+ Graphics.Svg.Types: class HasTextPath c_aojU
- Graphics.Svg.Types: class HasTextSpan c_aGGi where spanContent = (.) textSpan spanContent spanDrawAttributes = (.) textSpan spanDrawAttributes spanInfo = (.) textSpan spanInfo
+ Graphics.Svg.Types: class HasTextSpan c_aobD
- Graphics.Svg.Types: class HasUse c_aGnv where useBase = (.) use useBase useDrawAttributes = (.) use useDrawAttributes useHeight = (.) use useHeight useName = (.) use useName useWidth = (.) use useWidth
+ Graphics.Svg.Types: class HasUse c_anR3
- Graphics.Svg.Types: clipPath :: HasClipPath c_aIaM => Lens' c_aIaM ClipPath
+ Graphics.Svg.Types: clipPath :: HasClipPath c_apZq => Lens' c_apZq ClipPath
- Graphics.Svg.Types: clipPathContent :: HasClipPath c_aIaM => Lens' c_aIaM [Tree]
+ Graphics.Svg.Types: clipPathContent :: HasClipPath c_apZq => Lens' c_apZq [Tree]
- Graphics.Svg.Types: clipPathDrawAttributes :: HasClipPath c_aIaM => Lens' c_aIaM DrawAttributes
+ Graphics.Svg.Types: clipPathDrawAttributes :: HasClipPath c_apZq => Lens' c_apZq DrawAttributes
- Graphics.Svg.Types: clipPathRef :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last ElementRef)
+ Graphics.Svg.Types: clipPathRef :: HasDrawAttributes a => Lens' a (Last ElementRef)
- Graphics.Svg.Types: clipPathUnits :: HasClipPath c_aIaM => Lens' c_aIaM CoordinateUnits
+ Graphics.Svg.Types: clipPathUnits :: HasClipPath c_apZq => Lens' c_apZq CoordinateUnits
- Graphics.Svg.Types: clipRule :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last FillRule)
+ Graphics.Svg.Types: clipRule :: HasDrawAttributes a => Lens' a (Last FillRule)
- Graphics.Svg.Types: definitions :: HasDocument c_aIzp => Lens' c_aIzp (Map String Element)
+ Graphics.Svg.Types: definitions :: HasDocument c_aqpq => Lens' c_aqpq (Map String Element)
- Graphics.Svg.Types: description :: HasDocument c_aIzp => Lens' c_aIzp String
+ Graphics.Svg.Types: description :: HasDocument c_aqpq => Lens' c_aqpq String
- Graphics.Svg.Types: document :: HasDocument c_aIzp => Lens' c_aIzp Document
+ Graphics.Svg.Types: document :: HasDocument c_aqpq => Lens' c_aqpq Document
- Graphics.Svg.Types: documentLocation :: HasDocument c_aIzp => Lens' c_aIzp FilePath
+ Graphics.Svg.Types: documentLocation :: HasDocument c_aqpq => Lens' c_aqpq FilePath
- Graphics.Svg.Types: drawAttributes :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ DrawAttributes
+ Graphics.Svg.Types: drawAttributes :: HasDrawAttributes a => Lens' a DrawAttributes
- Graphics.Svg.Types: elements :: HasDocument c_aIzp => Lens' c_aIzp [Tree]
+ Graphics.Svg.Types: elements :: HasDocument c_aqpq => Lens' c_aqpq [Tree]
- Graphics.Svg.Types: ellipse :: HasEllipse c_aFKF => Lens' c_aFKF Ellipse
+ Graphics.Svg.Types: ellipse :: HasEllipse c_amWt => Lens' c_amWt Ellipse
- Graphics.Svg.Types: ellipseCenter :: HasEllipse c_aFKF => Lens' c_aFKF Point
+ Graphics.Svg.Types: ellipseCenter :: HasEllipse c_amWt => Lens' c_amWt Point
- Graphics.Svg.Types: ellipseDrawAttributes :: HasEllipse c_aFKF => Lens' c_aFKF DrawAttributes
+ Graphics.Svg.Types: ellipseDrawAttributes :: HasEllipse c_amWt => Lens' c_amWt DrawAttributes
- Graphics.Svg.Types: ellipseXRadius :: HasEllipse c_aFKF => Lens' c_aFKF Number
+ Graphics.Svg.Types: ellipseXRadius :: HasEllipse c_amWt => Lens' c_amWt Number
- Graphics.Svg.Types: ellipseYRadius :: HasEllipse c_aFKF => Lens' c_aFKF Number
+ Graphics.Svg.Types: ellipseYRadius :: HasEllipse c_amWt => Lens' c_amWt Number
- Graphics.Svg.Types: fillColor :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last Texture)
+ Graphics.Svg.Types: fillColor :: HasDrawAttributes a => Lens' a (Last Texture)
- Graphics.Svg.Types: fillOpacity :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Maybe Float)
+ Graphics.Svg.Types: fillOpacity :: HasDrawAttributes a => Lens' a (Maybe Float)
- Graphics.Svg.Types: fillRule :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last FillRule)
+ Graphics.Svg.Types: fillRule :: HasDrawAttributes a => Lens' a (Last FillRule)
- Graphics.Svg.Types: fontFamily :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last [String])
+ Graphics.Svg.Types: fontFamily :: HasDrawAttributes a => Lens' a (Last [String])
- Graphics.Svg.Types: fontSize :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last Number)
+ Graphics.Svg.Types: fontSize :: HasDrawAttributes a => Lens' a (Last Number)
- Graphics.Svg.Types: fontStyle :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last FontStyle)
+ Graphics.Svg.Types: fontStyle :: HasDrawAttributes a => Lens' a (Last FontStyle)
- Graphics.Svg.Types: gradientColor :: HasGradientStop c_aFRg => Lens' c_aFRg PixelRGBA8
+ Graphics.Svg.Types: gradientColor :: HasGradientStop c_anhM => Lens' c_anhM PixelRGBA8
- Graphics.Svg.Types: gradientOffset :: HasGradientStop c_aFRg => Lens' c_aFRg Float
+ Graphics.Svg.Types: gradientOffset :: HasGradientStop c_anhM => Lens' c_anhM Float
- Graphics.Svg.Types: gradientOpacity :: HasGradientStop c_aFRg => Lens' c_aFRg (Maybe Float)
+ Graphics.Svg.Types: gradientOpacity :: HasGradientStop c_anhM => Lens' c_anhM (Maybe Float)
- Graphics.Svg.Types: gradientPath :: HasGradientStop c_aFRg => Lens' c_aFRg (Maybe GradientPathCommand)
+ Graphics.Svg.Types: gradientPath :: HasGradientStop c_anhM => Lens' c_anhM (Maybe GradientPathCommand)
- Graphics.Svg.Types: gradientStop :: HasGradientStop c_aFRg => Lens' c_aFRg GradientStop
+ Graphics.Svg.Types: gradientStop :: HasGradientStop c_anhM => Lens' c_anhM GradientStop
- Graphics.Svg.Types: group :: HasGroup c_aFrM a_aE8z => Lens' c_aFrM (Group a_aE8z)
+ Graphics.Svg.Types: group :: HasGroup g a => Lens' g (Group a)
- Graphics.Svg.Types: groupAspectRatio :: HasGroup c_aFrM a_aE8z => Lens' c_aFrM PreserveAspectRatio
+ Graphics.Svg.Types: groupAspectRatio :: HasGroup g a => Lens' g PreserveAspectRatio
- Graphics.Svg.Types: groupChildren :: HasGroup c_aFrM a_aE8z => Lens' c_aFrM [a_aE8z]
+ Graphics.Svg.Types: groupChildren :: HasGroup g a => Lens' g [a]
- Graphics.Svg.Types: groupDrawAttributes :: HasGroup c_aFrM a_aE8z => Lens' c_aFrM DrawAttributes
+ Graphics.Svg.Types: groupDrawAttributes :: HasGroup g a => Lens' g DrawAttributes
- Graphics.Svg.Types: groupOfSymbol :: forall a_aFsk a_aFz6. Iso (Symbol a_aFsk) (Symbol a_aFz6) (Group a_aFsk) (Group a_aFz6)
+ Graphics.Svg.Types: groupOfSymbol :: Lens (Symbol s) (Symbol t) (Group s) (Group t)
- Graphics.Svg.Types: groupOpacity :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Maybe Float)
+ Graphics.Svg.Types: groupOpacity :: HasDrawAttributes a => Lens' a (Maybe Float)
- Graphics.Svg.Types: groupViewBox :: HasGroup c_aFrM a_aE8z => Lens' c_aFrM (Maybe (Double, Double, Double, Double))
+ Graphics.Svg.Types: groupViewBox :: HasGroup g a => Lens' g (Maybe (Double, Double, Double, Double))
- Graphics.Svg.Types: height :: HasDocument c_aIzp => Lens' c_aIzp (Maybe Number)
+ Graphics.Svg.Types: height :: HasDocument c_aqpq => Lens' c_aqpq (Maybe Number)
- Graphics.Svg.Types: image :: HasImage c_aGeL => Lens' c_aGeL Image
+ Graphics.Svg.Types: image :: HasImage c_anI7 => Lens' c_anI7 Image
- Graphics.Svg.Types: imageAspectRatio :: HasImage c_aGeL => Lens' c_aGeL PreserveAspectRatio
+ Graphics.Svg.Types: imageAspectRatio :: HasImage c_anI7 => Lens' c_anI7 PreserveAspectRatio
- Graphics.Svg.Types: imageCornerUpperLeft :: HasImage c_aGeL => Lens' c_aGeL Point
+ Graphics.Svg.Types: imageCornerUpperLeft :: HasImage c_anI7 => Lens' c_anI7 Point
- Graphics.Svg.Types: imageDrawAttributes :: HasImage c_aGeL => Lens' c_aGeL DrawAttributes
+ Graphics.Svg.Types: imageDrawAttributes :: HasImage c_anI7 => Lens' c_anI7 DrawAttributes
- Graphics.Svg.Types: imageHeight :: HasImage c_aGeL => Lens' c_aGeL Number
+ Graphics.Svg.Types: imageHeight :: HasImage c_anI7 => Lens' c_anI7 Number
- Graphics.Svg.Types: imageHref :: HasImage c_aGeL => Lens' c_aGeL String
+ Graphics.Svg.Types: imageHref :: HasImage c_anI7 => Lens' c_anI7 String
- Graphics.Svg.Types: imageWidth :: HasImage c_aGeL => Lens' c_aGeL Number
+ Graphics.Svg.Types: imageWidth :: HasImage c_anI7 => Lens' c_anI7 Number
- Graphics.Svg.Types: line :: HasLine c_aDVe => Lens' c_aDVe Line
+ Graphics.Svg.Types: line :: HasLine a => Lens' a Line
- Graphics.Svg.Types: lineDrawAttributes :: HasLine c_aDVe => Lens' c_aDVe DrawAttributes
+ Graphics.Svg.Types: lineDrawAttributes :: HasLine a => Lens' a DrawAttributes
- Graphics.Svg.Types: linePoint1 :: HasLine c_aDVe => Lens' c_aDVe Point
+ Graphics.Svg.Types: linePoint1 :: HasLine a => Lens' a Point
- Graphics.Svg.Types: linePoint2 :: HasLine c_aDVe => Lens' c_aDVe Point
+ Graphics.Svg.Types: linePoint2 :: HasLine a => Lens' a Point
- Graphics.Svg.Types: linearGradient :: HasLinearGradient c_aHH8 => Lens' c_aHH8 LinearGradient
+ Graphics.Svg.Types: linearGradient :: HasLinearGradient c_apmJ => Lens' c_apmJ LinearGradient
- Graphics.Svg.Types: linearGradientSpread :: HasLinearGradient c_aHH8 => Lens' c_aHH8 Spread
+ Graphics.Svg.Types: linearGradientSpread :: HasLinearGradient c_apmJ => Lens' c_apmJ Spread
- Graphics.Svg.Types: linearGradientStart :: HasLinearGradient c_aHH8 => Lens' c_aHH8 Point
+ Graphics.Svg.Types: linearGradientStart :: HasLinearGradient c_apmJ => Lens' c_apmJ Point
- Graphics.Svg.Types: linearGradientStop :: HasLinearGradient c_aHH8 => Lens' c_aHH8 Point
+ Graphics.Svg.Types: linearGradientStop :: HasLinearGradient c_apmJ => Lens' c_apmJ Point
- Graphics.Svg.Types: linearGradientStops :: HasLinearGradient c_aHH8 => Lens' c_aHH8 [GradientStop]
+ Graphics.Svg.Types: linearGradientStops :: HasLinearGradient c_apmJ => Lens' c_apmJ [GradientStop]
- Graphics.Svg.Types: linearGradientTransform :: HasLinearGradient c_aHH8 => Lens' c_aHH8 [Transformation]
+ Graphics.Svg.Types: linearGradientTransform :: HasLinearGradient c_apmJ => Lens' c_apmJ [Transformation]
- Graphics.Svg.Types: linearGradientUnits :: HasLinearGradient c_aHH8 => Lens' c_aHH8 CoordinateUnits
+ Graphics.Svg.Types: linearGradientUnits :: HasLinearGradient c_apmJ => Lens' c_apmJ CoordinateUnits
- Graphics.Svg.Types: marker :: HasMarker c_aHdz => Lens' c_aHdz Marker
+ Graphics.Svg.Types: marker :: HasMarker c_aoKc => Lens' c_aoKc Marker
- Graphics.Svg.Types: markerAspectRatio :: HasMarker c_aHdz => Lens' c_aHdz PreserveAspectRatio
+ Graphics.Svg.Types: markerAspectRatio :: HasMarker c_aoKc => Lens' c_aoKc PreserveAspectRatio
- Graphics.Svg.Types: markerDrawAttributes :: HasMarker c_aHdz => Lens' c_aHdz DrawAttributes
+ Graphics.Svg.Types: markerDrawAttributes :: HasMarker c_aoKc => Lens' c_aoKc DrawAttributes
- Graphics.Svg.Types: markerElements :: HasMarker c_aHdz => Lens' c_aHdz [Tree]
+ Graphics.Svg.Types: markerElements :: HasMarker c_aoKc => Lens' c_aoKc [Tree]
- Graphics.Svg.Types: markerEnd :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last ElementRef)
+ Graphics.Svg.Types: markerEnd :: HasDrawAttributes a => Lens' a (Last ElementRef)
- Graphics.Svg.Types: markerHeight :: HasMarker c_aHdz => Lens' c_aHdz (Maybe Number)
+ Graphics.Svg.Types: markerHeight :: HasMarker c_aoKc => Lens' c_aoKc (Maybe Number)
- Graphics.Svg.Types: markerMid :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last ElementRef)
+ Graphics.Svg.Types: markerMid :: HasDrawAttributes a => Lens' a (Last ElementRef)
- Graphics.Svg.Types: markerOrient :: HasMarker c_aHdz => Lens' c_aHdz (Maybe MarkerOrientation)
+ Graphics.Svg.Types: markerOrient :: HasMarker c_aoKc => Lens' c_aoKc (Maybe MarkerOrientation)
- Graphics.Svg.Types: markerOverflow :: HasMarker c_aHdz => Lens' c_aHdz (Maybe Overflow)
+ Graphics.Svg.Types: markerOverflow :: HasMarker c_aoKc => Lens' c_aoKc (Maybe Overflow)
- Graphics.Svg.Types: markerRefPoint :: HasMarker c_aHdz => Lens' c_aHdz (Number, Number)
+ Graphics.Svg.Types: markerRefPoint :: HasMarker c_aoKc => Lens' c_aoKc (Number, Number)
- Graphics.Svg.Types: markerStart :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last ElementRef)
+ Graphics.Svg.Types: markerStart :: HasDrawAttributes a => Lens' a (Last ElementRef)
- Graphics.Svg.Types: markerUnits :: HasMarker c_aHdz => Lens' c_aHdz (Maybe MarkerUnit)
+ Graphics.Svg.Types: markerUnits :: HasMarker c_aoKc => Lens' c_aoKc (Maybe MarkerUnit)
- Graphics.Svg.Types: markerViewBox :: HasMarker c_aHdz => Lens' c_aHdz (Maybe (Double, Double, Double, Double))
+ Graphics.Svg.Types: markerViewBox :: HasMarker c_aoKc => Lens' c_aoKc (Maybe (Double, Double, Double, Double))
- Graphics.Svg.Types: markerWidth :: HasMarker c_aHdz => Lens' c_aHdz (Maybe Number)
+ Graphics.Svg.Types: markerWidth :: HasMarker c_aoKc => Lens' c_aoKc (Maybe Number)
- Graphics.Svg.Types: mask :: HasMask c_aI1M => Lens' c_aI1M Mask
+ Graphics.Svg.Types: mask :: HasMask c_apHI => Lens' c_apHI Mask
- Graphics.Svg.Types: maskContent :: HasMask c_aI1M => Lens' c_aI1M [Tree]
+ Graphics.Svg.Types: maskContent :: HasMask c_apHI => Lens' c_apHI [Tree]
- Graphics.Svg.Types: maskContentUnits :: HasMask c_aI1M => Lens' c_aI1M CoordinateUnits
+ Graphics.Svg.Types: maskContentUnits :: HasMask c_apHI => Lens' c_apHI CoordinateUnits
- Graphics.Svg.Types: maskDrawAttributes :: HasMask c_aI1M => Lens' c_aI1M DrawAttributes
+ Graphics.Svg.Types: maskDrawAttributes :: HasMask c_apHI => Lens' c_apHI DrawAttributes
- Graphics.Svg.Types: maskHeight :: HasMask c_aI1M => Lens' c_aI1M Number
+ Graphics.Svg.Types: maskHeight :: HasMask c_apHI => Lens' c_apHI Number
- Graphics.Svg.Types: maskPosition :: HasMask c_aI1M => Lens' c_aI1M Point
+ Graphics.Svg.Types: maskPosition :: HasMask c_apHI => Lens' c_apHI Point
- Graphics.Svg.Types: maskRef :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last ElementRef)
+ Graphics.Svg.Types: maskRef :: HasDrawAttributes a => Lens' a (Last ElementRef)
- Graphics.Svg.Types: maskUnits :: HasMask c_aI1M => Lens' c_aI1M CoordinateUnits
+ Graphics.Svg.Types: maskUnits :: HasMask c_apHI => Lens' c_apHI CoordinateUnits
- Graphics.Svg.Types: maskWidth :: HasMask c_aI1M => Lens' c_aI1M Number
+ Graphics.Svg.Types: maskWidth :: HasMask c_apHI => Lens' c_apHI Number
- Graphics.Svg.Types: meshGradient :: HasMeshGradient c_aG4B => Lens' c_aG4B MeshGradient
+ Graphics.Svg.Types: meshGradient :: HasMeshGradient c_anxG => Lens' c_anxG MeshGradient
- Graphics.Svg.Types: meshGradientDrawAttributes :: HasMeshGradient c_aG4B => Lens' c_aG4B DrawAttributes
+ Graphics.Svg.Types: meshGradientDrawAttributes :: HasMeshGradient c_anxG => Lens' c_anxG DrawAttributes
- Graphics.Svg.Types: meshGradientPatch :: HasMeshGradientPatch c_aFWD => Lens' c_aFWD MeshGradientPatch
+ Graphics.Svg.Types: meshGradientPatch :: HasMeshGradientPatch c_annx => Lens' c_annx MeshGradientPatch
- Graphics.Svg.Types: meshGradientPatchStops :: HasMeshGradientPatch c_aFWD => Lens' c_aFWD [GradientStop]
+ Graphics.Svg.Types: meshGradientPatchStops :: HasMeshGradientPatch c_annx => Lens' c_annx [GradientStop]
- Graphics.Svg.Types: meshGradientRow :: HasMeshGradientRow c_aFZu => Lens' c_aFZu MeshGradientRow
+ Graphics.Svg.Types: meshGradientRow :: HasMeshGradientRow c_antr => Lens' c_antr MeshGradientRow
- Graphics.Svg.Types: meshGradientRowPatches :: HasMeshGradientRow c_aFZu => Lens' c_aFZu [MeshGradientPatch]
+ Graphics.Svg.Types: meshGradientRowPatches :: HasMeshGradientRow c_antr => Lens' c_antr [MeshGradientPatch]
- Graphics.Svg.Types: meshGradientRows :: HasMeshGradient c_aG4B => Lens' c_aG4B [MeshGradientRow]
+ Graphics.Svg.Types: meshGradientRows :: HasMeshGradient c_anxG => Lens' c_anxG [MeshGradientRow]
- Graphics.Svg.Types: meshGradientTransform :: HasMeshGradient c_aG4B => Lens' c_aG4B [Transformation]
+ Graphics.Svg.Types: meshGradientTransform :: HasMeshGradient c_anxG => Lens' c_anxG [Transformation]
- Graphics.Svg.Types: meshGradientType :: HasMeshGradient c_aG4B => Lens' c_aG4B MeshGradientType
+ Graphics.Svg.Types: meshGradientType :: HasMeshGradient c_anxG => Lens' c_anxG MeshGradientType
- Graphics.Svg.Types: meshGradientUnits :: HasMeshGradient c_aG4B => Lens' c_aG4B CoordinateUnits
+ Graphics.Svg.Types: meshGradientUnits :: HasMeshGradient c_anxG => Lens' c_anxG CoordinateUnits
- Graphics.Svg.Types: meshGradientX :: HasMeshGradient c_aG4B => Lens' c_aG4B Number
+ Graphics.Svg.Types: meshGradientX :: HasMeshGradient c_anxG => Lens' c_anxG Number
- Graphics.Svg.Types: meshGradientY :: HasMeshGradient c_aG4B => Lens' c_aG4B Number
+ Graphics.Svg.Types: meshGradientY :: HasMeshGradient c_anxG => Lens' c_anxG Number
- Graphics.Svg.Types: path :: HasPath c_aE8g => Lens' c_aE8g Path
+ Graphics.Svg.Types: path :: HasPath c_alhy => Lens' c_alhy Path
- Graphics.Svg.Types: pathDefinition :: HasPath c_aE8g => Lens' c_aE8g [PathCommand]
+ Graphics.Svg.Types: pathDefinition :: HasPath c_alhy => Lens' c_alhy [PathCommand]
- Graphics.Svg.Types: pathDrawAttributes :: HasPath c_aE8g => Lens' c_aE8g DrawAttributes
+ Graphics.Svg.Types: pathDrawAttributes :: HasPath c_alhy => Lens' c_alhy DrawAttributes
- Graphics.Svg.Types: pattern :: HasPattern c_aIhO => Lens' c_aIhO Pattern
+ Graphics.Svg.Types: pattern :: HasPattern c_aq6G => Lens' c_aq6G Pattern
- Graphics.Svg.Types: patternAspectRatio :: HasPattern c_aIhO => Lens' c_aIhO PreserveAspectRatio
+ Graphics.Svg.Types: patternAspectRatio :: HasPattern c_aq6G => Lens' c_aq6G PreserveAspectRatio
- Graphics.Svg.Types: patternDrawAttributes :: HasPattern c_aIhO => Lens' c_aIhO DrawAttributes
+ Graphics.Svg.Types: patternDrawAttributes :: HasPattern c_aq6G => Lens' c_aq6G DrawAttributes
- Graphics.Svg.Types: patternElements :: HasPattern c_aIhO => Lens' c_aIhO [Tree]
+ Graphics.Svg.Types: patternElements :: HasPattern c_aq6G => Lens' c_aq6G [Tree]
- Graphics.Svg.Types: patternHeight :: HasPattern c_aIhO => Lens' c_aIhO Number
+ Graphics.Svg.Types: patternHeight :: HasPattern c_aq6G => Lens' c_aq6G Number
- Graphics.Svg.Types: patternHref :: HasPattern c_aIhO => Lens' c_aIhO String
+ Graphics.Svg.Types: patternHref :: HasPattern c_aq6G => Lens' c_aq6G String
- Graphics.Svg.Types: patternPos :: HasPattern c_aIhO => Lens' c_aIhO Point
+ Graphics.Svg.Types: patternPos :: HasPattern c_aq6G => Lens' c_aq6G Point
- Graphics.Svg.Types: patternTransform :: HasPattern c_aIhO => Lens' c_aIhO (Maybe [Transformation])
+ Graphics.Svg.Types: patternTransform :: HasPattern c_aq6G => Lens' c_aq6G (Maybe [Transformation])
- Graphics.Svg.Types: patternUnit :: HasPattern c_aIhO => Lens' c_aIhO CoordinateUnits
+ Graphics.Svg.Types: patternUnit :: HasPattern c_aq6G => Lens' c_aq6G CoordinateUnits
- Graphics.Svg.Types: patternViewBox :: HasPattern c_aIhO => Lens' c_aIhO (Maybe (Double, Double, Double, Double))
+ Graphics.Svg.Types: patternViewBox :: HasPattern c_aq6G => Lens' c_aq6G (Maybe (Double, Double, Double, Double))
- Graphics.Svg.Types: patternWidth :: HasPattern c_aIhO => Lens' c_aIhO Number
+ Graphics.Svg.Types: patternWidth :: HasPattern c_aq6G => Lens' c_aq6G Number
- Graphics.Svg.Types: polyLine :: HasPolyLine c_aDMp => Lens' c_aDMp PolyLine
+ Graphics.Svg.Types: polyLine :: HasPolyLine a => Lens' a PolyLine
- Graphics.Svg.Types: polyLineDrawAttributes :: HasPolyLine c_aDMp => Lens' c_aDMp DrawAttributes
+ Graphics.Svg.Types: polyLineDrawAttributes :: HasPolyLine a => Lens' a DrawAttributes
- Graphics.Svg.Types: polyLinePoints :: HasPolyLine c_aDMp => Lens' c_aDMp [RPoint]
+ Graphics.Svg.Types: polyLinePoints :: HasPolyLine a => Lens' a [RPoint]
- Graphics.Svg.Types: polygon :: HasPolygon c_aDQD => Lens' c_aDQD Polygon
+ Graphics.Svg.Types: polygon :: HasPolygon a => Lens' a Polygon
- Graphics.Svg.Types: polygonDrawAttributes :: HasPolygon c_aDQD => Lens' c_aDQD DrawAttributes
+ Graphics.Svg.Types: polygonDrawAttributes :: HasPolygon a => Lens' a DrawAttributes
- Graphics.Svg.Types: polygonPoints :: HasPolygon c_aDQD => Lens' c_aDQD [RPoint]
+ Graphics.Svg.Types: polygonPoints :: HasPolygon a => Lens' a [RPoint]
- Graphics.Svg.Types: preserveAspectRatio :: HasPreserveAspectRatio c_aCMk => Lens' c_aCMk PreserveAspectRatio
+ Graphics.Svg.Types: preserveAspectRatio :: HasPreserveAspectRatio a => Lens' a PreserveAspectRatio
- Graphics.Svg.Types: radialGradient :: HasRadialGradient c_aHQG => Lens' c_aHQG RadialGradient
+ Graphics.Svg.Types: radialGradient :: HasRadialGradient c_apwt => Lens' c_apwt RadialGradient
- Graphics.Svg.Types: radialGradientCenter :: HasRadialGradient c_aHQG => Lens' c_aHQG Point
+ Graphics.Svg.Types: radialGradientCenter :: HasRadialGradient c_apwt => Lens' c_apwt Point
- Graphics.Svg.Types: radialGradientFocusX :: HasRadialGradient c_aHQG => Lens' c_aHQG (Maybe Number)
+ Graphics.Svg.Types: radialGradientFocusX :: HasRadialGradient c_apwt => Lens' c_apwt (Maybe Number)
- Graphics.Svg.Types: radialGradientFocusY :: HasRadialGradient c_aHQG => Lens' c_aHQG (Maybe Number)
+ Graphics.Svg.Types: radialGradientFocusY :: HasRadialGradient c_apwt => Lens' c_apwt (Maybe Number)
- Graphics.Svg.Types: radialGradientRadius :: HasRadialGradient c_aHQG => Lens' c_aHQG Number
+ Graphics.Svg.Types: radialGradientRadius :: HasRadialGradient c_apwt => Lens' c_apwt Number
- Graphics.Svg.Types: radialGradientSpread :: HasRadialGradient c_aHQG => Lens' c_aHQG Spread
+ Graphics.Svg.Types: radialGradientSpread :: HasRadialGradient c_apwt => Lens' c_apwt Spread
- Graphics.Svg.Types: radialGradientStops :: HasRadialGradient c_aHQG => Lens' c_aHQG [GradientStop]
+ Graphics.Svg.Types: radialGradientStops :: HasRadialGradient c_apwt => Lens' c_apwt [GradientStop]
- Graphics.Svg.Types: radialGradientTransform :: HasRadialGradient c_aHQG => Lens' c_aHQG [Transformation]
+ Graphics.Svg.Types: radialGradientTransform :: HasRadialGradient c_apwt => Lens' c_apwt [Transformation]
- Graphics.Svg.Types: radialGradientUnits :: HasRadialGradient c_aHQG => Lens' c_aHQG CoordinateUnits
+ Graphics.Svg.Types: radialGradientUnits :: HasRadialGradient c_apwt => Lens' c_apwt CoordinateUnits
- Graphics.Svg.Types: rectCornerRadius :: HasRectangle c_aE1y => Lens' c_aE1y (Number, Number)
+ Graphics.Svg.Types: rectCornerRadius :: HasRectangle a => Lens' a (Number, Number)
- Graphics.Svg.Types: rectDrawAttributes :: HasRectangle c_aE1y => Lens' c_aE1y DrawAttributes
+ Graphics.Svg.Types: rectDrawAttributes :: HasRectangle a => Lens' a DrawAttributes
- Graphics.Svg.Types: rectHeight :: HasRectangle c_aE1y => Lens' c_aE1y Number
+ Graphics.Svg.Types: rectHeight :: HasRectangle a => Lens' a Number
- Graphics.Svg.Types: rectUpperLeftCorner :: HasRectangle c_aE1y => Lens' c_aE1y Point
+ Graphics.Svg.Types: rectUpperLeftCorner :: HasRectangle a => Lens' a Point
- Graphics.Svg.Types: rectWidth :: HasRectangle c_aE1y => Lens' c_aE1y Number
+ Graphics.Svg.Types: rectWidth :: HasRectangle a => Lens' a Number
- Graphics.Svg.Types: rectangle :: HasRectangle c_aE1y => Lens' c_aE1y Rectangle
+ Graphics.Svg.Types: rectangle :: HasRectangle a => Lens' a Rectangle
- Graphics.Svg.Types: spanContent :: HasTextSpan c_aGGi => Lens' c_aGGi [TextSpanContent]
+ Graphics.Svg.Types: spanContent :: HasTextSpan c_aobD => Lens' c_aobD [TextSpanContent]
- Graphics.Svg.Types: spanDrawAttributes :: HasTextSpan c_aGGi => Lens' c_aGGi DrawAttributes
+ Graphics.Svg.Types: spanDrawAttributes :: HasTextSpan c_aobD => Lens' c_aobD DrawAttributes
- Graphics.Svg.Types: spanInfo :: HasTextSpan c_aGGi => Lens' c_aGGi TextInfo
+ Graphics.Svg.Types: spanInfo :: HasTextSpan c_aobD => Lens' c_aobD TextInfo
- Graphics.Svg.Types: strokeColor :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last Texture)
+ Graphics.Svg.Types: strokeColor :: HasDrawAttributes a => Lens' a (Last Texture)
- Graphics.Svg.Types: strokeDashArray :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last [Number])
+ Graphics.Svg.Types: strokeDashArray :: HasDrawAttributes a => Lens' a (Last [Number])
- Graphics.Svg.Types: strokeLineCap :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last Cap)
+ Graphics.Svg.Types: strokeLineCap :: HasDrawAttributes a => Lens' a (Last Cap)
- Graphics.Svg.Types: strokeLineJoin :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last LineJoin)
+ Graphics.Svg.Types: strokeLineJoin :: HasDrawAttributes a => Lens' a (Last LineJoin)
- Graphics.Svg.Types: strokeMiterLimit :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last Double)
+ Graphics.Svg.Types: strokeMiterLimit :: HasDrawAttributes a => Lens' a (Last Double)
- Graphics.Svg.Types: strokeOffset :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last Number)
+ Graphics.Svg.Types: strokeOffset :: HasDrawAttributes a => Lens' a (Last Number)
- Graphics.Svg.Types: strokeOpacity :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Maybe Float)
+ Graphics.Svg.Types: strokeOpacity :: HasDrawAttributes a => Lens' a (Maybe Float)
- Graphics.Svg.Types: strokeWidth :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last Number)
+ Graphics.Svg.Types: strokeWidth :: HasDrawAttributes a => Lens' a (Last Number)
- Graphics.Svg.Types: styleRules :: HasDocument c_aIzp => Lens' c_aIzp [CssRule]
+ Graphics.Svg.Types: styleRules :: HasDocument c_aqpq => Lens' c_aqpq [CssRule]
- Graphics.Svg.Types: text :: HasText c_aGVu => Lens' c_aGVu Text
+ Graphics.Svg.Types: text :: HasText c_aorD => Lens' c_aorD Text
- Graphics.Svg.Types: textAdjust :: HasText c_aGVu => Lens' c_aGVu TextAdjust
+ Graphics.Svg.Types: textAdjust :: HasText c_aorD => Lens' c_aorD TextAdjust
- Graphics.Svg.Types: textAnchor :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Last TextAnchor)
+ Graphics.Svg.Types: textAnchor :: HasDrawAttributes a => Lens' a (Last TextAnchor)
- Graphics.Svg.Types: textInfo :: HasTextInfo c_aGwB => Lens' c_aGwB TextInfo
+ Graphics.Svg.Types: textInfo :: HasTextInfo c_ao0m => Lens' c_ao0m TextInfo
- Graphics.Svg.Types: textInfoDX :: HasTextInfo c_aGwB => Lens' c_aGwB [Number]
+ Graphics.Svg.Types: textInfoDX :: HasTextInfo c_ao0m => Lens' c_ao0m [Number]
- Graphics.Svg.Types: textInfoDY :: HasTextInfo c_aGwB => Lens' c_aGwB [Number]
+ Graphics.Svg.Types: textInfoDY :: HasTextInfo c_ao0m => Lens' c_ao0m [Number]
- Graphics.Svg.Types: textInfoLength :: HasTextInfo c_aGwB => Lens' c_aGwB (Maybe Number)
+ Graphics.Svg.Types: textInfoLength :: HasTextInfo c_ao0m => Lens' c_ao0m (Maybe Number)
- Graphics.Svg.Types: textInfoRotate :: HasTextInfo c_aGwB => Lens' c_aGwB [Double]
+ Graphics.Svg.Types: textInfoRotate :: HasTextInfo c_ao0m => Lens' c_ao0m [Double]
- Graphics.Svg.Types: textInfoX :: HasTextInfo c_aGwB => Lens' c_aGwB [Number]
+ Graphics.Svg.Types: textInfoX :: HasTextInfo c_ao0m => Lens' c_ao0m [Number]
- Graphics.Svg.Types: textInfoY :: HasTextInfo c_aGwB => Lens' c_aGwB [Number]
+ Graphics.Svg.Types: textInfoY :: HasTextInfo c_ao0m => Lens' c_ao0m [Number]
- Graphics.Svg.Types: textPath :: HasTextPath c_aGO7 => Lens' c_aGO7 TextPath
+ Graphics.Svg.Types: textPath :: HasTextPath c_aojU => Lens' c_aojU TextPath
- Graphics.Svg.Types: textPathData :: HasTextPath c_aGO7 => Lens' c_aGO7 [PathCommand]
+ Graphics.Svg.Types: textPathData :: HasTextPath c_aojU => Lens' c_aojU [PathCommand]
- Graphics.Svg.Types: textPathMethod :: HasTextPath c_aGO7 => Lens' c_aGO7 TextPathMethod
+ Graphics.Svg.Types: textPathMethod :: HasTextPath c_aojU => Lens' c_aojU TextPathMethod
- Graphics.Svg.Types: textPathName :: HasTextPath c_aGO7 => Lens' c_aGO7 String
+ Graphics.Svg.Types: textPathName :: HasTextPath c_aojU => Lens' c_aojU String
- Graphics.Svg.Types: textPathSpacing :: HasTextPath c_aGO7 => Lens' c_aGO7 TextPathSpacing
+ Graphics.Svg.Types: textPathSpacing :: HasTextPath c_aojU => Lens' c_aojU TextPathSpacing
- Graphics.Svg.Types: textPathStartOffset :: HasTextPath c_aGO7 => Lens' c_aGO7 Number
+ Graphics.Svg.Types: textPathStartOffset :: HasTextPath c_aojU => Lens' c_aojU Number
- Graphics.Svg.Types: textRoot :: HasText c_aGVu => Lens' c_aGVu TextSpan
+ Graphics.Svg.Types: textRoot :: HasText c_aorD => Lens' c_aorD TextSpan
- Graphics.Svg.Types: textSpan :: HasTextSpan c_aGGi => Lens' c_aGGi TextSpan
+ Graphics.Svg.Types: textSpan :: HasTextSpan c_aobD => Lens' c_aobD TextSpan
- Graphics.Svg.Types: transform :: HasDrawAttributes c_aDhQ => Lens' c_aDhQ (Maybe [Transformation])
+ Graphics.Svg.Types: transform :: HasDrawAttributes a => Lens' a (Maybe [Transformation])
- Graphics.Svg.Types: use :: HasUse c_aGnv => Lens' c_aGnv Use
+ Graphics.Svg.Types: use :: HasUse c_anR3 => Lens' c_anR3 Use
- Graphics.Svg.Types: useBase :: HasUse c_aGnv => Lens' c_aGnv Point
+ Graphics.Svg.Types: useBase :: HasUse c_anR3 => Lens' c_anR3 Point
- Graphics.Svg.Types: useDrawAttributes :: HasUse c_aGnv => Lens' c_aGnv DrawAttributes
+ Graphics.Svg.Types: useDrawAttributes :: HasUse c_anR3 => Lens' c_anR3 DrawAttributes
- Graphics.Svg.Types: useHeight :: HasUse c_aGnv => Lens' c_aGnv (Maybe Number)
+ Graphics.Svg.Types: useHeight :: HasUse c_anR3 => Lens' c_anR3 (Maybe Number)
- Graphics.Svg.Types: useName :: HasUse c_aGnv => Lens' c_aGnv String
+ Graphics.Svg.Types: useName :: HasUse c_anR3 => Lens' c_anR3 String
- Graphics.Svg.Types: useWidth :: HasUse c_aGnv => Lens' c_aGnv (Maybe Number)
+ Graphics.Svg.Types: useWidth :: HasUse c_anR3 => Lens' c_anR3 (Maybe Number)
- Graphics.Svg.Types: viewBox :: HasDocument c_aIzp => Lens' c_aIzp (Maybe (Double, Double, Double, Double))
+ Graphics.Svg.Types: viewBox :: HasDocument c_aqpq => Lens' c_aqpq (Maybe (Double, Double, Double, Double))
- Graphics.Svg.Types: width :: HasDocument c_aIzp => Lens' c_aIzp (Maybe Number)
+ Graphics.Svg.Types: width :: HasDocument c_aqpq => Lens' c_aqpq (Maybe Number)

Files

changelog.md view
@@ -1,5 +1,11 @@ -*-change-log-*-
 
+v0.6.2.1 December 2017
+ * Workaround/Fix: removed reliance on Template Haskell to derive lenses,
+   by writing them directly in the file, using the ddump-splices. For some
+   reason Haddock associated with GHC 8.2.2 was entering infinite loop on
+   the Types file. Ugly workaround, but at least it works.
+
 v0.6.2 August 2017
  * Fix: gather named elements even outside of <defs> tags.
  * Fix: URL ID now can contain more characters.
src/Graphics/Svg/Types.hs view
@@ -1,1631 +1,2696 @@-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE CPP #-}
--- | This module define all the types used in the definition
--- of a svg scene.
---
--- Most of the types are lensified.
-module Graphics.Svg.Types
-    ( -- * Basic building types
-      Coord
-    , Origin( .. )
-    , Point
-    , RPoint
-    , PathCommand( .. )
-    , Transformation( .. )
-    , ElementRef( .. )
-    , CoordinateUnits( .. )
-
-      -- ** Building helpers
-    , toPoint
-    , serializeNumber
-    , serializeTransformation
-    , serializeTransformations
-
-      -- * Drawing control types
-    , Cap( .. )
-    , LineJoin( .. )
-    , Tree( .. )
-    , Number( .. )
-    , Spread( .. )
-    , Texture( .. )
-    , Element( .. )
-    , FillRule( .. )
-    , FontStyle( .. )
-    , Dpi
-
-    , WithDefaultSvg( .. )
-
-      -- * Main type
-    , Document( .. )
-    , HasDocument( .. )
-    , documentSize
-
-      -- * Drawing attributes
-    , DrawAttributes( .. )
-    , HasDrawAttributes( .. )
-    , WithDrawAttributes( .. )
-
-      -- * SVG drawing primitives
-      -- ** Rectangle
-    , Rectangle( .. )
-    , HasRectangle( .. )
-
-      -- ** Line
-    , Line( .. )
-    , HasLine( .. )
-
-      -- ** Polygon
-    , Polygon( .. )
-    , HasPolygon( .. )
-
-      -- ** Polyline
-    , PolyLine( .. )
-    , HasPolyLine( .. )
-
-      -- ** Path
-    , Path( .. )
-    , HasPath( .. )
-
-      -- ** Circle
-    , Circle( .. )
-    , HasCircle( .. )
-
-      -- ** Ellipse
-    , Ellipse( .. )
-    , HasEllipse( .. )
-
-      -- ** Mesh (gradient mesh)
-    , GradientPathCommand( .. )
-    , MeshGradientType( .. )
-
-    , MeshGradient( .. )
-    , HasMeshGradient( .. )
-
-    , MeshGradientRow( .. )
-    , HasMeshGradientRow( .. )
-
-    , MeshGradientPatch( .. )
-    , HasMeshGradientPatch( .. )
-
-      -- ** Image
-    , Image( .. )
-    , HasImage( .. )
-
-      -- ** Use
-    , Use( .. )
-    , HasUse( .. )
-
-      -- * Grouping primitives
-      -- ** Group
-    , Group( .. )
-    , HasGroup( .. )
-
-      -- ** Symbol
-    , Symbol( .. )
-    , groupOfSymbol
-
-      -- * Text related types
-      -- ** Text
-    , Text( .. )
-    , HasText( .. )
-    , TextAnchor( .. )
-    , textAt
-
-      -- ** Text path
-    , TextPath( .. )
-    , HasTextPath( .. )
-
-    , TextPathSpacing( .. )
-    , TextPathMethod( .. )
-
-      -- ** Text span.
-    , TextSpanContent( .. )
-
-    , TextSpan( .. )
-    , HasTextSpan( .. )
-
-    , TextInfo( .. )
-    , HasTextInfo( .. )
-
-    , TextAdjust( .. )
-
-      -- * Marker definition
-    , Marker( .. )
-    , Overflow( .. )
-    , MarkerOrientation( .. )
-    , MarkerUnit( .. )
-    , HasMarker( .. )
-
-      -- * Gradient definition
-    , GradientStop( .. )
-    , HasGradientStop( .. )
-
-      -- ** Linear Gradient
-    , LinearGradient( .. )
-    , HasLinearGradient( .. )
-
-      -- ** Radial Gradient
-    , RadialGradient( .. )
-    , HasRadialGradient( .. )
-
-      -- * Pattern definition
-    , Pattern( .. )
-    , HasPattern( .. )
-
-      -- * Mask definition
-    , Mask( .. )
-    , HasMask( .. )
-
-      -- * Clip path definition
-    , ClipPath( .. )
-    , HasClipPath( .. )
-
-      -- * Aspect Ratio description
-    , PreserveAspectRatio( .. )
-    , Alignment( .. )
-    , MeetSlice( .. )
-    , HasPreserveAspectRatio( .. )
-
-      -- * MISC functions
-    , isPathArc
-    , isPathWithArc
-    , nameOfTree
-    , zipTree
-    , mapTree
-    , foldTree
-    , toUserUnit
-    , mapNumber
-    ) where
-
-#if !MIN_VERSION_base(4,8,0)
-import Data.Monoid( Monoid( .. ) )
-import Data.Foldable( Foldable )
-#endif
-
-import Data.Function( on )
-import Data.List( inits )
-import qualified Data.Map as M
-import Data.Monoid( Last( .. ), (<>) )
-import qualified Data.Foldable as F
-import qualified Data.Text as T
-import Codec.Picture( PixelRGBA8( .. ) )
-import Control.Lens( Lens'
-                   , lens
-                   , makeClassy
-                   , makeLenses
-                   , view
-                   , (^.)
-                   , (&)
-                   , (.~)
-                   )
-import Graphics.Svg.CssTypes
-import Linear hiding ( angle )
-
-import Text.Printf
-
--- | Basic coordiante type.
-type Coord = Double
-
--- | Real Point, fully determined and not
--- dependant of the rendering context.
-type RPoint = V2 Coord
-
--- | Possibly context dependant point.
-type Point = (Number, Number)
-
--- | Tell if a path command is absolute (in the current
--- user coordiante) or relative to the previous poitn.
-data Origin
-  = OriginAbsolute -- ^ Next point in absolute coordinate
-  | OriginRelative -- ^ Next point relative to the previous
-  deriving (Eq, Show)
-
-data MeshGradientType
-  = GradientBilinear
-  | GradientBicubic
-  deriving (Eq, Show)
-
--- | Path command definition.
-data PathCommand
-      -- | 'M' or 'm' command
-    = MoveTo !Origin ![RPoint]
-      -- | Line to, 'L' or 'l' Svg path command.
-    | LineTo !Origin ![RPoint]
-
-      -- | Equivalent to the 'H' or 'h' svg path command.
-    | HorizontalTo  !Origin ![Coord]
-      -- | Equivalent to the 'V' or 'v' svg path command.
-    | VerticalTo    !Origin ![Coord]
-
-    -- | Cubic bezier, 'C' or 'c' command
-    | CurveTo  !Origin ![(RPoint, RPoint, RPoint)]
-    -- | Smooth cubic bezier, equivalent to 'S' or 's' command
-    | SmoothCurveTo  !Origin ![(RPoint, RPoint)]
-    -- | Quadratic bezier, 'Q' or 'q' command
-    | QuadraticBezier !Origin ![(RPoint, RPoint)]
-    -- | Quadratic bezier, 'T' or 't' command
-    | SmoothQuadraticBezierCurveTo  !Origin ![RPoint]
-      -- | Eliptical arc, 'A' or 'a' command.
-    | EllipticalArc !Origin ![(Coord, Coord, Coord, Bool, Bool, RPoint)]
-      -- | Close the path, 'Z' or 'z' svg path command.
-    | EndPath
-    deriving (Eq, Show)
-
--- | Description of path used in meshgradient tag
-data GradientPathCommand
-      -- | Line to, 'L' or 'l' Svg path command.
-    = GLine !Origin !(Maybe RPoint)
-      -- | Cubic bezier, 'C' or 'c' command
-    | GCurve !Origin !RPoint !RPoint !(Maybe RPoint)
-      -- | 'Z' command
-    | GClose
-    deriving (Eq, Show)
-
--- | Little helper function to build a point.
-toPoint :: Number -> Number -> Point
-toPoint = (,)
-
--- | Tell if the path command is an EllipticalArc.
-isPathArc :: PathCommand -> Bool
-isPathArc (EllipticalArc _ _) = True
-isPathArc _ = False
-
--- | Tell if a full path contain an EllipticalArc.
-isPathWithArc :: Foldable f => f PathCommand -> Bool
-isPathWithArc = F.any isPathArc
-
--- | Define the possible values of various *units attributes
--- used in the definition of the gradients and masks.
-data CoordinateUnits
-    = CoordUserSpace   -- ^ `userSpaceOnUse` value
-    | CoordBoundingBox -- ^ `objectBoundingBox` value
-    deriving (Eq, Show)
-
--- | This type represent the align information of the
--- preserveAspectRatio SVGattribute
-data Alignment
-  = AlignNone -- ^ "none" value
-  | AlignxMinYMin -- "xMinYMin" value
-  | AlignxMidYMin -- ^ "xMidYMin" value
-  | AlignxMaxYMin -- ^ "xMaxYMin" value
-  | AlignxMinYMid -- ^ "xMinYMid" value
-  | AlignxMidYMid -- ^ "xMidYMid" value
-  | AlignxMaxYMid -- ^ "xMaxYMid" value
-  | AlignxMinYMax -- ^ "xMinYMax" value
-  | AlignxMidYMax -- ^ "xMidYMax" value
-  | AlignxMaxYMax -- ^ "xMaxYMax" value
-  deriving (Eq, Show)
-
--- | This type represent the "meet or slice" information
--- of the preserveAspectRatio SVGattribute
-data MeetSlice = Meet | Slice
-    deriving (Eq, Show)
-
--- | Describe the content of the preserveAspectRatio attribute.
-data PreserveAspectRatio = PreserveAspectRatio
-  { _aspectRatioDefer     :: !Bool
-  , _aspectRatioAlign     :: !Alignment
-  , _aspectRatioMeetSlice :: !(Maybe MeetSlice)
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the PreserveAspectRatio type
-makeClassy ''PreserveAspectRatio 
-
-instance WithDefaultSvg PreserveAspectRatio where
-  defaultSvg = PreserveAspectRatio 
-    { _aspectRatioDefer     = False
-    , _aspectRatioAlign     = AlignxMidYMid
-    , _aspectRatioMeetSlice = Nothing
-    }
-
--- | Describe how the line should be terminated
--- when stroking them. Describe the values of the
--- `stroke-linecap` attribute.
--- See `_strokeLineCap`
-data Cap
-  = CapRound -- ^ End with a round (`round` value)
-  | CapButt  -- ^ Define straight just at the end (`butt` value)
-  | CapSquare -- ^ Straight further of the ends (`square` value)
-  deriving (Eq, Show)
-
--- | Define the possible values of the `stroke-linejoin`
--- attribute.
--- see `_strokeLineJoin`
-data LineJoin
-    = JoinMiter -- ^ `miter` value
-    | JoinBevel -- ^ `bevel` value
-    | JoinRound -- ^ `round` value
-    deriving (Eq, Show)
-
--- | Describe the different value which can be used
--- in the `fill` or `stroke` attributes.
-data Texture
-  = ColorRef   PixelRGBA8 -- ^ Direct solid color (#rrggbb, #rgb)
-  | TextureRef String     -- ^ Link to a complex texture (url(#name))
-  | FillNone              -- ^ Equivalent to the `none` value.
-  deriving (Eq, Show)
-
--- | Describe the possile filling algorithms.
--- Map the values of the `fill-rule` attributes.
-data FillRule
-    = FillEvenOdd -- ^ Correspond to the `evenodd` value.
-    | FillNonZero -- ^ Correspond to the `nonzero` value.
-    deriving (Eq, Show)
-
--- | Describe the content of the `transformation` attribute.
--- see `_transform` and `transform`.
-data Transformation
-    = -- | Directly encode the translation matrix.
-      TransformMatrix !Coord !Coord !Coord
-                      !Coord !Coord !Coord
-      -- | Translation along a vector
-    | Translate !Double !Double
-      -- | Scaling on both axis or on X axis and Y axis.
-    | Scale !Double !(Maybe Double)
-      -- | Rotation around `(0, 0)` or around an optional
-      -- point.
-    | Rotate !Double !(Maybe (Double, Double))
-      -- | Skew transformation along the X axis.
-    | SkewX !Double
-      -- | Skew transformation along the Y axis.
-    | SkewY !Double
-      -- | Unkown transformation, like identity.
-    | TransformUnknown
-    deriving (Eq, Show)
-
--- | Convert the Transformation to a string which can be
--- directly used in a svg attributes.
-serializeTransformation :: Transformation -> String
-serializeTransformation t = case t of
-  TransformUnknown -> ""
-  TransformMatrix a b c d e f ->
-      printf "matrix(%g, %g, %g, %g, %g, %g)" a b c d e f
-  Translate x y -> printf "translate(%g, %g)" x y
-  Scale x Nothing -> printf "scale(%g)" x
-  Scale x (Just y) -> printf "scale(%g, %g)" x y
-  Rotate angle Nothing -> printf "rotate(%g)" angle
-  Rotate angle (Just (x, y))-> printf "rotate(%g, %g, %g)" angle x y
-  SkewX x -> printf "skewX(%g)" x
-  SkewY y -> printf "skewY(%g)" y
-
--- | Transform a list of transformations to a string for svg
--- `transform` attributes.
-serializeTransformations :: [Transformation] -> String
-serializeTransformations =
-    unwords . fmap serializeTransformation
-
--- | Class helping find the drawing attributes for all
--- the SVG attributes.
-class WithDrawAttributes a where
-    -- | Lens which can be used to read/write primitives.
-    drawAttr :: Lens' a DrawAttributes
-
--- | Define an empty 'default' element for the SVG tree.
--- It is used as base when parsing the element from XML.
-class WithDefaultSvg a where
-    -- | The default element.
-    defaultSvg :: a
-
--- | Classify the font style, used to search a matching
--- font in the FontCache.
-data FontStyle
-  = FontStyleNormal
-  | FontStyleItalic
-  | FontStyleOblique
-  deriving (Eq, Show)
-
--- | Tell where to anchor the text, where the position
--- given is realative to the text.
-data TextAnchor
-    -- | The text with left aligned, or start at the postion
-    -- If the point is the '*' then the text will be printed
-    -- this way:
-    --
-    -- >  *THE_TEXT_TO_PRINT
-    --
-    -- Equivalent to the `start` value.
-  = TextAnchorStart
-    -- | The text is middle aligned, so the text will be at
-    -- the left and right of the position:
-    --
-    -- >   THE_TEXT*TO_PRINT
-    --
-    -- Equivalent to the `middle` value.
-  | TextAnchorMiddle
-    -- | The text is right aligned.
-    --
-    -- >   THE_TEXT_TO_PRINT*
-    --
-    -- Equivalent to the `end` value.
-  | TextAnchorEnd
-  deriving (Eq, Show)
-
-
--- | Correspond to the possible values of the
--- the attributes which are either `none` or
--- `url(#elem)`
-data ElementRef
-  = RefNone  -- ^ Value for `none`
-  | Ref String -- ^ Equivalent to `url()` attribute.
-  deriving (Eq, Show)
-
--- | This type define how to draw any primitives,
--- which color to use, how to stroke the primitives
--- and the potential transformations to use.
---
--- All these attributes are propagated to the children.
-data DrawAttributes = DrawAttributes
-    { -- | Attribute corresponding to the `stroke-width`
-      -- SVG attribute.
-      _strokeWidth      :: !(Last Number)
-      -- | Correspond to the `stroke` attribute.
-    , _strokeColor      :: !(Last Texture)
-      -- | Define the `stroke-opacity` attribute, the transparency
-      -- for the "border".
-    , _strokeOpacity    :: !(Maybe Float)
-      -- | Correspond to the `stroke-linecap` SVG
-      -- attribute
-    , _strokeLineCap    :: !(Last Cap)
-      -- | Correspond to the `stroke-linejoin` SVG
-      -- attribute
-    , _strokeLineJoin   :: !(Last LineJoin)
-      -- | Define the distance of the miter join, correspond
-      -- to the `stroke-miterlimit` attritbue.
-    , _strokeMiterLimit :: !(Last Double)
-      -- | Define the filling color of the elements. Corresponding
-      -- to the `fill` attribute.
-    , _fillColor        :: !(Last Texture)
-      -- | Define the `fill-opacity` attribute, the transparency
-      -- for the "content".
-    , _fillOpacity      :: !(Maybe Float)
-      -- | Define the global or group opacity attribute.
-    , _groupOpacity     :: !(Maybe Float)
-      -- | Content of the `transform` attribute
-    , _transform        :: !(Maybe [Transformation])
-      -- | Define the `fill-rule` used during the rendering.
-    , _fillRule         :: !(Last FillRule)
-      -- | Define the `mask` attribute.
-    , _maskRef          :: !(Last ElementRef)
-      -- | Define the `clip-path` attribute.
-    , _clipPathRef      :: !(Last ElementRef)
-      -- | Define the `clip-rule` attribute.
-    , _clipRule         :: !(Last FillRule)
-      -- | Map to the `class` attribute. Used for the CSS
-      -- rewriting.
-    , _attrClass        :: ![T.Text]
-      -- | Map to the `id` attribute. Used for the CSS
-      -- rewriting.
-    , _attrId           :: !(Maybe String)
-      -- | Define the start distance of the dashing pattern.
-      -- Correspond to the `stroke-dashoffset` attribute.
-    , _strokeOffset     :: !(Last Number)
-      -- | Define the dashing pattern for the lines. Correspond
-      -- to the `stroke-dasharray` attribute.
-    , _strokeDashArray  :: !(Last [Number])
-      -- | Current size of the text, correspond to the
-      -- `font-size` SVG attribute.
-    , _fontSize         :: !(Last Number)
-      -- | Define the possible fonts to be used for text rendering.
-      -- Map to the `font-family` attribute.
-    , _fontFamily       :: !(Last [String])
-      -- | Map to the `font-style` attribute.
-    , _fontStyle        :: !(Last FontStyle)
-      -- | Define how to interpret the text position, correspond
-      -- to the `text-anchor` attribute.
-    , _textAnchor       :: !(Last TextAnchor)
-      -- | Define the marker used for the start of the line.
-      -- Correspond to the `marker-start` attribute.
-    , _markerStart      :: !(Last ElementRef)
-      -- | Define the marker used for every point of the
-      -- polyline/path Correspond to the `marker-mid`
-      -- attribute.
-    , _markerMid        :: !(Last ElementRef)
-      -- | Define the marker used for the end of the line.
-      -- Correspond to the `marker-end` attribute.
-    , _markerEnd        :: !(Last ElementRef)
-    }
-    deriving (Eq, Show)
-
--- | Lenses for the DrawAttributes type.
-makeClassy ''DrawAttributes
-
--- | This primitive describe an unclosed suite of
--- segments. Correspond to the `<polyline>` tag.
-data PolyLine = PolyLine
-  { -- | drawing attributes of the polyline.
-    _polyLineDrawAttributes :: !DrawAttributes
-
-    -- | Geometry definition of the polyline.
-    -- correspond to the `points` attribute
-  , _polyLinePoints :: ![RPoint]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the PolyLine type.
-makeClassy ''PolyLine
-
-instance WithDefaultSvg PolyLine where
-  defaultSvg = PolyLine
-    { _polyLineDrawAttributes = mempty
-    , _polyLinePoints = []
-    }
-
-
-instance WithDrawAttributes PolyLine where
-    drawAttr = polyLineDrawAttributes
-
--- | Primitive decriving polygon composed
--- of segements. Correspond to the `<polygon>`
--- tag
-data Polygon = Polygon
-  { -- | Drawing attributes for the polygon.
-    _polygonDrawAttributes :: !DrawAttributes
-    -- | Points of the polygon. Correspond to
-    -- the `points` attributes.
-  , _polygonPoints :: ![RPoint]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Polygon type
-makeClassy ''Polygon
-
-instance WithDrawAttributes Polygon where
-    drawAttr = polygonDrawAttributes
-
-instance WithDefaultSvg Polygon where
-  defaultSvg = Polygon
-    { _polygonDrawAttributes = mempty
-    , _polygonPoints = []
-    }
-
--- | Define a simple line. Correspond to the
--- `<line>` tag.
-data Line = Line
-  { -- | Drawing attributes of line.
-    _lineDrawAttributes :: !DrawAttributes
-    -- | First point of the the line, correspond
-    -- to the `x1` and `y1` attributes.
-  , _linePoint1 :: !Point
-    -- | Second point of the the line, correspond
-    -- to the `x2` and `y2` attributes.
-  , _linePoint2 :: !Point
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Line type.
-makeClassy ''Line
-
-instance WithDrawAttributes Line where
-    drawAttr = lineDrawAttributes
-
-instance WithDefaultSvg Line where
-  defaultSvg = Line
-    { _lineDrawAttributes = mempty
-    , _linePoint1 = zeroPoint
-    , _linePoint2 = zeroPoint
-    }
-    where zeroPoint = (Num 0, Num 0)
-
--- | Define a rectangle. Correspond to
--- `<rectangle>` svg tag.
-data Rectangle = Rectangle
-  { -- | Rectangle drawing attributes.
-    _rectDrawAttributes  :: !DrawAttributes
-    -- | Upper left corner of the rectangle, correspond
-    -- to the attributes `x` and `y`.
-  , _rectUpperLeftCorner :: !Point
-    -- | Rectangle width, correspond, strangely, to
-    -- the `width` attribute.
-  , _rectWidth           :: !Number
-    -- | Rectangle height, correspond, amazingly, to
-    -- the `height` attribute.
-  , _rectHeight          :: !Number
-    -- | Define the rounded corner radius radius
-    -- of the rectangle. Correspond to the `rx` and
-    -- `ry` attributes.
-  , _rectCornerRadius    :: !(Number, Number)
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Rectangle type.
-makeClassy ''Rectangle
-
-instance WithDrawAttributes Rectangle where
-    drawAttr = rectDrawAttributes
-
-instance WithDefaultSvg Rectangle where
-  defaultSvg = Rectangle
-    { _rectDrawAttributes  = mempty
-    , _rectUpperLeftCorner = (Num 0, Num 0)
-    , _rectWidth           = Num 0
-    , _rectHeight          = Num 0
-    , _rectCornerRadius    = (Num 0, Num 0)
-    }
-
--- | Type mapping the `<path>` svg tag.
-data Path = Path
-  { -- | Drawing attributes of the path.
-    _pathDrawAttributes :: !DrawAttributes
-    -- | Definition of the path, correspond to the
-    -- `d` attributes.
-  , _pathDefinition :: ![PathCommand]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Path type
-makeClassy ''Path
-
-instance WithDrawAttributes Path where
-  drawAttr = pathDrawAttributes
-
-instance WithDefaultSvg Path where
-  defaultSvg = Path
-    { _pathDrawAttributes = mempty
-    , _pathDefinition = []
-    }
-
--- | Define a SVG group, corresponding `<g>` tag.
-data Group a = Group
-  { -- | Group drawing attributes, propagated to all of its
-    -- children.
-    _groupDrawAttributes :: !DrawAttributes
-    -- | Content of the group, corresponding to all the tags
-    -- inside the `<g>` tag.
-  , _groupChildren  :: ![a]
-    -- | Mapped to the attribute `viewBox`
-  , _groupViewBox   :: !(Maybe (Double, Double, Double, Double))
-    -- | used for symbols only
-  , _groupAspectRatio :: !PreserveAspectRatio
-  }
-  deriving (Eq, Show)
-
--- | Lenses associated to the Group type.
-makeClassy ''Group
-
-instance WithDrawAttributes (Group a) where
-    drawAttr = groupDrawAttributes
-
-instance WithDefaultSvg (Group a) where
-  defaultSvg = Group
-    { _groupDrawAttributes = mempty
-    , _groupChildren  = []
-    , _groupViewBox = Nothing
-    , _groupAspectRatio = defaultSvg
-    }
-
--- | Define the `<symbol>` tag, equivalent to
--- a named group.
-newtype Symbol a =
-    Symbol { _groupOfSymbol :: Group a }
-  deriving (Eq, Show)
-
--- | Lenses associated with the Symbol type.
-makeLenses ''Symbol
-
-instance WithDrawAttributes (Symbol a) where
-  drawAttr = groupOfSymbol . drawAttr
-
-instance WithDefaultSvg (Symbol a) where
-  defaultSvg = Symbol defaultSvg
-
--- | Define a `<circle>`.
-data Circle = Circle
-  { -- | Drawing attributes of the circle.
-    _circleDrawAttributes :: !DrawAttributes
-    -- | Define the center of the circle, describe
-    -- the `cx` and `cy` attributes.
-  , _circleCenter   :: !Point
-    -- | Radius of the circle, equivalent to the `r`
-    -- attribute.
-  , _circleRadius   :: !Number
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Circle type.
-makeClassy ''Circle
-
-instance WithDrawAttributes Circle where
-    drawAttr = circleDrawAttributes
-
-instance WithDefaultSvg Circle where
-  defaultSvg = Circle
-    { _circleDrawAttributes = mempty
-    , _circleCenter = (Num 0, Num 0)
-    , _circleRadius = Num 0
-    }
-
--- | Define an `<ellipse>`
-data Ellipse = Ellipse
-  {  -- | Drawing attributes of the ellipse.
-    _ellipseDrawAttributes :: !DrawAttributes
-    -- | Center of the ellipse, map to the `cx`
-    -- and `cy` attributes.
-  , _ellipseCenter :: !Point
-    -- | Radius along the X axis, map the
-    -- `rx` attribute.
-  , _ellipseXRadius :: !Number
-    -- | Radius along the Y axis, map the
-    -- `ry` attribute.
-  , _ellipseYRadius :: !Number
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the ellipse type.
-makeClassy ''Ellipse
-
-instance WithDrawAttributes Ellipse where
-  drawAttr = ellipseDrawAttributes
-
-instance WithDefaultSvg Ellipse where
-  defaultSvg = Ellipse
-    { _ellipseDrawAttributes = mempty
-    , _ellipseCenter = (Num 0, Num 0)
-    , _ellipseXRadius = Num 0
-    , _ellipseYRadius = Num 0
-    }
-
--- | Define a color stop for the gradients. Represent
--- the `<stop>` SVG tag.
-data GradientStop = GradientStop
-    { -- | Gradient offset between 0 and 1, correspond
-      -- to the `offset` attribute.
-      _gradientOffset :: !Float
-      -- | Color of the gradient stop. Correspond
-      -- to the `stop-color` attribute.
-    , _gradientColor  :: !PixelRGBA8
-      -- | Path command used in mesh patch
-    , _gradientPath   :: !(Maybe GradientPathCommand)
-      -- | Stop color opacity
-    , _gradientOpacity :: !(Maybe Float)
-    }
-    deriving (Eq, Show)
-
--- | Lenses for the GradientStop type.
-makeClassy ''GradientStop
-
-instance WithDefaultSvg GradientStop where
-  defaultSvg = GradientStop
-    { _gradientOffset = 0.0
-    , _gradientColor  = PixelRGBA8 0 0 0 255
-    , _gradientPath   = Nothing
-    , _gradientOpacity = Nothing
-    }
-
-
--- | Define `<meshpatch>` SVG tag
-data MeshGradientPatch = MeshGradientPatch
-  { -- | List of stop, from 2 to 4 in a patch
-    _meshGradientPatchStops :: ![GradientStop]
-  }
-  deriving (Eq, Show)
-
-makeClassy ''MeshGradientPatch
-
-instance WithDefaultSvg MeshGradientPatch where
-  defaultSvg = MeshGradientPatch []
-
--- | Define a `<meshrow>` tag.
-data MeshGradientRow = MeshGradientRow
-  { -- | List of patch in a row
-    _meshGradientRowPatches :: ![MeshGradientPatch]
-  }
-  deriving (Eq, Show)
-
-makeClassy ''MeshGradientRow
-
-instance WithDefaultSvg MeshGradientRow where
-  defaultSvg = MeshGradientRow []
-
-
--- | Define a `<meshgradient>` tag.
-data MeshGradient = MeshGradient
-  { _meshGradientDrawAttributes :: !DrawAttributes
-    -- | Original x coordinate of the mesh gradient
-  , _meshGradientX              :: !Number
-    -- | Original y coordinate of the mesh gradient
-  , _meshGradientY              :: !Number
-    -- | Type of color interpolation to use
-  , _meshGradientType           :: !MeshGradientType
-    -- | Coordiante system to use
-  , _meshGradientUnits          :: !CoordinateUnits
-    -- | Optional transform
-  , _meshGradientTransform      :: ![Transformation]
-    -- | List of patch rows in the the mesh.
-  , _meshGradientRows           :: ![MeshGradientRow]
-  }
-  deriving (Eq, Show)
-
-makeClassy ''MeshGradient
-
-instance WithDrawAttributes MeshGradient where
-  drawAttr = meshGradientDrawAttributes
-
-instance WithDefaultSvg MeshGradient where
-  defaultSvg = MeshGradient
-    { _meshGradientDrawAttributes = mempty
-    , _meshGradientX              = Percent 0
-    , _meshGradientY              = Percent 0
-    , _meshGradientType           = GradientBilinear
-    , _meshGradientUnits          = CoordBoundingBox
-    , _meshGradientTransform      = mempty
-    , _meshGradientRows           = mempty
-    }
-
-
--- | Define an `<image>` tag.
-data Image = Image
-  { -- | Drawing attributes of the image
-    _imageDrawAttributes :: !DrawAttributes
-    -- | Position of the image referenced by its
-    -- upper left corner.
-  , _imageCornerUpperLeft :: !Point
-    -- | Image width
-  , _imageWidth :: !Number
-    -- | Image Height
-  , _imageHeight :: !Number
-    -- | Image href, pointing to the real image.
-  , _imageHref :: !String
-    -- | preserveAspectRatio attribute
-  , _imageAspectRatio :: !PreserveAspectRatio
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Image type.
-makeClassy ''Image
-
-instance WithDrawAttributes Image where
-  drawAttr = imageDrawAttributes
-
-instance WithDefaultSvg Image where
-  defaultSvg = Image
-    { _imageDrawAttributes = mempty
-    , _imageCornerUpperLeft = (Num 0, Num 0)
-    , _imageWidth = Num 0
-    , _imageHeight = Num 0
-    , _imageHref = ""
-    , _imageAspectRatio = defaultSvg
-    }
-
--- | Define an `<use>` for a named content.
--- Every named content can be reused in the
--- document using this element.
-data Use = Use
-  { -- | Position where to draw the "used" element.
-    -- Correspond to the `x` and `y` attributes.
-    _useBase   :: Point
-    -- | Referenced name, correspond to `xlink:href`
-    -- attribute.
-  , _useName   :: String
-    -- | Define the width of the region where
-    -- to place the element. Map to the `width`
-    -- attribute.
-  , _useWidth  :: Maybe Number
-    -- | Define the height of the region where
-    -- to place the element. Map to the `height`
-    -- attribute.
-  , _useHeight :: Maybe Number
-    -- | Use draw attributes.
-  , _useDrawAttributes :: DrawAttributes
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Use type.
-makeClassy ''Use
-
-instance WithDrawAttributes Use where
-  drawAttr = useDrawAttributes
-
-instance WithDefaultSvg Use where
-  defaultSvg = Use
-    { _useBase   = (Num 0, Num 0)
-    , _useName   = ""
-    , _useWidth  = Nothing
-    , _useHeight = Nothing
-    , _useDrawAttributes = mempty
-    }
-
--- | Define position information associated to
--- `<text>` or `<tspan>` svg tag.
-data TextInfo = TextInfo
-  { _textInfoX      :: ![Number] -- ^ `x` attribute.
-  , _textInfoY      :: ![Number] -- ^ `y` attribute.
-  , _textInfoDX     :: ![Number] -- ^ `dx` attribute.
-  , _textInfoDY     :: ![Number] -- ^ `dy` attribute.
-  , _textInfoRotate :: ![Double] -- ^ `rotate` attribute.
-  , _textInfoLength :: !(Maybe Number) -- ^ `textLength` attribute.
-  }
-  deriving (Eq, Show)
-
-instance Monoid TextInfo where
-  mempty = TextInfo [] [] [] [] [] Nothing
-  mappend (TextInfo x1 y1 dx1 dy1 r1 l1)
-          (TextInfo x2 y2 dx2 dy2 r2 l2) =
-    TextInfo (x1 <> x2)   (y1 <> y2)
-                (dx1 <> dx2) (dy1 <> dy2)
-                (r1 <> r2)
-                (getLast $ Last l1 <> Last l2)
-
--- | Lenses for the TextInfo type.
-makeClassy ''TextInfo
-
-instance WithDefaultSvg TextInfo where
-  defaultSvg = mempty
-
--- | Define the content of a `<tspan>` tag.
-data TextSpanContent
-    = SpanText    !T.Text -- ^ Raw text
-    | SpanTextRef !String -- ^ Equivalent to a `<tref>`
-    | SpanSub     !TextSpan -- ^ Define a `<tspan>`
-    deriving (Eq, Show)
-
--- | Define a `<tspan>` tag.
-data TextSpan = TextSpan
-  { -- | Placing information for the text.
-    _spanInfo           :: !TextInfo
-    -- | Drawing attributes for the text span.
-  , _spanDrawAttributes :: !DrawAttributes
-    -- | Content of the span.
-  , _spanContent        :: ![TextSpanContent]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the TextSpan type.
-makeClassy ''TextSpan
-
-instance WithDefaultSvg TextSpan where
-  defaultSvg = TextSpan
-    { _spanInfo = defaultSvg
-    , _spanDrawAttributes = mempty
-    , _spanContent        = mempty
-    }
-
--- | Describe the content of the `method` attribute on
--- text path.
-data TextPathMethod
-  = TextPathAlign   -- ^ Map to the `align` value.
-  | TextPathStretch -- ^ Map to the `stretch` value.
-  deriving (Eq, Show)
-
--- | Describe the content of the `spacing` text path
--- attribute.
-data TextPathSpacing
-  = TextPathSpacingExact -- ^ Map to the `exact` value.
-  | TextPathSpacingAuto  -- ^ Map to the `auto` value.
-  deriving (Eq, Show)
-
--- | Describe the `<textpath>` SVG tag.
-data TextPath = TextPath
-  { -- | Define the beginning offset on the path,
-    -- the `startOffset` attribute.
-    _textPathStartOffset :: !Number
-    -- | Define the `xlink:href` attribute.
-  , _textPathName        :: !String
-    -- | Correspond to the `method` attribute.
-  , _textPathMethod      :: !TextPathMethod
-    -- | Correspond to the `spacing` attribute.
-  , _textPathSpacing     :: !TextPathSpacing
-    -- | Real content of the path.
-  , _textPathData        :: ![PathCommand]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the TextPath type.
-makeClassy ''TextPath
-
-instance WithDefaultSvg TextPath where
-  defaultSvg = TextPath
-    { _textPathStartOffset = Num 0
-    , _textPathName        = mempty
-    , _textPathMethod      = TextPathAlign
-    , _textPathSpacing     = TextPathSpacingExact
-    , _textPathData        = []
-    }
-
--- | Define the possible values of the `lengthAdjust`
--- attribute.
-data TextAdjust
-  = TextAdjustSpacing -- ^ Value `spacing`
-  | TextAdjustSpacingAndGlyphs -- ^ Value `spacingAndGlyphs`
-  deriving (Eq, Show)
-
--- | Define the global `<tag>` SVG tag.
-data Text = Text
-  { -- | Define the `lengthAdjust` attribute.
-    _textAdjust   :: !TextAdjust
-    -- | Root of the text content.
-  , _textRoot     :: !TextSpan
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Text type.
-makeClassy ''Text
-
--- | Little helper to create a SVG text at a given
--- baseline position.
-textAt :: Point -> T.Text -> Text
-textAt (x, y) txt = Text TextAdjustSpacing tspan where
-  tspan = defaultSvg
-        { _spanContent = [SpanText txt]
-        , _spanInfo = defaultSvg
-                    { _textInfoX = [x]
-                    , _textInfoY = [y]
-                    }
-        }
-
-instance WithDrawAttributes Text where
-  drawAttr = textRoot . spanDrawAttributes
-
-instance WithDefaultSvg Text where
-  defaultSvg = Text
-    { _textRoot = defaultSvg
-    , _textAdjust = TextAdjustSpacing
-    }
-
--- | Main type for the scene description, reorient to
--- specific type describing each tag.
-data Tree
-    = None
-    | UseTree { useInformation :: !Use
-              , useSubTree     :: !(Maybe Tree) }
-    | GroupTree     !(Group Tree)
-    | SymbolTree    !(Symbol Tree)
-    | PathTree      !Path
-    | CircleTree    !Circle
-    | PolyLineTree  !PolyLine
-    | PolygonTree   !Polygon
-    | EllipseTree   !Ellipse
-    | LineTree      !Line
-    | RectangleTree !Rectangle
-    | TextTree      !(Maybe TextPath) !Text
-    | ImageTree     !Image
-    | MeshGradientTree !MeshGradient
-    deriving (Eq, Show)
-
--- | Define the orientation, associated to the
--- `orient` attribute on the Marker
-data MarkerOrientation
-  = OrientationAuto        -- ^ Auto value
-  | OrientationAngle Coord -- ^ Specific angle.
-  deriving (Eq, Show)
-
--- | Define the content of the `markerUnits` attribute
--- on the Marker.
-data MarkerUnit
-  = MarkerUnitStrokeWidth    -- ^ Value `strokeWidth`
-  | MarkerUnitUserSpaceOnUse -- ^ Value `userSpaceOnUse`
-  deriving (Eq, Show)
-
--- | Define the content of the `markerUnits` attribute
--- on the Marker.
-data Overflow
-  = OverflowVisible    -- ^ Value `visible`
-  | OverflowHidden     -- ^ Value `hidden`
-  deriving (Eq, Show)
-
--- | Define the `<marker>` tag.
-data Marker = Marker
-  { -- | Draw attributes of the marker.
-    _markerDrawAttributes :: DrawAttributes
-    -- | Define the reference point of the marker.
-    -- correspond to the `refX` and `refY` attributes.
-  , _markerRefPoint    :: !(Number, Number)
-    -- | Define the width of the marker. Correspond to
-    -- the `markerWidth` attribute.
-  , _markerWidth       :: !(Maybe Number)
-    -- | Define the height of the marker. Correspond to
-    -- the `markerHeight` attribute.
-  , _markerHeight      :: !(Maybe Number)
-    -- | Correspond to the `orient` attribute.
-  , _markerOrient      :: !(Maybe MarkerOrientation)
-    -- | Map the `markerUnits` attribute.
-  , _markerUnits       :: !(Maybe MarkerUnit)
-    -- | Optional viewbox
-  , _markerViewBox     :: !(Maybe (Double, Double, Double, Double))
-    -- | Elements defining the marker.
-  , _markerOverflow    :: !(Maybe Overflow)
-    -- | preserveAspectRatio attribute
-  , _markerAspectRatio :: !PreserveAspectRatio
-    -- | Elements defining the marker.
-  , _markerElements :: [Tree]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Marker type.
-makeClassy ''Marker
-
-instance WithDrawAttributes Marker where
-    drawAttr = markerDrawAttributes
-
-instance WithDefaultSvg Marker where
-  defaultSvg = Marker
-    { _markerDrawAttributes = mempty
-    , _markerRefPoint = (Num 0, Num 0)
-    , _markerWidth = Just (Num 3)
-    , _markerHeight = Just (Num 3)
-    , _markerOrient = Nothing -- MarkerOrientation
-    , _markerUnits = Nothing -- MarkerUnitStrokeWidth
-    , _markerViewBox = Nothing
-    , _markerOverflow = Nothing
-    , _markerElements = mempty
-    , _markerAspectRatio = defaultSvg
-    }
-
--- | Insert element in the first sublist in the list of list.
-appNode :: [[a]] -> a -> [[a]]
-appNode [] e = [[e]]
-appNode (curr:above) e = (e:curr) : above
-
--- | Map a tree while propagating context information.
--- The function passed in parameter receive a list
--- representing the the path used to go arrive to the
--- current node.
-zipTree :: ([[Tree]] -> Tree) -> Tree -> Tree
-zipTree f = dig [] where
-  dig prev e@None = f $ appNode prev e
-  dig prev e@(UseTree _ Nothing) = f $ appNode prev e
-  dig prev e@(UseTree nfo (Just u)) =
-      f . appNode prev . UseTree nfo . Just $ dig ([] : appNode prev e) u
-  dig prev e@(GroupTree g) =
-      f . appNode prev . GroupTree $ zipGroup (appNode prev e) g
-  dig prev e@(SymbolTree g) =
-      f . appNode prev . SymbolTree . Symbol .
-            zipGroup (appNode prev e) $ _groupOfSymbol g
-  dig prev e@(PathTree _) = f $ appNode prev e
-  dig prev e@(CircleTree _) = f $ appNode prev e
-  dig prev e@(PolyLineTree _) = f $ appNode prev e
-  dig prev e@(PolygonTree _) = f $ appNode prev e
-  dig prev e@(EllipseTree _) = f $ appNode prev e
-  dig prev e@(LineTree _) = f $ appNode prev e
-  dig prev e@(RectangleTree _) = f $ appNode prev e
-  dig prev e@(TextTree _ _) = f $ appNode prev e
-  dig prev e@(ImageTree _) = f $ appNode prev e
-  dig prev e@(MeshGradientTree _) = f $ appNode prev e
-
-  zipGroup prev g = g { _groupChildren = updatedChildren }
-    where
-      groupChild = _groupChildren g
-      updatedChildren =
-        [dig (c:prev) child
-            | (child, c) <- zip groupChild $ inits groupChild]
-
--- | Fold all nodes of a SVG tree.
-foldTree :: (a -> Tree -> a) -> a -> Tree -> a
-foldTree f = go where
-  go acc e = case e of
-    None            -> f acc e
-    UseTree _ _     -> f acc e
-    PathTree _      -> f acc e
-    CircleTree _    -> f acc e
-    PolyLineTree _  -> f acc e
-    PolygonTree _   -> f acc e
-    EllipseTree _   -> f acc e
-    LineTree _      -> f acc e
-    RectangleTree _ -> f acc e
-    TextTree    _ _ -> f acc e
-    ImageTree _     -> f acc e
-    MeshGradientTree _ -> f acc e
-    GroupTree g     ->
-      let subAcc = F.foldl' go acc $ _groupChildren g in
-      f subAcc e
-    SymbolTree s    ->
-      let subAcc =
-            F.foldl' go acc . _groupChildren $ _groupOfSymbol s in
-      f subAcc e
-
--- | Helper function mapping every tree element.
-mapTree :: (Tree -> Tree) -> Tree -> Tree
-mapTree f = go where
-  go e@None = f e
-  go e@(UseTree _ _) = f e
-  go (GroupTree g) = f . GroupTree $ mapGroup g
-  go (SymbolTree g) =
-      f . SymbolTree . Symbol . mapGroup $ _groupOfSymbol g
-  go e@(PathTree _) = f e
-  go e@(CircleTree _) = f e
-  go e@(PolyLineTree _) = f e
-  go e@(PolygonTree _) = f e
-  go e@(EllipseTree _) = f e
-  go e@(LineTree _) = f e
-  go e@(RectangleTree _) = f e
-  go e@(TextTree _ _) = f e
-  go e@(ImageTree _) = f e
-  go e@(MeshGradientTree _) = f e
-
-  mapGroup g =
-      g { _groupChildren = map go $ _groupChildren g }
-
--- | For every element of a svg tree, associate
--- it's SVG tag name.
-nameOfTree :: Tree -> T.Text
-nameOfTree v =
-  case v of
-   None     -> ""
-   UseTree _ _     -> "use"
-   GroupTree _     -> "g"
-   SymbolTree _    -> "symbol"
-   PathTree _      -> "path"
-   CircleTree _    -> "circle"
-   PolyLineTree _  -> "polyline"
-   PolygonTree _   -> "polygon"
-   EllipseTree _   -> "ellipse"
-   LineTree _      -> "line"
-   RectangleTree _ -> "rectangle"
-   TextTree    _ _ -> "text"
-   ImageTree _     -> "image"
-   MeshGradientTree _ -> "meshgradient"
-
-drawAttrOfTree :: Tree -> DrawAttributes
-drawAttrOfTree v = case v of
-  None -> mempty
-  UseTree e _ -> e ^. drawAttr
-  GroupTree e -> e ^. drawAttr
-  SymbolTree e -> e ^. drawAttr
-  PathTree e -> e ^. drawAttr
-  CircleTree e -> e ^. drawAttr
-  PolyLineTree e -> e ^. drawAttr
-  PolygonTree e -> e ^. drawAttr
-  EllipseTree e -> e ^. drawAttr
-  LineTree e -> e ^. drawAttr
-  RectangleTree e -> e ^. drawAttr
-  TextTree _ e -> e ^. drawAttr
-  ImageTree e -> e ^. drawAttr
-  MeshGradientTree e -> e ^. drawAttr
-
-setDrawAttrOfTree :: Tree -> DrawAttributes -> Tree
-setDrawAttrOfTree v attr = case v of
-  None -> None
-  UseTree e m -> UseTree (e & drawAttr .~ attr) m
-  GroupTree e -> GroupTree $ e & drawAttr .~ attr
-  SymbolTree e -> SymbolTree $ e & drawAttr .~ attr
-  PathTree e -> PathTree $ e & drawAttr .~ attr
-  CircleTree e -> CircleTree $ e & drawAttr .~ attr
-  PolyLineTree e -> PolyLineTree $ e & drawAttr .~ attr
-  PolygonTree e -> PolygonTree $ e & drawAttr .~ attr
-  EllipseTree e -> EllipseTree $ e & drawAttr .~ attr
-  LineTree e -> LineTree $ e & drawAttr .~ attr
-  RectangleTree e -> RectangleTree $ e & drawAttr .~ attr
-  TextTree a e -> TextTree a $ e & drawAttr .~ attr
-  ImageTree e -> ImageTree $ e & drawAttr .~ attr
-  MeshGradientTree e -> MeshGradientTree $ e & drawAttr .~ attr
-
-instance WithDrawAttributes Tree where
-    drawAttr = lens drawAttrOfTree setDrawAttrOfTree
-
-instance WithDefaultSvg Tree where
-    defaultSvg = None
-
--- | Define the possible values for the `spreadMethod`
--- values used for the gradient definitions.
-data Spread
-    = SpreadRepeat  -- ^ `reapeat` value
-    | SpreadPad     -- ^ `pad` value
-    | SpreadReflect -- ^ `reflect value`
-    deriving (Eq, Show)
-
--- | Define a `<linearGradient>` tag.
-data LinearGradient = LinearGradient
-    { -- | Define coordinate system of the gradient,
-      -- associated to the `gradientUnits` attribute.
-      _linearGradientUnits  :: CoordinateUnits
-      -- | Point defining the beginning of the line gradient.
-      -- Associated to the `x1` and `y1` attribute.
-    , _linearGradientStart  :: Point
-      -- | Point defining the end of the line gradient.
-      -- Associated to the `x2` and `y2` attribute.
-    , _linearGradientStop   :: Point
-      -- | Define how to handle the values outside
-      -- the gradient start and stop. Associated to the
-      -- `spreadMethod` attribute.
-    , _linearGradientSpread :: Spread
-      -- | Define the transformation to apply to the
-      -- gradient points. Associated to the `gradientTransform`
-      -- attribute.
-    , _linearGradientTransform :: [Transformation]
-      -- | List of color stops of the linear gradient.
-    , _linearGradientStops  :: [GradientStop]
-    }
-    deriving (Eq, Show)
-
--- | Lenses for the LinearGradient type.
-makeClassy ''LinearGradient
-
-instance WithDefaultSvg LinearGradient where
-  defaultSvg = LinearGradient
-    { _linearGradientUnits     = CoordBoundingBox
-    , _linearGradientStart     = (Percent 0, Percent 0)
-    , _linearGradientStop      = (Percent 1, Percent 0)
-    , _linearGradientSpread    = SpreadPad
-    , _linearGradientTransform = []
-    , _linearGradientStops     = []
-    }
-
--- | Define a `<radialGradient>` tag.
-data RadialGradient = RadialGradient
-  { -- | Define coordinate system of the gradient,
-    -- associated to the `gradientUnits` attribute.
-    _radialGradientUnits   :: CoordinateUnits
-    -- | Center of the radial gradient. Associated to
-    -- the `cx` and `cy` attributes.
-  , _radialGradientCenter  :: Point
-    -- | Radius of the radial gradient. Associated to
-    -- the `r` attribute.
-  , _radialGradientRadius  :: Number
-    -- | X coordinate of the focus point of the radial
-    -- gradient. Associated to the `fx` attribute.
-  , _radialGradientFocusX  :: Maybe Number
-    -- | Y coordinate of the focus point of the radial
-    -- gradient. Associated to the `fy` attribute.
-  , _radialGradientFocusY  :: Maybe Number
-    -- | Define how to handle the values outside
-    -- the gradient start and stop. Associated to the
-    -- `spreadMethod` attribute.
-  , _radialGradientSpread  :: Spread
-    -- | Define the transformation to apply to the
-    -- gradient points. Associated to the `gradientTransform`
-    -- attribute.
-  , _radialGradientTransform :: [Transformation]
-    -- | List of color stops of the radial gradient.
-  , _radialGradientStops   :: [GradientStop]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the RadialGradient type.
-makeClassy ''RadialGradient
-
-instance WithDefaultSvg RadialGradient where
-  defaultSvg = RadialGradient
-    { _radialGradientUnits   = CoordBoundingBox
-    , _radialGradientCenter  = (Percent 0.5, Percent 0.5)
-    , _radialGradientRadius  = Percent 0.5
-    , _radialGradientFocusX  = Nothing
-    , _radialGradientFocusY  = Nothing
-    , _radialGradientSpread  = SpreadPad
-    , _radialGradientTransform = []
-    , _radialGradientStops   = []
-    }
-
--- | Define a SVG `<mask>` tag.
-data Mask = Mask
-  { -- | Drawing attributes of the Mask
-    _maskDrawAttributes :: DrawAttributes
-    -- | Correspond to the `maskContentUnits` attributes.
-  , _maskContentUnits :: CoordinateUnits
-    -- | Mapping to the `maskUnits` attribute.
-  , _maskUnits        :: CoordinateUnits
-    -- | Map to the `x` and `y` attributes.
-  , _maskPosition     :: Point
-    -- | Map to the `width` attribute
-  , _maskWidth        :: Number
-    -- | Map to the `height` attribute.
-  , _maskHeight       :: Number
-    -- | Children of the `<mask>` tag.
-  , _maskContent      :: [Tree]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the Mask type.
-makeClassy ''Mask
-
-instance WithDrawAttributes Mask where
-  drawAttr = maskDrawAttributes
-
-instance WithDefaultSvg Mask where
-  defaultSvg = Mask
-    { _maskDrawAttributes = mempty
-    , _maskContentUnits = CoordUserSpace
-    , _maskUnits        = CoordBoundingBox
-    , _maskPosition     = (Percent (-0.1), Percent (-0.1))
-    , _maskWidth        = Percent 1.2
-    , _maskHeight       = Percent 1.2
-    , _maskContent      = []
-    }
-
--- | Define a `<clipPath>` tag.
-data ClipPath = ClipPath
-  { _clipPathDrawAttributes :: DrawAttributes
-    -- | Maps to the `clipPathUnits` attribute
-  , _clipPathUnits          :: CoordinateUnits
-    -- | Maps to the content of the tree
-  , _clipPathContent        :: [Tree]
-  }
-  deriving (Eq, Show)
-
--- | Lenses for the ClipPath type.
-makeClassy ''ClipPath
-
-instance WithDrawAttributes ClipPath where
-  drawAttr = clipPathDrawAttributes
-
-instance WithDefaultSvg ClipPath where
-  defaultSvg = ClipPath
-    { _clipPathDrawAttributes = mempty
-    , _clipPathUnits = CoordUserSpace
-    , _clipPathContent = mempty
-    }
-
--- | Define a `<pattern>` tag.
-data Pattern = Pattern
-    { -- | Pattern drawing attributes.
-      _patternDrawAttributes :: !DrawAttributes
-      -- | Possible `viewBox`.
-    , _patternViewBox  :: !(Maybe (Double, Double, Double, Double))
-      -- | Width of the pattern tile, mapped to the
-      -- `width` attribute
-    , _patternWidth    :: !Number
-      -- | Height of the pattern tile, mapped to the
-      -- `height` attribute
-    , _patternHeight   :: !Number
-      -- | Pattern tile base, mapped to the `x` and
-      -- `y` attributes.
-    , _patternPos      :: !Point
-      -- | Patterns can be chained, so this is a potential
-      -- reference to another pattern
-    , _patternHref     :: !String
-      -- | Elements used in the pattern.
-    , _patternElements :: ![Tree]
-      -- | Define the cordinate system to use for
-      -- the pattern. Mapped to the `patternUnits`
-      -- attribute.
-    , _patternUnit        :: !CoordinateUnits
-      -- | Value of the "preserveAspectRatio" attribute
-    , _patternAspectRatio :: !PreserveAspectRatio 
-      -- | Value of "patternTransform" attribute
-    , _patternTransform   :: !(Maybe [Transformation])
-    }
-    deriving Show
-
--- | Lenses for the Patter type.
-makeClassy ''Pattern
-
-instance WithDrawAttributes Pattern where
-    drawAttr = patternDrawAttributes
-
-instance WithDefaultSvg Pattern where
-  defaultSvg = Pattern
-    { _patternViewBox  = Nothing
-    , _patternWidth    = Num 0
-    , _patternHeight   = Num 0
-    , _patternPos      = (Num 0, Num 0)
-    , _patternElements = []
-    , _patternUnit = CoordBoundingBox
-    , _patternDrawAttributes = mempty
-    , _patternAspectRatio = defaultSvg
-    , _patternHref = ""
-    , _patternTransform = mempty
-    }
-
--- | Sum types helping keeping track of all the namable
--- elemens in a SVG document.
-data Element
-    = ElementLinearGradient LinearGradient
-    | ElementRadialGradient RadialGradient
-    | ElementMeshGradient   MeshGradient
-    | ElementGeometry Tree
-    | ElementPattern  Pattern
-    | ElementMarker Marker
-    | ElementMask Mask
-    | ElementClipPath ClipPath
-    deriving Show
-
--- | Represent a full svg document with style,
--- geometry and named elements.
-data Document = Document
-    { _viewBox          :: Maybe (Double, Double, Double, Double)
-    , _width            :: Maybe Number
-    , _height           :: Maybe Number
-    , _elements         :: [Tree]
-    , _definitions      :: M.Map String Element
-    , _description      :: String
-    , _styleRules       :: [CssRule]
-    , _documentLocation :: FilePath
-    }
-    deriving Show
-
--- | Lenses associated to a SVG document.
-makeClassy ''Document
-
--- | Calculate the document size in function of the
--- different available attributes in the document.
-documentSize :: Dpi -> Document -> (Int, Int)
-documentSize _ Document { _viewBox = Just (x1, y1, x2, y2)
-                        , _width = Just (Percent pw)
-                        , _height = Just (Percent ph)
-                        } =
-    (floor $ dx * pw, floor $ dy * ph)
-      where
-        dx = abs $ x2 - x1
-        dy = abs $ y2 - y1
-documentSize _ Document { _width = Just (Num w)
-                        , _height = Just (Num h) } = (floor w, floor h)
-documentSize dpi doc@(Document { _width = Just w
-                               , _height = Just h }) =
-  documentSize dpi $ doc
-    { _width = Just $ toUserUnit dpi w
-    , _height = Just $ toUserUnit dpi h }
-documentSize _ Document { _viewBox = Just (x1, y1, x2, y2) } =
-    (floor . abs $ x2 - x1, floor . abs $ y2 - y1)
-documentSize _ _ = (1, 1)
-
-mayMerge :: Monoid a => Maybe a -> Maybe a -> Maybe a
-mayMerge (Just a) (Just b) = Just $ mappend a b
-mayMerge _ b@(Just _) = b
-mayMerge a Nothing = a
-
-instance Monoid DrawAttributes where
-    mempty = DrawAttributes
-        { _strokeWidth      = Last Nothing
-        , _strokeColor      = Last Nothing
-        , _strokeOpacity    = Nothing
-        , _strokeLineCap    = Last Nothing
-        , _strokeLineJoin   = Last Nothing
-        , _strokeMiterLimit = Last Nothing
-        , _fillColor        = Last Nothing
-        , _groupOpacity     = Nothing
-        , _fillOpacity      = Nothing
-        , _fontSize         = Last Nothing
-        , _fontFamily       = Last Nothing
-        , _fontStyle        = Last Nothing
-        , _transform        = Nothing
-        , _fillRule         = Last Nothing
-        , _attrClass        = mempty
-        , _attrId           = Nothing
-        , _strokeOffset     = Last Nothing
-        , _strokeDashArray  = Last Nothing
-        , _textAnchor       = Last Nothing
-        , _maskRef          = Last Nothing
-        , _clipPathRef      = Last Nothing
-        , _clipRule         = Last Nothing
-
-        , _markerStart      = Last Nothing
-        , _markerMid        = Last Nothing
-        , _markerEnd        = Last Nothing
-        }
-
-    mappend a b = DrawAttributes
-        { _strokeWidth = (mappend `on` _strokeWidth) a b
-        , _strokeColor =  (mappend `on` _strokeColor) a b
-        , _strokeLineCap = (mappend `on` _strokeLineCap) a b
-        , _strokeOpacity = (opacityMappend `on` _strokeOpacity) a b
-        , _strokeLineJoin = (mappend `on` _strokeLineJoin) a b
-        , _strokeMiterLimit = (mappend `on` _strokeMiterLimit) a b
-        , _fillColor =  (mappend `on` _fillColor) a b
-        , _fillOpacity = (opacityMappend `on` _fillOpacity) a b
-        , _fontSize = (mappend `on` _fontSize) a b
-        , _transform = (mayMerge `on` _transform) a b
-        , _fillRule = (mappend `on` _fillRule) a b
-        , _attrClass = _attrClass b
-        , _attrId = _attrId b
-        , _groupOpacity = _groupOpacity b
-        , _strokeOffset = (mappend `on` _strokeOffset) a b
-        , _strokeDashArray = (mappend `on` _strokeDashArray) a b
-        , _fontFamily = (mappend `on` _fontFamily) a b
-        , _fontStyle = (mappend `on` _fontStyle) a b
-        , _textAnchor = (mappend `on` _textAnchor) a b
-        , _maskRef = (mappend `on` _maskRef) a b
-        , _clipPathRef = (mappend `on` _clipPathRef) a b
-        , _clipRule = (mappend `on` _clipRule) a b
-        , _markerStart = (mappend `on` _markerStart) a b
-        , _markerMid = (mappend `on` _markerMid) a b
-        , _markerEnd = (mappend `on` _markerEnd) a b
-        }
-      where
-        opacityMappend Nothing Nothing = Nothing
-        opacityMappend (Just v) Nothing = Just v
-        opacityMappend Nothing (Just v) = Just v
-        opacityMappend (Just v) (Just v2) = Just $ v * v2
-
-instance WithDefaultSvg DrawAttributes where
-  defaultSvg = mempty
-
-instance CssMatcheable Tree where
-  cssAttribOf _ _ = Nothing
-  cssClassOf = view (drawAttr . attrClass)
-  cssIdOf = fmap T.pack . view (drawAttr . attrId)
-  cssNameOf = nameOfTree
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
+-- | This module define all the types used in the definition
+-- of a svg scene.
+--
+-- Most of the types are lensified.
+module Graphics.Svg.Types
+    ( -- * Basic building types
+      Coord
+    , Origin( .. )
+    , Point
+    , RPoint
+    , PathCommand( .. )
+    , Transformation( .. )
+    , ElementRef( .. )
+    , CoordinateUnits( .. )
+
+      -- ** Building helpers
+    , toPoint
+    , serializeNumber
+    , serializeTransformation
+    , serializeTransformations
+
+      -- * Drawing control types
+    , Cap( .. )
+    , LineJoin( .. )
+    , Tree( .. )
+    , Number( .. )
+    , Spread( .. )
+    , Texture( .. )
+    , Element( .. )
+    , FillRule( .. )
+    , FontStyle( .. )
+    , Dpi
+
+    , WithDefaultSvg( .. )
+
+      -- * Main type
+    , Document( .. )
+    , HasDocument( .. )
+    , documentSize
+
+      -- * Drawing attributes
+    , DrawAttributes( .. )
+    , HasDrawAttributes( .. )
+    , WithDrawAttributes( .. )
+
+      -- * SVG drawing primitives
+      -- ** Rectangle
+    , Rectangle( .. )
+    , HasRectangle( .. )
+
+      -- ** Line
+    , Line( .. )
+    , HasLine( .. )
+
+      -- ** Polygon
+    , Polygon( .. )
+    , HasPolygon( .. )
+
+      -- ** Polyline
+    , PolyLine( .. )
+    , HasPolyLine( .. )
+
+      -- ** Path
+    , Path( .. )
+    , HasPath( .. )
+
+      -- ** Circle
+    , Circle( .. )
+    , HasCircle( .. )
+
+      -- ** Ellipse
+    , Ellipse( .. )
+    , HasEllipse( .. )
+
+      -- ** Mesh (gradient mesh)
+    , GradientPathCommand( .. )
+    , MeshGradientType( .. )
+
+    , MeshGradient( .. )
+    , HasMeshGradient( .. )
+
+    , MeshGradientRow( .. )
+    , HasMeshGradientRow( .. )
+
+    , MeshGradientPatch( .. )
+    , HasMeshGradientPatch( .. )
+
+      -- ** Image
+    , Image( .. )
+    , HasImage( .. )
+
+      -- ** Use
+    , Use( .. )
+    , HasUse( .. )
+
+      -- * Grouping primitives
+      -- ** Group
+    , Group( .. )
+    , HasGroup( .. )
+
+      -- ** Symbol
+    , Symbol( .. )
+    , groupOfSymbol
+
+      -- * Text related types
+      -- ** Text
+    , Text( .. )
+    , HasText( .. )
+    , TextAnchor( .. )
+    , textAt
+
+      -- ** Text path
+    , TextPath( .. )
+    , HasTextPath( .. )
+
+    , TextPathSpacing( .. )
+    , TextPathMethod( .. )
+
+      -- ** Text span.
+    , TextSpanContent( .. )
+
+    , TextSpan( .. )
+    , HasTextSpan( .. )
+
+    , TextInfo( .. )
+    , HasTextInfo( .. )
+
+    , TextAdjust( .. )
+
+      -- * Marker definition
+    , Marker( .. )
+    , Overflow( .. )
+    , MarkerOrientation( .. )
+    , MarkerUnit( .. )
+    , HasMarker( .. )
+
+      -- * Gradient definition
+    , GradientStop( .. )
+    , HasGradientStop( .. )
+
+      -- ** Linear Gradient
+    , LinearGradient( .. )
+    , HasLinearGradient( .. )
+
+      -- ** Radial Gradient
+    , RadialGradient( .. )
+    , HasRadialGradient( .. )
+
+      -- * Pattern definition
+    , Pattern( .. )
+    , HasPattern( .. )
+
+      -- * Mask definition
+    , Mask( .. )
+    , HasMask( .. )
+
+      -- * Clip path definition
+    , ClipPath( .. )
+    , HasClipPath( .. )
+
+      -- * Aspect Ratio description
+    , PreserveAspectRatio( .. )
+    , Alignment( .. )
+    , MeetSlice( .. )
+    , HasPreserveAspectRatio( .. )
+
+      -- * MISC functions
+    , isPathArc
+    , isPathWithArc
+    , nameOfTree
+    , zipTree
+    , mapTree
+    , foldTree
+    , toUserUnit
+    , mapNumber
+    ) where
+
+#if !MIN_VERSION_base(4,8,0)
+import Data.Monoid( Monoid( .. ) )
+import Data.Foldable( Foldable )
+#endif
+
+import Data.Function( on )
+import Data.List( inits )
+import qualified Data.Map as M
+import Data.Monoid( Last( .. ), (<>) )
+import qualified Data.Foldable as F
+import qualified Data.Text as T
+import Codec.Picture( PixelRGBA8( .. ) )
+import Control.Lens( Lens'
+                   , Lens
+                   , lens
+                   , view
+                   , (^.)
+                   , (&)
+                   , (.~)
+                   )
+import Graphics.Svg.CssTypes
+import Linear hiding ( angle )
+
+import Text.Printf
+
+-- | Basic coordiante type.
+type Coord = Double
+
+-- | Real Point, fully determined and not
+-- dependant of the rendering context.
+type RPoint = V2 Coord
+
+-- | Possibly context dependant point.
+type Point = (Number, Number)
+
+-- | Tell if a path command is absolute (in the current
+-- user coordiante) or relative to the previous poitn.
+data Origin
+  = OriginAbsolute -- ^ Next point in absolute coordinate
+  | OriginRelative -- ^ Next point relative to the previous
+  deriving (Eq, Show)
+
+data MeshGradientType
+  = GradientBilinear
+  | GradientBicubic
+  deriving (Eq, Show)
+
+-- | Path command definition.
+data PathCommand
+      -- | 'M' or 'm' command
+    = MoveTo !Origin ![RPoint]
+      -- | Line to, 'L' or 'l' Svg path command.
+    | LineTo !Origin ![RPoint]
+
+      -- | Equivalent to the 'H' or 'h' svg path command.
+    | HorizontalTo  !Origin ![Coord]
+      -- | Equivalent to the 'V' or 'v' svg path command.
+    | VerticalTo    !Origin ![Coord]
+
+    -- | Cubic bezier, 'C' or 'c' command
+    | CurveTo  !Origin ![(RPoint, RPoint, RPoint)]
+    -- | Smooth cubic bezier, equivalent to 'S' or 's' command
+    | SmoothCurveTo  !Origin ![(RPoint, RPoint)]
+    -- | Quadratic bezier, 'Q' or 'q' command
+    | QuadraticBezier !Origin ![(RPoint, RPoint)]
+    -- | Quadratic bezier, 'T' or 't' command
+    | SmoothQuadraticBezierCurveTo  !Origin ![RPoint]
+      -- | Eliptical arc, 'A' or 'a' command.
+    | EllipticalArc !Origin ![(Coord, Coord, Coord, Bool, Bool, RPoint)]
+      -- | Close the path, 'Z' or 'z' svg path command.
+    | EndPath
+    deriving (Eq, Show)
+
+-- | Description of path used in meshgradient tag
+data GradientPathCommand
+      -- | Line to, 'L' or 'l' Svg path command.
+    = GLine !Origin !(Maybe RPoint)
+      -- | Cubic bezier, 'C' or 'c' command
+    | GCurve !Origin !RPoint !RPoint !(Maybe RPoint)
+      -- | 'Z' command
+    | GClose
+    deriving (Eq, Show)
+
+-- | Little helper function to build a point.
+toPoint :: Number -> Number -> Point
+toPoint = (,)
+
+-- | Tell if the path command is an EllipticalArc.
+isPathArc :: PathCommand -> Bool
+isPathArc (EllipticalArc _ _) = True
+isPathArc _ = False
+
+-- | Tell if a full path contain an EllipticalArc.
+isPathWithArc :: Foldable f => f PathCommand -> Bool
+isPathWithArc = F.any isPathArc
+
+-- | Define the possible values of various *units attributes
+-- used in the definition of the gradients and masks.
+data CoordinateUnits
+    = CoordUserSpace   -- ^ `userSpaceOnUse` value
+    | CoordBoundingBox -- ^ `objectBoundingBox` value
+    deriving (Eq, Show)
+
+-- | This type represent the align information of the
+-- preserveAspectRatio SVGattribute
+data Alignment
+  = AlignNone -- ^ "none" value
+  | AlignxMinYMin -- "xMinYMin" value
+  | AlignxMidYMin -- ^ "xMidYMin" value
+  | AlignxMaxYMin -- ^ "xMaxYMin" value
+  | AlignxMinYMid -- ^ "xMinYMid" value
+  | AlignxMidYMid -- ^ "xMidYMid" value
+  | AlignxMaxYMid -- ^ "xMaxYMid" value
+  | AlignxMinYMax -- ^ "xMinYMax" value
+  | AlignxMidYMax -- ^ "xMidYMax" value
+  | AlignxMaxYMax -- ^ "xMaxYMax" value
+  deriving (Eq, Show)
+
+-- | This type represent the "meet or slice" information
+-- of the preserveAspectRatio SVGattribute
+data MeetSlice = Meet | Slice
+    deriving (Eq, Show)
+
+-- | Describe the content of the preserveAspectRatio attribute.
+data PreserveAspectRatio = PreserveAspectRatio
+  { _aspectRatioDefer     :: !Bool
+  , _aspectRatioAlign     :: !Alignment
+  , _aspectRatioMeetSlice :: !(Maybe MeetSlice)
+  }
+  deriving (Eq, Show)
+
+instance WithDefaultSvg PreserveAspectRatio where
+  defaultSvg = PreserveAspectRatio 
+    { _aspectRatioDefer     = False
+    , _aspectRatioAlign     = AlignxMidYMid
+    , _aspectRatioMeetSlice = Nothing
+    }
+
+-- | Describe how the line should be terminated
+-- when stroking them. Describe the values of the
+-- `stroke-linecap` attribute.
+-- See `_strokeLineCap`
+data Cap
+  = CapRound -- ^ End with a round (`round` value)
+  | CapButt  -- ^ Define straight just at the end (`butt` value)
+  | CapSquare -- ^ Straight further of the ends (`square` value)
+  deriving (Eq, Show)
+
+-- | Define the possible values of the `stroke-linejoin`
+-- attribute.
+-- see `_strokeLineJoin`
+data LineJoin
+    = JoinMiter -- ^ `miter` value
+    | JoinBevel -- ^ `bevel` value
+    | JoinRound -- ^ `round` value
+    deriving (Eq, Show)
+
+-- | Describe the different value which can be used
+-- in the `fill` or `stroke` attributes.
+data Texture
+  = ColorRef   PixelRGBA8 -- ^ Direct solid color (#rrggbb, #rgb)
+  | TextureRef String     -- ^ Link to a complex texture (url(#name))
+  | FillNone              -- ^ Equivalent to the `none` value.
+  deriving (Eq, Show)
+
+-- | Describe the possile filling algorithms.
+-- Map the values of the `fill-rule` attributes.
+data FillRule
+    = FillEvenOdd -- ^ Correspond to the `evenodd` value.
+    | FillNonZero -- ^ Correspond to the `nonzero` value.
+    deriving (Eq, Show)
+
+-- | Describe the content of the `transformation` attribute.
+-- see `_transform` and `transform`.
+data Transformation
+    = -- | Directly encode the translation matrix.
+      TransformMatrix !Coord !Coord !Coord
+                      !Coord !Coord !Coord
+      -- | Translation along a vector
+    | Translate !Double !Double
+      -- | Scaling on both axis or on X axis and Y axis.
+    | Scale !Double !(Maybe Double)
+      -- | Rotation around `(0, 0)` or around an optional
+      -- point.
+    | Rotate !Double !(Maybe (Double, Double))
+      -- | Skew transformation along the X axis.
+    | SkewX !Double
+      -- | Skew transformation along the Y axis.
+    | SkewY !Double
+      -- | Unkown transformation, like identity.
+    | TransformUnknown
+    deriving (Eq, Show)
+
+-- | Convert the Transformation to a string which can be
+-- directly used in a svg attributes.
+serializeTransformation :: Transformation -> String
+serializeTransformation t = case t of
+  TransformUnknown -> ""
+  TransformMatrix a b c d e f ->
+      printf "matrix(%g, %g, %g, %g, %g, %g)" a b c d e f
+  Translate x y -> printf "translate(%g, %g)" x y
+  Scale x Nothing -> printf "scale(%g)" x
+  Scale x (Just y) -> printf "scale(%g, %g)" x y
+  Rotate angle Nothing -> printf "rotate(%g)" angle
+  Rotate angle (Just (x, y))-> printf "rotate(%g, %g, %g)" angle x y
+  SkewX x -> printf "skewX(%g)" x
+  SkewY y -> printf "skewY(%g)" y
+
+-- | Transform a list of transformations to a string for svg
+-- `transform` attributes.
+serializeTransformations :: [Transformation] -> String
+serializeTransformations =
+    unwords . fmap serializeTransformation
+
+-- | Class helping find the drawing attributes for all
+-- the SVG attributes.
+class WithDrawAttributes a where
+    -- | Lens which can be used to read/write primitives.
+    drawAttr :: Lens' a DrawAttributes
+
+-- | Define an empty 'default' element for the SVG tree.
+-- It is used as base when parsing the element from XML.
+class WithDefaultSvg a where
+    -- | The default element.
+    defaultSvg :: a
+
+-- | Classify the font style, used to search a matching
+-- font in the FontCache.
+data FontStyle
+  = FontStyleNormal
+  | FontStyleItalic
+  | FontStyleOblique
+  deriving (Eq, Show)
+
+-- | Tell where to anchor the text, where the position
+-- given is realative to the text.
+data TextAnchor
+    -- | The text with left aligned, or start at the postion
+    -- If the point is the '*' then the text will be printed
+    -- this way:
+    --
+    -- >  *THE_TEXT_TO_PRINT
+    --
+    -- Equivalent to the `start` value.
+  = TextAnchorStart
+    -- | The text is middle aligned, so the text will be at
+    -- the left and right of the position:
+    --
+    -- >   THE_TEXT*TO_PRINT
+    --
+    -- Equivalent to the `middle` value.
+  | TextAnchorMiddle
+    -- | The text is right aligned.
+    --
+    -- >   THE_TEXT_TO_PRINT*
+    --
+    -- Equivalent to the `end` value.
+  | TextAnchorEnd
+  deriving (Eq, Show)
+
+
+-- | Correspond to the possible values of the
+-- the attributes which are either `none` or
+-- `url(#elem)`
+data ElementRef
+  = RefNone  -- ^ Value for `none`
+  | Ref String -- ^ Equivalent to `url()` attribute.
+  deriving (Eq, Show)
+
+-- | This type define how to draw any primitives,
+-- which color to use, how to stroke the primitives
+-- and the potential transformations to use.
+--
+-- All these attributes are propagated to the children.
+data DrawAttributes = DrawAttributes
+    { -- | Attribute corresponding to the `stroke-width`
+      -- SVG attribute.
+      _strokeWidth      :: !(Last Number)
+      -- | Correspond to the `stroke` attribute.
+    , _strokeColor      :: !(Last Texture)
+      -- | Define the `stroke-opacity` attribute, the transparency
+      -- for the "border".
+    , _strokeOpacity    :: !(Maybe Float)
+      -- | Correspond to the `stroke-linecap` SVG
+      -- attribute
+    , _strokeLineCap    :: !(Last Cap)
+      -- | Correspond to the `stroke-linejoin` SVG
+      -- attribute
+    , _strokeLineJoin   :: !(Last LineJoin)
+      -- | Define the distance of the miter join, correspond
+      -- to the `stroke-miterlimit` attritbue.
+    , _strokeMiterLimit :: !(Last Double)
+      -- | Define the filling color of the elements. Corresponding
+      -- to the `fill` attribute.
+    , _fillColor        :: !(Last Texture)
+      -- | Define the `fill-opacity` attribute, the transparency
+      -- for the "content".
+    , _fillOpacity      :: !(Maybe Float)
+      -- | Define the global or group opacity attribute.
+    , _groupOpacity     :: !(Maybe Float)
+      -- | Content of the `transform` attribute
+    , _transform        :: !(Maybe [Transformation])
+      -- | Define the `fill-rule` used during the rendering.
+    , _fillRule         :: !(Last FillRule)
+      -- | Define the `mask` attribute.
+    , _maskRef          :: !(Last ElementRef)
+      -- | Define the `clip-path` attribute.
+    , _clipPathRef      :: !(Last ElementRef)
+      -- | Define the `clip-rule` attribute.
+    , _clipRule         :: !(Last FillRule)
+      -- | Map to the `class` attribute. Used for the CSS
+      -- rewriting.
+    , _attrClass        :: ![T.Text]
+      -- | Map to the `id` attribute. Used for the CSS
+      -- rewriting.
+    , _attrId           :: !(Maybe String)
+      -- | Define the start distance of the dashing pattern.
+      -- Correspond to the `stroke-dashoffset` attribute.
+    , _strokeOffset     :: !(Last Number)
+      -- | Define the dashing pattern for the lines. Correspond
+      -- to the `stroke-dasharray` attribute.
+    , _strokeDashArray  :: !(Last [Number])
+      -- | Current size of the text, correspond to the
+      -- `font-size` SVG attribute.
+    , _fontSize         :: !(Last Number)
+      -- | Define the possible fonts to be used for text rendering.
+      -- Map to the `font-family` attribute.
+    , _fontFamily       :: !(Last [String])
+      -- | Map to the `font-style` attribute.
+    , _fontStyle        :: !(Last FontStyle)
+      -- | Define how to interpret the text position, correspond
+      -- to the `text-anchor` attribute.
+    , _textAnchor       :: !(Last TextAnchor)
+      -- | Define the marker used for the start of the line.
+      -- Correspond to the `marker-start` attribute.
+    , _markerStart      :: !(Last ElementRef)
+      -- | Define the marker used for every point of the
+      -- polyline/path Correspond to the `marker-mid`
+      -- attribute.
+    , _markerMid        :: !(Last ElementRef)
+      -- | Define the marker used for the end of the line.
+      -- Correspond to the `marker-end` attribute.
+    , _markerEnd        :: !(Last ElementRef)
+    }
+    deriving (Eq, Show)
+
+
+-- | This primitive describe an unclosed suite of
+-- segments. Correspond to the `<polyline>` tag.
+data PolyLine = PolyLine
+  { -- | drawing attributes of the polyline.
+    _polyLineDrawAttributes :: !DrawAttributes
+
+    -- | Geometry definition of the polyline.
+    -- correspond to the `points` attribute
+  , _polyLinePoints :: ![RPoint]
+  }
+  deriving (Eq, Show)
+
+
+instance WithDefaultSvg PolyLine where
+  defaultSvg = PolyLine
+    { _polyLineDrawAttributes = mempty
+    , _polyLinePoints = []
+    }
+
+-- makeClassy ''PolyLine
+-- | Lenses for the PolyLine type.
+class HasPolyLine a where
+  polyLine :: Lens' a PolyLine
+  polyLineDrawAttributes :: Lens' a DrawAttributes
+  {-# INLINE polyLineDrawAttributes #-}
+  polyLineDrawAttributes = polyLine . polyLineDrawAttributes
+
+  polyLinePoints :: Lens' a [RPoint]
+  {-# INLINE polyLinePoints #-}
+  polyLinePoints = polyLine . polyLinePoints
+
+instance HasPolyLine PolyLine where
+  polyLine = id
+  {-# INLINE polyLineDrawAttributes #-}
+  polyLineDrawAttributes f p =
+    fmap (\y -> p { _polyLineDrawAttributes = y }) (f $ _polyLineDrawAttributes p)
+  {-# INLINE polyLinePoints #-}
+  polyLinePoints f p =
+    fmap (\y -> p { _polyLinePoints = y }) (f $ _polyLinePoints p)
+
+instance WithDrawAttributes PolyLine where
+    drawAttr = polyLineDrawAttributes
+
+-- | Primitive decriving polygon composed
+-- of segements. Correspond to the `<polygon>`
+-- tag
+data Polygon = Polygon
+  { -- | Drawing attributes for the polygon.
+    _polygonDrawAttributes :: !DrawAttributes
+    -- | Points of the polygon. Correspond to
+    -- the `points` attributes.
+  , _polygonPoints :: ![RPoint]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Polygon
+-- | Lenses for the Polygon type
+class HasPolygon a where
+  polygon :: Lens' a Polygon
+  polygonDrawAttributes :: Lens' a DrawAttributes
+  {-# INLINE polygonDrawAttributes #-}
+  polygonPoints :: Lens' a [RPoint]
+  {-# INLINE polygonPoints #-}
+  polygonDrawAttributes = polygon . polygonDrawAttributes
+  polygonPoints = polygon . polygonPoints
+
+instance HasPolygon Polygon where
+  polygon = id
+  {-# INLINE polygonDrawAttributes #-}
+  polygonDrawAttributes f p =
+    fmap (\y -> p { _polygonDrawAttributes = y }) (f $ _polygonDrawAttributes p)
+  {-# INLINE polygonPoints #-}
+  polygonPoints f p =
+    fmap (\y -> p { _polygonPoints = y }) (f $ _polygonPoints p)
+
+instance WithDrawAttributes Polygon where
+    drawAttr = polygonDrawAttributes
+
+instance WithDefaultSvg Polygon where
+  defaultSvg = Polygon
+    { _polygonDrawAttributes = mempty
+    , _polygonPoints = []
+    }
+
+-- | Define a simple line. Correspond to the
+-- `<line>` tag.
+data Line = Line
+  { -- | Drawing attributes of line.
+    _lineDrawAttributes :: !DrawAttributes
+    -- | First point of the the line, correspond
+    -- to the `x1` and `y1` attributes.
+  , _linePoint1 :: !Point
+    -- | Second point of the the line, correspond
+    -- to the `x2` and `y2` attributes.
+  , _linePoint2 :: !Point
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Line
+-- | Lenses for the Line type.
+class HasLine a where
+  line :: Lens' a Line
+  lineDrawAttributes :: Lens' a DrawAttributes
+  lineDrawAttributes = line . lineDrawAttributes
+  {-# INLINE lineDrawAttributes #-}
+  linePoint1 :: Lens' a Point
+  linePoint1 = line . linePoint1
+  {-# INLINE linePoint1 #-}
+  linePoint2 :: Lens' a Point
+  linePoint2 = line . linePoint2
+  {-# INLINE linePoint2 #-}
+
+instance HasLine Line where
+  line = id
+  {-# INLINE lineDrawAttributes #-}
+  lineDrawAttributes f l =
+      fmap (\y -> l { _lineDrawAttributes = y }) (f (_lineDrawAttributes l))
+  {-# INLINE linePoint1 #-}
+  linePoint1 f l =
+      fmap (\y -> l { _linePoint1 = y }) (f (_linePoint1 l))
+  {-# INLINE linePoint2 #-}
+  linePoint2 f l =
+      fmap (\y -> l { _linePoint2 = y }) (f (_linePoint2 l))
+
+instance WithDrawAttributes Line where
+    drawAttr = lineDrawAttributes
+
+instance WithDefaultSvg Line where
+  defaultSvg = Line
+    { _lineDrawAttributes = mempty
+    , _linePoint1 = zeroPoint
+    , _linePoint2 = zeroPoint
+    }
+    where zeroPoint = (Num 0, Num 0)
+
+-- | Define a rectangle. Correspond to
+-- `<rectangle>` svg tag.
+data Rectangle = Rectangle
+  { -- | Rectangle drawing attributes.
+    _rectDrawAttributes  :: !DrawAttributes
+    -- | Upper left corner of the rectangle, correspond
+    -- to the attributes `x` and `y`.
+  , _rectUpperLeftCorner :: !Point
+    -- | Rectangle width, correspond, strangely, to
+    -- the `width` attribute.
+  , _rectWidth           :: !Number
+    -- | Rectangle height, correspond, amazingly, to
+    -- the `height` attribute.
+  , _rectHeight          :: !Number
+    -- | Define the rounded corner radius radius
+    -- of the rectangle. Correspond to the `rx` and
+    -- `ry` attributes.
+  , _rectCornerRadius    :: !(Number, Number)
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Rectangle
+-- | Lenses for the Rectangle type.
+class HasRectangle a where
+  rectangle :: Lens' a Rectangle
+  rectCornerRadius :: Lens' a (Number, Number)
+  {-# INLINE rectCornerRadius #-}
+  rectCornerRadius = rectangle . rectCornerRadius
+
+  rectDrawAttributes :: Lens' a DrawAttributes
+  {-# INLINE rectDrawAttributes #-}
+  rectDrawAttributes = rectangle . rectDrawAttributes
+
+  rectHeight :: Lens' a Number
+  {-# INLINE rectHeight #-}
+  rectHeight = rectangle . rectHeight
+
+  rectUpperLeftCorner :: Lens' a Point
+  {-# INLINE rectUpperLeftCorner #-}
+  rectUpperLeftCorner = rectangle . rectUpperLeftCorner
+
+  rectWidth :: Lens' a Number
+  {-# INLINE rectWidth #-}
+  rectWidth = rectangle . rectWidth
+
+instance HasRectangle Rectangle where
+  rectangle = id
+  {-# INLINE rectCornerRadius #-}
+  rectCornerRadius f attr =
+    fmap (\y -> attr { _rectCornerRadius = y }) (f $ _rectCornerRadius attr)
+  {-# INLINE rectDrawAttributes #-}
+  rectDrawAttributes f attr =
+    fmap (\y -> attr { _rectDrawAttributes = y }) (f $ _rectDrawAttributes attr)
+  {-# INLINE rectHeight #-}
+  rectHeight f attr =
+    fmap (\y -> attr { _rectHeight = y }) (f $ _rectHeight attr)
+  {-# INLINE rectUpperLeftCorner #-}
+  rectUpperLeftCorner f attr =
+    fmap (\y -> attr { _rectUpperLeftCorner = y }) (f $ _rectUpperLeftCorner attr)
+  {-# INLINE rectWidth #-}
+  rectWidth f attr =
+    fmap (\y -> attr { _rectWidth = y }) (f $ _rectWidth attr)
+
+instance WithDrawAttributes Rectangle where
+    drawAttr = rectDrawAttributes
+
+instance WithDefaultSvg Rectangle where
+  defaultSvg = Rectangle
+    { _rectDrawAttributes  = mempty
+    , _rectUpperLeftCorner = (Num 0, Num 0)
+    , _rectWidth           = Num 0
+    , _rectHeight          = Num 0
+    , _rectCornerRadius    = (Num 0, Num 0)
+    }
+
+-- | Type mapping the `<path>` svg tag.
+data Path = Path
+  { -- | Drawing attributes of the path.
+    _pathDrawAttributes :: !DrawAttributes
+    -- | Definition of the path, correspond to the
+    -- `d` attributes.
+  , _pathDefinition :: ![PathCommand]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Path
+-- | Lenses for the Path type
+class HasPath c_alhy where
+  path :: Lens' c_alhy Path
+  pathDefinition :: Lens' c_alhy [PathCommand]
+  {-# INLINE pathDefinition #-}
+  pathDefinition = path . pathDefinition
+
+  pathDrawAttributes :: Lens' c_alhy DrawAttributes
+  {-# INLINE pathDrawAttributes #-}
+  pathDrawAttributes = path . pathDrawAttributes
+
+instance HasPath Path where
+  path = id
+  {-# INLINE pathDefinition #-}
+  pathDefinition f attr =
+    fmap (\y -> attr { _pathDefinition = y }) (f $ _pathDefinition attr)
+  {-# INLINE pathDrawAttributes #-}
+  pathDrawAttributes f attr =
+    fmap (\y -> attr { _pathDrawAttributes = y }) (f $ _pathDrawAttributes attr)
+
+instance WithDrawAttributes Path where
+  drawAttr = pathDrawAttributes
+
+instance WithDefaultSvg Path where
+  defaultSvg = Path
+    { _pathDrawAttributes = mempty
+    , _pathDefinition = []
+    }
+
+-- | Define a SVG group, corresponding `<g>` tag.
+data Group a = Group
+  { -- | Group drawing attributes, propagated to all of its
+    -- children.
+    _groupDrawAttributes :: !DrawAttributes
+    -- | Content of the group, corresponding to all the tags
+    -- inside the `<g>` tag.
+  , _groupChildren  :: ![a]
+    -- | Mapped to the attribute `viewBox`
+  , _groupViewBox   :: !(Maybe (Double, Double, Double, Double))
+    -- | used for symbols only
+  , _groupAspectRatio :: !PreserveAspectRatio
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Group
+-- | Lenses associated to the Group type.
+class HasGroup g a | g -> a where
+  group :: Lens' g (Group a)
+  groupAspectRatio :: Lens' g PreserveAspectRatio
+  {-# INLINE groupAspectRatio #-}
+  groupAspectRatio = group . groupAspectRatio
+
+  groupChildren :: Lens' g [a]
+  {-# INLINE groupChildren #-}
+  groupChildren = group . groupChildren
+
+  groupDrawAttributes :: Lens' g DrawAttributes
+  {-# INLINE groupDrawAttributes #-}
+  groupDrawAttributes = group . groupDrawAttributes
+
+  groupViewBox :: Lens' g (Maybe (Double, Double, Double, Double))
+  {-# INLINE groupViewBox #-}
+  groupViewBox = group . groupViewBox
+
+instance HasGroup (Group a) a where
+  group = id
+  {-# INLINE groupAspectRatio #-}
+  groupAspectRatio f attr =
+    fmap (\y -> attr { _groupAspectRatio = y }) (f $ _groupAspectRatio attr)
+
+  {-# INLINE groupChildren #-}
+  groupChildren f attr =
+    fmap (\y -> attr { _groupChildren = y }) (f $ _groupChildren attr)
+
+  {-# INLINE groupDrawAttributes #-}
+  groupDrawAttributes f attr =
+    fmap (\y -> attr { _groupDrawAttributes = y }) (f $ _groupDrawAttributes attr)
+
+  {-# INLINE groupViewBox #-}
+  groupViewBox f attr =
+    fmap (\y -> attr { _groupViewBox = y }) (f $ _groupViewBox attr)
+
+instance WithDrawAttributes (Group a) where
+    drawAttr = groupDrawAttributes
+
+instance WithDefaultSvg (Group a) where
+  defaultSvg = Group
+    { _groupDrawAttributes = mempty
+    , _groupChildren  = []
+    , _groupViewBox = Nothing
+    , _groupAspectRatio = defaultSvg
+    }
+
+-- | Define the `<symbol>` tag, equivalent to
+-- a named group.
+newtype Symbol a =
+    Symbol { _groupOfSymbol :: Group a }
+  deriving (Eq, Show)
+
+-- makeLenses ''Symbol
+-- | Lenses associated with the Symbol type.
+groupOfSymbol :: Lens (Symbol s) (Symbol t) (Group s) (Group t)
+{-# INLINE groupOfSymbol #-}
+groupOfSymbol f = fmap Symbol . f . _groupOfSymbol
+
+instance WithDrawAttributes (Symbol a) where
+  drawAttr = groupOfSymbol . drawAttr
+
+instance WithDefaultSvg (Symbol a) where
+  defaultSvg = Symbol defaultSvg
+
+-- | Define a `<circle>`.
+data Circle = Circle
+  { -- | Drawing attributes of the circle.
+    _circleDrawAttributes :: !DrawAttributes
+    -- | Define the center of the circle, describe
+    -- the `cx` and `cy` attributes.
+  , _circleCenter   :: !Point
+    -- | Radius of the circle, equivalent to the `r`
+    -- attribute.
+  , _circleRadius   :: !Number
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Circle
+-- | Lenses for the Circle type.
+class HasCircle a where
+  circle :: Lens' a Circle
+  circleCenter :: Lens' a Point
+  {-# INLINE circleCenter #-}
+  circleCenter = circle . circleCenter
+
+  circleDrawAttributes :: Lens' a DrawAttributes
+  {-# INLINE circleDrawAttributes #-}
+  circleDrawAttributes = circle . circleDrawAttributes
+
+  circleRadius :: Lens' a Number
+  {-# INLINE circleRadius #-}
+  circleRadius = circle . circleRadius
+
+instance HasCircle Circle where
+  circle = id
+  {-# INLINE circleCenter #-}
+  circleCenter f attr =
+    fmap (\y -> attr { _circleCenter = y }) (f $ _circleCenter attr)
+  {-# INLINE circleDrawAttributes #-}
+  circleDrawAttributes f attr =
+    fmap (\y -> attr { _circleDrawAttributes = y }) (f $ _circleDrawAttributes attr)
+  {-# INLINE circleRadius #-}
+  circleRadius f attr =
+    fmap (\y -> attr { _circleRadius = y }) (f $ _circleRadius attr)
+
+instance WithDrawAttributes Circle where
+    drawAttr = circleDrawAttributes
+
+instance WithDefaultSvg Circle where
+  defaultSvg = Circle
+    { _circleDrawAttributes = mempty
+    , _circleCenter = (Num 0, Num 0)
+    , _circleRadius = Num 0
+    }
+
+-- | Define an `<ellipse>`
+data Ellipse = Ellipse
+  {  -- | Drawing attributes of the ellipse.
+    _ellipseDrawAttributes :: !DrawAttributes
+    -- | Center of the ellipse, map to the `cx`
+    -- and `cy` attributes.
+  , _ellipseCenter :: !Point
+    -- | Radius along the X axis, map the
+    -- `rx` attribute.
+  , _ellipseXRadius :: !Number
+    -- | Radius along the Y axis, map the
+    -- `ry` attribute.
+  , _ellipseYRadius :: !Number
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Ellipse
+-- | Lenses for the ellipse type.
+class HasEllipse c_amWt where
+  ellipse :: Lens' c_amWt Ellipse
+  ellipseCenter :: Lens' c_amWt Point
+  {-# INLINE ellipseCenter #-}
+  ellipseDrawAttributes :: Lens' c_amWt DrawAttributes
+  {-# INLINE ellipseDrawAttributes #-}
+  ellipseXRadius :: Lens' c_amWt Number
+  {-# INLINE ellipseXRadius #-}
+  ellipseYRadius :: Lens' c_amWt Number
+  {-# INLINE ellipseYRadius #-}
+  ellipseCenter = ((.) ellipse) ellipseCenter
+  ellipseDrawAttributes = ((.) ellipse) ellipseDrawAttributes
+  ellipseXRadius = ((.) ellipse) ellipseXRadius
+  ellipseYRadius = ((.) ellipse) ellipseYRadius
+
+instance HasEllipse Ellipse where
+  {-# INLINE ellipseCenter #-}
+  {-# INLINE ellipseDrawAttributes #-}
+  {-# INLINE ellipseXRadius #-}
+  {-# INLINE ellipseYRadius #-}
+  ellipse = id
+  ellipseCenter f attr =
+    fmap (\y -> attr { _ellipseCenter = y }) (f $ _ellipseCenter attr)
+  ellipseDrawAttributes f attr =
+    fmap (\y -> attr { _ellipseDrawAttributes = y }) (f $ _ellipseDrawAttributes attr)
+  ellipseXRadius f attr =
+    fmap (\y -> attr { _ellipseXRadius = y }) (f $ _ellipseXRadius attr)
+  ellipseYRadius f attr =
+    fmap (\y -> attr { _ellipseYRadius = y }) (f $ _ellipseYRadius attr)
+
+instance WithDrawAttributes Ellipse where
+  drawAttr = ellipseDrawAttributes
+
+instance WithDefaultSvg Ellipse where
+  defaultSvg = Ellipse
+    { _ellipseDrawAttributes = mempty
+    , _ellipseCenter = (Num 0, Num 0)
+    , _ellipseXRadius = Num 0
+    , _ellipseYRadius = Num 0
+    }
+
+-- | Define a color stop for the gradients. Represent
+-- the `<stop>` SVG tag.
+data GradientStop = GradientStop
+    { -- | Gradient offset between 0 and 1, correspond
+      -- to the `offset` attribute.
+      _gradientOffset :: !Float
+      -- | Color of the gradient stop. Correspond
+      -- to the `stop-color` attribute.
+    , _gradientColor  :: !PixelRGBA8
+      -- | Path command used in mesh patch
+    , _gradientPath   :: !(Maybe GradientPathCommand)
+      -- | Stop color opacity
+    , _gradientOpacity :: !(Maybe Float)
+    }
+    deriving (Eq, Show)
+
+-- makeClassy ''GradientStop
+-- | Lenses for the GradientStop type.
+class HasGradientStop c_anhM where
+  gradientStop :: Lens' c_anhM GradientStop
+  gradientColor :: Lens' c_anhM PixelRGBA8
+  {-# INLINE gradientColor #-}
+  gradientOffset :: Lens' c_anhM Float
+  {-# INLINE gradientOffset #-}
+  gradientOpacity :: Lens' c_anhM (Maybe Float)
+  {-# INLINE gradientOpacity #-}
+  gradientPath :: Lens' c_anhM (Maybe GradientPathCommand)
+  {-# INLINE gradientPath #-}
+  gradientColor = ((.) gradientStop) gradientColor
+  gradientOffset = ((.) gradientStop) gradientOffset
+  gradientOpacity = ((.) gradientStop) gradientOpacity
+  gradientPath = ((.) gradientStop) gradientPath
+
+instance HasGradientStop GradientStop where
+  {-# INLINE gradientColor #-}
+  {-# INLINE gradientOffset #-}
+  {-# INLINE gradientOpacity #-}
+  {-# INLINE gradientPath #-}
+  gradientStop = id
+  gradientColor f attr =
+    fmap (\y -> attr { _gradientColor = y }) (f $ _gradientColor attr)
+  gradientOffset f attr =
+    fmap (\y -> attr { _gradientOffset = y }) (f $ _gradientOffset attr)
+  gradientOpacity f attr =
+    fmap (\y -> attr { _gradientOpacity = y }) (f $ _gradientOpacity attr)
+  gradientPath f attr =
+    fmap (\y -> attr { _gradientPath = y }) (f $ _gradientPath attr)
+
+instance WithDefaultSvg GradientStop where
+  defaultSvg = GradientStop
+    { _gradientOffset = 0.0
+    , _gradientColor  = PixelRGBA8 0 0 0 255
+    , _gradientPath   = Nothing
+    , _gradientOpacity = Nothing
+    }
+
+
+-- | Define `<meshpatch>` SVG tag
+data MeshGradientPatch = MeshGradientPatch
+  { -- | List of stop, from 2 to 4 in a patch
+    _meshGradientPatchStops :: ![GradientStop]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''MeshGradientPatch
+class HasMeshGradientPatch c_annx where
+  meshGradientPatch :: Lens' c_annx MeshGradientPatch
+  meshGradientPatchStops :: Lens' c_annx [GradientStop]
+  {-# INLINE meshGradientPatchStops #-}
+  meshGradientPatchStops =  meshGradientPatch . meshGradientPatchStops
+
+instance HasMeshGradientPatch MeshGradientPatch where
+  {-# INLINE meshGradientPatchStops #-}
+  meshGradientPatch = id
+  meshGradientPatchStops f m =
+    fmap (\y -> m { _meshGradientPatchStops = y }) . f $ _meshGradientPatchStops m
+
+instance WithDefaultSvg MeshGradientPatch where
+  defaultSvg = MeshGradientPatch []
+
+-- | Define a `<meshrow>` tag.
+data MeshGradientRow = MeshGradientRow
+  { -- | List of patch in a row
+    _meshGradientRowPatches :: ![MeshGradientPatch]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''MeshGradientRow
+class HasMeshGradientRow c_antr where
+  meshGradientRow :: Lens' c_antr MeshGradientRow
+  meshGradientRowPatches :: Lens' c_antr [MeshGradientPatch]
+  {-# INLINE meshGradientRowPatches #-}
+  meshGradientRowPatches = meshGradientRow . meshGradientRowPatches
+
+instance HasMeshGradientRow MeshGradientRow where
+  {-# INLINE meshGradientRowPatches #-}
+  meshGradientRow = id
+  meshGradientRowPatches f m =
+      fmap (\y -> m { _meshGradientRowPatches = y }) . f $ _meshGradientRowPatches m
+
+instance WithDefaultSvg MeshGradientRow where
+  defaultSvg = MeshGradientRow []
+
+
+-- | Define a `<meshgradient>` tag.
+data MeshGradient = MeshGradient
+  { _meshGradientDrawAttributes :: !DrawAttributes
+    -- | Original x coordinate of the mesh gradient
+  , _meshGradientX              :: !Number
+    -- | Original y coordinate of the mesh gradient
+  , _meshGradientY              :: !Number
+    -- | Type of color interpolation to use
+  , _meshGradientType           :: !MeshGradientType
+    -- | Coordiante system to use
+  , _meshGradientUnits          :: !CoordinateUnits
+    -- | Optional transform
+  , _meshGradientTransform      :: ![Transformation]
+    -- | List of patch rows in the the mesh.
+  , _meshGradientRows           :: ![MeshGradientRow]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''MeshGradient
+class HasMeshGradient c_anxG where
+  meshGradient :: Lens' c_anxG MeshGradient
+  meshGradientDrawAttributes :: Lens' c_anxG DrawAttributes
+  {-# INLINE meshGradientDrawAttributes #-}
+  meshGradientRows :: Lens' c_anxG [MeshGradientRow]
+  {-# INLINE meshGradientRows #-}
+  meshGradientTransform :: Lens' c_anxG [Transformation]
+  {-# INLINE meshGradientTransform #-}
+  meshGradientType :: Lens' c_anxG MeshGradientType
+  {-# INLINE meshGradientType #-}
+  meshGradientUnits :: Lens' c_anxG CoordinateUnits
+  {-# INLINE meshGradientUnits #-}
+  meshGradientX :: Lens' c_anxG Number
+  {-# INLINE meshGradientX #-}
+  meshGradientY :: Lens' c_anxG Number
+  {-# INLINE meshGradientY #-}
+  meshGradientDrawAttributes
+    = ((.) meshGradient) meshGradientDrawAttributes
+  meshGradientRows = ((.) meshGradient) meshGradientRows
+  meshGradientTransform = ((.) meshGradient) meshGradientTransform
+  meshGradientType = ((.) meshGradient) meshGradientType
+  meshGradientUnits = ((.) meshGradient) meshGradientUnits
+  meshGradientX = ((.) meshGradient) meshGradientX
+  meshGradientY = ((.) meshGradient) meshGradientY
+instance HasMeshGradient MeshGradient where
+  {-# INLINE meshGradientDrawAttributes #-}
+  {-# INLINE meshGradientRows #-}
+  {-# INLINE meshGradientTransform #-}
+  {-# INLINE meshGradientType #-}
+  {-# INLINE meshGradientUnits #-}
+  {-# INLINE meshGradientX #-}
+  {-# INLINE meshGradientY #-}
+  meshGradient = id
+  meshGradientDrawAttributes f attr =
+    fmap (\y -> attr { _meshGradientDrawAttributes = y }) (f $ _meshGradientDrawAttributes attr)
+  meshGradientRows f attr =
+    fmap (\y -> attr { _meshGradientRows = y }) (f $ _meshGradientRows attr)
+  meshGradientTransform f attr =
+    fmap (\y -> attr { _meshGradientTransform = y }) (f $ _meshGradientTransform attr)
+  meshGradientType f attr =
+    fmap (\y -> attr { _meshGradientType = y }) (f $ _meshGradientType attr)
+  meshGradientUnits f attr =
+    fmap (\y -> attr { _meshGradientUnits = y }) (f $ _meshGradientUnits attr)
+  meshGradientX f attr =
+    fmap (\y -> attr { _meshGradientX = y }) (f $ _meshGradientX attr)
+  meshGradientY f attr =
+    fmap (\y -> attr { _meshGradientY = y }) (f $ _meshGradientY attr)
+
+instance WithDrawAttributes MeshGradient where
+  drawAttr = meshGradientDrawAttributes
+
+instance WithDefaultSvg MeshGradient where
+  defaultSvg = MeshGradient
+    { _meshGradientDrawAttributes = mempty
+    , _meshGradientX              = Percent 0
+    , _meshGradientY              = Percent 0
+    , _meshGradientType           = GradientBilinear
+    , _meshGradientUnits          = CoordBoundingBox
+    , _meshGradientTransform      = mempty
+    , _meshGradientRows           = mempty
+    }
+
+
+-- | Define an `<image>` tag.
+data Image = Image
+  { -- | Drawing attributes of the image
+    _imageDrawAttributes :: !DrawAttributes
+    -- | Position of the image referenced by its
+    -- upper left corner.
+  , _imageCornerUpperLeft :: !Point
+    -- | Image width
+  , _imageWidth :: !Number
+    -- | Image Height
+  , _imageHeight :: !Number
+    -- | Image href, pointing to the real image.
+  , _imageHref :: !String
+    -- | preserveAspectRatio attribute
+  , _imageAspectRatio :: !PreserveAspectRatio
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Image
+-- | Lenses for the Image type.
+class HasImage c_anI7 where
+  image :: Lens' c_anI7 Image
+  imageAspectRatio :: Lens' c_anI7 PreserveAspectRatio
+  {-# INLINE imageAspectRatio #-}
+  imageCornerUpperLeft :: Lens' c_anI7 Point
+  {-# INLINE imageCornerUpperLeft #-}
+  imageDrawAttributes :: Lens' c_anI7 DrawAttributes
+  {-# INLINE imageDrawAttributes #-}
+  imageHeight :: Lens' c_anI7 Number
+  {-# INLINE imageHeight #-}
+  imageHref :: Lens' c_anI7 String
+  {-# INLINE imageHref #-}
+  imageWidth :: Lens' c_anI7 Number
+  {-# INLINE imageWidth #-}
+  imageAspectRatio = ((.) image) imageAspectRatio
+  imageCornerUpperLeft = ((.) image) imageCornerUpperLeft
+  imageDrawAttributes = ((.) image) imageDrawAttributes
+  imageHeight = ((.) image) imageHeight
+  imageHref = ((.) image) imageHref
+  imageWidth = ((.) image) imageWidth
+instance HasImage Image where
+  {-# INLINE imageAspectRatio #-}
+  {-# INLINE imageCornerUpperLeft #-}
+  {-# INLINE imageDrawAttributes #-}
+  {-# INLINE imageHeight #-}
+  {-# INLINE imageHref #-}
+  {-# INLINE imageWidth #-}
+  image = id
+  imageAspectRatio f attr =
+    fmap (\y -> attr { _imageAspectRatio = y }) (f $ _imageAspectRatio attr)
+  imageCornerUpperLeft f attr =
+    fmap (\y -> attr { _imageCornerUpperLeft = y }) (f $ _imageCornerUpperLeft attr)
+  imageDrawAttributes f attr =
+    fmap (\y -> attr { _imageDrawAttributes = y }) (f $ _imageDrawAttributes attr)
+  imageHeight f attr =
+    fmap (\y -> attr { _imageHeight = y }) (f $ _imageHeight attr)
+  imageHref f attr =
+    fmap (\y -> attr { _imageHref = y }) (f $ _imageHref attr)
+  imageWidth f attr =
+    fmap (\y -> attr { _imageWidth = y }) (f $ _imageWidth attr)
+
+instance WithDrawAttributes Image where
+  drawAttr = imageDrawAttributes
+
+instance WithDefaultSvg Image where
+  defaultSvg = Image
+    { _imageDrawAttributes = mempty
+    , _imageCornerUpperLeft = (Num 0, Num 0)
+    , _imageWidth = Num 0
+    , _imageHeight = Num 0
+    , _imageHref = ""
+    , _imageAspectRatio = defaultSvg
+    }
+
+-- | Define an `<use>` for a named content.
+-- Every named content can be reused in the
+-- document using this element.
+data Use = Use
+  { -- | Position where to draw the "used" element.
+    -- Correspond to the `x` and `y` attributes.
+    _useBase   :: Point
+    -- | Referenced name, correspond to `xlink:href`
+    -- attribute.
+  , _useName   :: String
+    -- | Define the width of the region where
+    -- to place the element. Map to the `width`
+    -- attribute.
+  , _useWidth  :: Maybe Number
+    -- | Define the height of the region where
+    -- to place the element. Map to the `height`
+    -- attribute.
+  , _useHeight :: Maybe Number
+    -- | Use draw attributes.
+  , _useDrawAttributes :: DrawAttributes
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Use
+-- | Lenses for the Use type.
+class HasUse c_anR3 where
+  use :: Lens' c_anR3 Use
+  useBase :: Lens' c_anR3 Point
+  {-# INLINE useBase #-}
+  useDrawAttributes :: Lens' c_anR3 DrawAttributes
+  {-# INLINE useDrawAttributes #-}
+  useHeight :: Lens' c_anR3 (Maybe Number)
+  {-# INLINE useHeight #-}
+  useName :: Lens' c_anR3 String
+  {-# INLINE useName #-}
+  useWidth :: Lens' c_anR3 (Maybe Number)
+  {-# INLINE useWidth #-}
+  useBase = ((.) use) useBase
+  useDrawAttributes = ((.) use) useDrawAttributes
+  useHeight = ((.) use) useHeight
+  useName = ((.) use) useName
+  useWidth = ((.) use) useWidth
+instance HasUse Use where
+  {-# INLINE useBase #-}
+  {-# INLINE useDrawAttributes #-}
+  {-# INLINE useHeight #-}
+  {-# INLINE useName #-}
+  {-# INLINE useWidth #-}
+  use = id
+  useBase f attr =
+    fmap (\y -> attr { _useBase = y }) (f $ _useBase attr)
+  useDrawAttributes f attr =
+    fmap (\y -> attr { _useDrawAttributes = y }) (f $ _useDrawAttributes attr)
+  useHeight f attr =
+    fmap (\y -> attr { _useHeight = y }) (f $ _useHeight attr)
+  useName f attr =
+    fmap (\y -> attr { _useName = y }) (f $ _useName attr)
+  useWidth f attr =
+    fmap (\y -> attr { _useWidth = y }) (f $ _useWidth attr)
+
+instance WithDrawAttributes Use where
+  drawAttr = useDrawAttributes
+
+instance WithDefaultSvg Use where
+  defaultSvg = Use
+    { _useBase   = (Num 0, Num 0)
+    , _useName   = ""
+    , _useWidth  = Nothing
+    , _useHeight = Nothing
+    , _useDrawAttributes = mempty
+    }
+
+-- | Define position information associated to
+-- `<text>` or `<tspan>` svg tag.
+data TextInfo = TextInfo
+  { _textInfoX      :: ![Number] -- ^ `x` attribute.
+  , _textInfoY      :: ![Number] -- ^ `y` attribute.
+  , _textInfoDX     :: ![Number] -- ^ `dx` attribute.
+  , _textInfoDY     :: ![Number] -- ^ `dy` attribute.
+  , _textInfoRotate :: ![Double] -- ^ `rotate` attribute.
+  , _textInfoLength :: !(Maybe Number) -- ^ `textLength` attribute.
+  }
+  deriving (Eq, Show)
+
+instance Monoid TextInfo where
+  mempty = TextInfo [] [] [] [] [] Nothing
+  mappend (TextInfo x1 y1 dx1 dy1 r1 l1)
+          (TextInfo x2 y2 dx2 dy2 r2 l2) =
+    TextInfo (x1 <> x2)   (y1 <> y2)
+                (dx1 <> dx2) (dy1 <> dy2)
+                (r1 <> r2)
+                (getLast $ Last l1 <> Last l2)
+
+-- makeClassy ''TextInfo
+-- | Lenses for the TextInfo type.
+class HasTextInfo c_ao0m where
+  textInfo :: Lens' c_ao0m TextInfo
+  textInfoDX :: Lens' c_ao0m [Number]
+  {-# INLINE textInfoDX #-}
+  textInfoDY :: Lens' c_ao0m [Number]
+  {-# INLINE textInfoDY #-}
+  textInfoLength :: Lens' c_ao0m (Maybe Number)
+  {-# INLINE textInfoLength #-}
+  textInfoRotate :: Lens' c_ao0m [Double]
+  {-# INLINE textInfoRotate #-}
+  textInfoX :: Lens' c_ao0m [Number]
+  {-# INLINE textInfoX #-}
+  textInfoY :: Lens' c_ao0m [Number]
+  {-# INLINE textInfoY #-}
+  textInfoDX = ((.) textInfo) textInfoDX
+  textInfoDY = ((.) textInfo) textInfoDY
+  textInfoLength = ((.) textInfo) textInfoLength
+  textInfoRotate = ((.) textInfo) textInfoRotate
+  textInfoX = ((.) textInfo) textInfoX
+  textInfoY = ((.) textInfo) textInfoY
+instance HasTextInfo TextInfo where
+  {-# INLINE textInfoDX #-}
+  {-# INLINE textInfoDY #-}
+  {-# INLINE textInfoLength #-}
+  {-# INLINE textInfoRotate #-}
+  {-# INLINE textInfoX #-}
+  {-# INLINE textInfoY #-}
+  textInfo = id
+  textInfoDX f attr =
+    fmap (\y -> attr { _textInfoDX = y }) (f $ _textInfoDX attr)
+  textInfoDY f attr =
+    fmap (\y -> attr { _textInfoDY = y }) (f $ _textInfoDY attr)
+  textInfoLength f attr =
+    fmap (\y -> attr { _textInfoLength = y }) (f $ _textInfoLength attr)
+  textInfoRotate f attr =
+    fmap (\y -> attr { _textInfoRotate = y }) (f $ _textInfoRotate attr)
+  textInfoX f attr =
+    fmap (\y -> attr { _textInfoX = y }) (f $ _textInfoX attr)
+  textInfoY f attr =
+    fmap (\y -> attr { _textInfoY = y }) (f $ _textInfoY attr)
+
+instance WithDefaultSvg TextInfo where
+  defaultSvg = mempty
+
+-- | Define the content of a `<tspan>` tag.
+data TextSpanContent
+    = SpanText    !T.Text -- ^ Raw text
+    | SpanTextRef !String -- ^ Equivalent to a `<tref>`
+    | SpanSub     !TextSpan -- ^ Define a `<tspan>`
+    deriving (Eq, Show)
+
+-- | Define a `<tspan>` tag.
+data TextSpan = TextSpan
+  { -- | Placing information for the text.
+    _spanInfo           :: !TextInfo
+    -- | Drawing attributes for the text span.
+  , _spanDrawAttributes :: !DrawAttributes
+    -- | Content of the span.
+  , _spanContent        :: ![TextSpanContent]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''TextSpan
+-- | Lenses for the TextSpan type.
+class HasTextSpan c_aobD where
+  textSpan :: Lens' c_aobD TextSpan
+  spanContent :: Lens' c_aobD [TextSpanContent]
+  {-# INLINE spanContent #-}
+  spanDrawAttributes :: Lens' c_aobD DrawAttributes
+  {-# INLINE spanDrawAttributes #-}
+  spanInfo :: Lens' c_aobD TextInfo
+  {-# INLINE spanInfo #-}
+  spanContent = ((.) textSpan) spanContent
+  spanDrawAttributes = ((.) textSpan) spanDrawAttributes
+  spanInfo = ((.) textSpan) spanInfo
+instance HasTextSpan TextSpan where
+  {-# INLINE spanContent #-}
+  {-# INLINE spanDrawAttributes #-}
+  {-# INLINE spanInfo #-}
+  textSpan = id
+  spanContent f attr =
+    fmap (\y -> attr { _spanContent = y }) (f $ _spanContent attr)
+  spanDrawAttributes f attr =
+    fmap (\y -> attr { _spanDrawAttributes = y }) (f $ _spanDrawAttributes attr)
+  spanInfo f attr =
+    fmap (\y -> attr { _spanInfo = y }) (f $ _spanInfo attr)
+
+instance WithDefaultSvg TextSpan where
+  defaultSvg = TextSpan
+    { _spanInfo = defaultSvg
+    , _spanDrawAttributes = mempty
+    , _spanContent        = mempty
+    }
+
+-- | Describe the content of the `method` attribute on
+-- text path.
+data TextPathMethod
+  = TextPathAlign   -- ^ Map to the `align` value.
+  | TextPathStretch -- ^ Map to the `stretch` value.
+  deriving (Eq, Show)
+
+-- | Describe the content of the `spacing` text path
+-- attribute.
+data TextPathSpacing
+  = TextPathSpacingExact -- ^ Map to the `exact` value.
+  | TextPathSpacingAuto  -- ^ Map to the `auto` value.
+  deriving (Eq, Show)
+
+-- | Describe the `<textpath>` SVG tag.
+data TextPath = TextPath
+  { -- | Define the beginning offset on the path,
+    -- the `startOffset` attribute.
+    _textPathStartOffset :: !Number
+    -- | Define the `xlink:href` attribute.
+  , _textPathName        :: !String
+    -- | Correspond to the `method` attribute.
+  , _textPathMethod      :: !TextPathMethod
+    -- | Correspond to the `spacing` attribute.
+  , _textPathSpacing     :: !TextPathSpacing
+    -- | Real content of the path.
+  , _textPathData        :: ![PathCommand]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''TextPath
+-- | Lenses for the TextPath type.
+class HasTextPath c_aojU where
+  textPath :: Lens' c_aojU TextPath
+  textPathData :: Lens' c_aojU [PathCommand]
+  {-# INLINE textPathData #-}
+  textPathMethod :: Lens' c_aojU TextPathMethod
+  {-# INLINE textPathMethod #-}
+  textPathName :: Lens' c_aojU String
+  {-# INLINE textPathName #-}
+  textPathSpacing :: Lens' c_aojU TextPathSpacing
+  {-# INLINE textPathSpacing #-}
+  textPathStartOffset :: Lens' c_aojU Number
+  {-# INLINE textPathStartOffset #-}
+  textPathData = ((.) textPath) textPathData
+  textPathMethod = ((.) textPath) textPathMethod
+  textPathName = ((.) textPath) textPathName
+  textPathSpacing = ((.) textPath) textPathSpacing
+  textPathStartOffset = ((.) textPath) textPathStartOffset
+instance HasTextPath TextPath where
+  {-# INLINE textPathData #-}
+  {-# INLINE textPathMethod #-}
+  {-# INLINE textPathName #-}
+  {-# INLINE textPathSpacing #-}
+  {-# INLINE textPathStartOffset #-}
+  textPath = id
+  textPathData f attr =
+    fmap (\y -> attr { _textPathData = y }) (f $ _textPathData attr)
+  textPathMethod f attr =
+    fmap (\y -> attr { _textPathMethod = y }) (f $ _textPathMethod attr)
+  textPathName f attr =
+    fmap (\y -> attr { _textPathName = y }) (f $ _textPathName attr)
+  textPathSpacing f attr =
+    fmap (\y -> attr { _textPathSpacing = y }) (f $ _textPathSpacing attr)
+  textPathStartOffset f attr =
+    fmap (\y -> attr { _textPathStartOffset = y }) (f $ _textPathStartOffset attr)
+
+instance WithDefaultSvg TextPath where
+  defaultSvg = TextPath
+    { _textPathStartOffset = Num 0
+    , _textPathName        = mempty
+    , _textPathMethod      = TextPathAlign
+    , _textPathSpacing     = TextPathSpacingExact
+    , _textPathData        = []
+    }
+
+-- | Define the possible values of the `lengthAdjust`
+-- attribute.
+data TextAdjust
+  = TextAdjustSpacing -- ^ Value `spacing`
+  | TextAdjustSpacingAndGlyphs -- ^ Value `spacingAndGlyphs`
+  deriving (Eq, Show)
+
+-- | Define the global `<tag>` SVG tag.
+data Text = Text
+  { -- | Define the `lengthAdjust` attribute.
+    _textAdjust   :: !TextAdjust
+    -- | Root of the text content.
+  , _textRoot     :: !TextSpan
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Text
+-- | Lenses for the Text type.
+class HasText c_aorD where
+  text :: Lens' c_aorD Text
+  textAdjust :: Lens' c_aorD TextAdjust
+  {-# INLINE textAdjust #-}
+  textRoot :: Lens' c_aorD TextSpan
+  {-# INLINE textRoot #-}
+  textAdjust = ((.) text) textAdjust
+  textRoot = ((.) text) textRoot
+instance HasText Text where
+  {-# INLINE textAdjust #-}
+  {-# INLINE textRoot #-}
+  text = id
+  textAdjust f attr =
+    fmap (\y -> attr { _textAdjust = y }) (f $ _textAdjust attr)
+  textRoot f attr =
+    fmap (\y -> attr { _textRoot = y }) (f $ _textRoot attr)
+
+-- | Little helper to create a SVG text at a given
+-- baseline position.
+textAt :: Point -> T.Text -> Text
+textAt (x, y) txt = Text TextAdjustSpacing tspan where
+  tspan = defaultSvg
+        { _spanContent = [SpanText txt]
+        , _spanInfo = defaultSvg
+                    { _textInfoX = [x]
+                    , _textInfoY = [y]
+                    }
+        }
+
+instance WithDrawAttributes Text where
+  drawAttr = textRoot . spanDrawAttributes
+
+instance WithDefaultSvg Text where
+  defaultSvg = Text
+    { _textRoot = defaultSvg
+    , _textAdjust = TextAdjustSpacing
+    }
+
+-- | Main type for the scene description, reorient to
+-- specific type describing each tag.
+data Tree
+    = None
+    | UseTree { useInformation :: !Use
+              , useSubTree     :: !(Maybe Tree) }
+    | GroupTree     !(Group Tree)
+    | SymbolTree    !(Symbol Tree)
+    | PathTree      !Path
+    | CircleTree    !Circle
+    | PolyLineTree  !PolyLine
+    | PolygonTree   !Polygon
+    | EllipseTree   !Ellipse
+    | LineTree      !Line
+    | RectangleTree !Rectangle
+    | TextTree      !(Maybe TextPath) !Text
+    | ImageTree     !Image
+    | MeshGradientTree !MeshGradient
+    deriving (Eq, Show)
+
+-- | Define the orientation, associated to the
+-- `orient` attribute on the Marker
+data MarkerOrientation
+  = OrientationAuto        -- ^ Auto value
+  | OrientationAngle Coord -- ^ Specific angle.
+  deriving (Eq, Show)
+
+-- | Define the content of the `markerUnits` attribute
+-- on the Marker.
+data MarkerUnit
+  = MarkerUnitStrokeWidth    -- ^ Value `strokeWidth`
+  | MarkerUnitUserSpaceOnUse -- ^ Value `userSpaceOnUse`
+  deriving (Eq, Show)
+
+-- | Define the content of the `markerUnits` attribute
+-- on the Marker.
+data Overflow
+  = OverflowVisible    -- ^ Value `visible`
+  | OverflowHidden     -- ^ Value `hidden`
+  deriving (Eq, Show)
+
+-- | Define the `<marker>` tag.
+data Marker = Marker
+  { -- | Draw attributes of the marker.
+    _markerDrawAttributes :: DrawAttributes
+    -- | Define the reference point of the marker.
+    -- correspond to the `refX` and `refY` attributes.
+  , _markerRefPoint    :: !(Number, Number)
+    -- | Define the width of the marker. Correspond to
+    -- the `markerWidth` attribute.
+  , _markerWidth       :: !(Maybe Number)
+    -- | Define the height of the marker. Correspond to
+    -- the `markerHeight` attribute.
+  , _markerHeight      :: !(Maybe Number)
+    -- | Correspond to the `orient` attribute.
+  , _markerOrient      :: !(Maybe MarkerOrientation)
+    -- | Map the `markerUnits` attribute.
+  , _markerUnits       :: !(Maybe MarkerUnit)
+    -- | Optional viewbox
+  , _markerViewBox     :: !(Maybe (Double, Double, Double, Double))
+    -- | Elements defining the marker.
+  , _markerOverflow    :: !(Maybe Overflow)
+    -- | preserveAspectRatio attribute
+  , _markerAspectRatio :: !PreserveAspectRatio
+    -- | Elements defining the marker.
+  , _markerElements :: [Tree]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Marker
+-- | Lenses for the Marker type.
+class HasMarker c_aoKc where
+  marker :: Lens' c_aoKc Marker
+  markerAspectRatio :: Lens' c_aoKc PreserveAspectRatio
+  {-# INLINE markerAspectRatio #-}
+  markerDrawAttributes :: Lens' c_aoKc DrawAttributes
+  {-# INLINE markerDrawAttributes #-}
+  markerElements :: Lens' c_aoKc [Tree]
+  {-# INLINE markerElements #-}
+  markerHeight :: Lens' c_aoKc (Maybe Number)
+  {-# INLINE markerHeight #-}
+  markerOrient :: Lens' c_aoKc (Maybe MarkerOrientation)
+  {-# INLINE markerOrient #-}
+  markerOverflow :: Lens' c_aoKc (Maybe Overflow)
+  {-# INLINE markerOverflow #-}
+  markerRefPoint :: Lens' c_aoKc (Number, Number)
+  {-# INLINE markerRefPoint #-}
+  markerUnits :: Lens' c_aoKc (Maybe MarkerUnit)
+  {-# INLINE markerUnits #-}
+  markerViewBox ::
+    Lens' c_aoKc (Maybe (Double, Double, Double, Double))
+  {-# INLINE markerViewBox #-}
+  markerWidth :: Lens' c_aoKc (Maybe Number)
+  {-# INLINE markerWidth #-}
+  markerAspectRatio = ((.) marker) markerAspectRatio
+  markerDrawAttributes = ((.) marker) markerDrawAttributes
+  markerElements = ((.) marker) markerElements
+  markerHeight = ((.) marker) markerHeight
+  markerOrient = ((.) marker) markerOrient
+  markerOverflow = ((.) marker) markerOverflow
+  markerRefPoint = ((.) marker) markerRefPoint
+  markerUnits = ((.) marker) markerUnits
+  markerViewBox = ((.) marker) markerViewBox
+  markerWidth = ((.) marker) markerWidth
+instance HasMarker Marker where
+  {-# INLINE markerAspectRatio #-}
+  {-# INLINE markerDrawAttributes #-}
+  {-# INLINE markerElements #-}
+  {-# INLINE markerHeight #-}
+  {-# INLINE markerOrient #-}
+  {-# INLINE markerOverflow #-}
+  {-# INLINE markerRefPoint #-}
+  {-# INLINE markerUnits #-}
+  {-# INLINE markerViewBox #-}
+  {-# INLINE markerWidth #-}
+  marker = id
+  markerAspectRatio f attr =
+    fmap (\y -> attr { _markerAspectRatio = y }) (f $ _markerAspectRatio attr)
+  markerDrawAttributes f attr =
+    fmap (\y -> attr { _markerDrawAttributes = y }) (f $ _markerDrawAttributes attr)
+  markerElements f attr =
+    fmap (\y -> attr { _markerElements = y }) (f $ _markerElements attr)
+  markerHeight f attr =
+    fmap (\y -> attr { _markerHeight = y }) (f $ _markerHeight attr)
+  markerOrient f attr =
+    fmap (\y -> attr { _markerOrient = y }) (f $ _markerOrient attr)
+  markerOverflow f attr =
+    fmap (\y -> attr { _markerOverflow = y }) (f $ _markerOverflow attr)
+  markerRefPoint f attr =
+    fmap (\y -> attr { _markerRefPoint = y }) (f $ _markerRefPoint attr)
+  markerUnits f attr =
+    fmap (\y -> attr { _markerUnits = y }) (f $ _markerUnits attr)
+  markerViewBox f attr =
+    fmap (\y -> attr { _markerViewBox = y }) (f $ _markerViewBox attr)
+  markerWidth f attr =
+    fmap (\y -> attr { _markerWidth = y }) (f $ _markerWidth attr)
+
+instance WithDrawAttributes Marker where
+    drawAttr = markerDrawAttributes
+
+instance WithDefaultSvg Marker where
+  defaultSvg = Marker
+    { _markerDrawAttributes = mempty
+    , _markerRefPoint = (Num 0, Num 0)
+    , _markerWidth = Just (Num 3)
+    , _markerHeight = Just (Num 3)
+    , _markerOrient = Nothing -- MarkerOrientation
+    , _markerUnits = Nothing -- MarkerUnitStrokeWidth
+    , _markerViewBox = Nothing
+    , _markerOverflow = Nothing
+    , _markerElements = mempty
+    , _markerAspectRatio = defaultSvg
+    }
+
+-- | Insert element in the first sublist in the list of list.
+appNode :: [[a]] -> a -> [[a]]
+appNode [] e = [[e]]
+appNode (curr:above) e = (e:curr) : above
+
+-- | Map a tree while propagating context information.
+-- The function passed in parameter receive a list
+-- representing the the path used to go arrive to the
+-- current node.
+zipTree :: ([[Tree]] -> Tree) -> Tree -> Tree
+zipTree f = dig [] where
+  dig prev e@None = f $ appNode prev e
+  dig prev e@(UseTree _ Nothing) = f $ appNode prev e
+  dig prev e@(UseTree nfo (Just u)) =
+      f . appNode prev . UseTree nfo . Just $ dig ([] : appNode prev e) u
+  dig prev e@(GroupTree g) =
+      f . appNode prev . GroupTree $ zipGroup (appNode prev e) g
+  dig prev e@(SymbolTree g) =
+      f . appNode prev . SymbolTree . Symbol .
+            zipGroup (appNode prev e) $ _groupOfSymbol g
+  dig prev e@(PathTree _) = f $ appNode prev e
+  dig prev e@(CircleTree _) = f $ appNode prev e
+  dig prev e@(PolyLineTree _) = f $ appNode prev e
+  dig prev e@(PolygonTree _) = f $ appNode prev e
+  dig prev e@(EllipseTree _) = f $ appNode prev e
+  dig prev e@(LineTree _) = f $ appNode prev e
+  dig prev e@(RectangleTree _) = f $ appNode prev e
+  dig prev e@(TextTree _ _) = f $ appNode prev e
+  dig prev e@(ImageTree _) = f $ appNode prev e
+  dig prev e@(MeshGradientTree _) = f $ appNode prev e
+
+  zipGroup prev g = g { _groupChildren = updatedChildren }
+    where
+      groupChild = _groupChildren g
+      updatedChildren =
+        [dig (c:prev) child
+            | (child, c) <- zip groupChild $ inits groupChild]
+
+-- | Fold all nodes of a SVG tree.
+foldTree :: (a -> Tree -> a) -> a -> Tree -> a
+foldTree f = go where
+  go acc e = case e of
+    None            -> f acc e
+    UseTree _ _     -> f acc e
+    PathTree _      -> f acc e
+    CircleTree _    -> f acc e
+    PolyLineTree _  -> f acc e
+    PolygonTree _   -> f acc e
+    EllipseTree _   -> f acc e
+    LineTree _      -> f acc e
+    RectangleTree _ -> f acc e
+    TextTree    _ _ -> f acc e
+    ImageTree _     -> f acc e
+    MeshGradientTree _ -> f acc e
+    GroupTree g     ->
+      let subAcc = F.foldl' go acc $ _groupChildren g in
+      f subAcc e
+    SymbolTree s    ->
+      let subAcc =
+            F.foldl' go acc . _groupChildren $ _groupOfSymbol s in
+      f subAcc e
+
+-- | Helper function mapping every tree element.
+mapTree :: (Tree -> Tree) -> Tree -> Tree
+mapTree f = go where
+  go e@None = f e
+  go e@(UseTree _ _) = f e
+  go (GroupTree g) = f . GroupTree $ mapGroup g
+  go (SymbolTree g) =
+      f . SymbolTree . Symbol . mapGroup $ _groupOfSymbol g
+  go e@(PathTree _) = f e
+  go e@(CircleTree _) = f e
+  go e@(PolyLineTree _) = f e
+  go e@(PolygonTree _) = f e
+  go e@(EllipseTree _) = f e
+  go e@(LineTree _) = f e
+  go e@(RectangleTree _) = f e
+  go e@(TextTree _ _) = f e
+  go e@(ImageTree _) = f e
+  go e@(MeshGradientTree _) = f e
+
+  mapGroup g =
+      g { _groupChildren = map go $ _groupChildren g }
+
+-- | For every element of a svg tree, associate
+-- it's SVG tag name.
+nameOfTree :: Tree -> T.Text
+nameOfTree v =
+  case v of
+   None     -> ""
+   UseTree _ _     -> "use"
+   GroupTree _     -> "g"
+   SymbolTree _    -> "symbol"
+   PathTree _      -> "path"
+   CircleTree _    -> "circle"
+   PolyLineTree _  -> "polyline"
+   PolygonTree _   -> "polygon"
+   EllipseTree _   -> "ellipse"
+   LineTree _      -> "line"
+   RectangleTree _ -> "rectangle"
+   TextTree    _ _ -> "text"
+   ImageTree _     -> "image"
+   MeshGradientTree _ -> "meshgradient"
+
+drawAttrOfTree :: Tree -> DrawAttributes
+drawAttrOfTree v = case v of
+  None -> mempty
+  UseTree e _ -> e ^. drawAttr
+  GroupTree e -> e ^. drawAttr
+  SymbolTree e -> e ^. drawAttr
+  PathTree e -> e ^. drawAttr
+  CircleTree e -> e ^. drawAttr
+  PolyLineTree e -> e ^. drawAttr
+  PolygonTree e -> e ^. drawAttr
+  EllipseTree e -> e ^. drawAttr
+  LineTree e -> e ^. drawAttr
+  RectangleTree e -> e ^. drawAttr
+  TextTree _ e -> e ^. drawAttr
+  ImageTree e -> e ^. drawAttr
+  MeshGradientTree e -> e ^. drawAttr
+
+setDrawAttrOfTree :: Tree -> DrawAttributes -> Tree
+setDrawAttrOfTree v attr = case v of
+  None -> None
+  UseTree e m -> UseTree (e & drawAttr .~ attr) m
+  GroupTree e -> GroupTree $ e & drawAttr .~ attr
+  SymbolTree e -> SymbolTree $ e & drawAttr .~ attr
+  PathTree e -> PathTree $ e & drawAttr .~ attr
+  CircleTree e -> CircleTree $ e & drawAttr .~ attr
+  PolyLineTree e -> PolyLineTree $ e & drawAttr .~ attr
+  PolygonTree e -> PolygonTree $ e & drawAttr .~ attr
+  EllipseTree e -> EllipseTree $ e & drawAttr .~ attr
+  LineTree e -> LineTree $ e & drawAttr .~ attr
+  RectangleTree e -> RectangleTree $ e & drawAttr .~ attr
+  TextTree a e -> TextTree a $ e & drawAttr .~ attr
+  ImageTree e -> ImageTree $ e & drawAttr .~ attr
+  MeshGradientTree e -> MeshGradientTree $ e & drawAttr .~ attr
+
+instance WithDrawAttributes Tree where
+    drawAttr = lens drawAttrOfTree setDrawAttrOfTree
+
+instance WithDefaultSvg Tree where
+    defaultSvg = None
+
+-- | Define the possible values for the `spreadMethod`
+-- values used for the gradient definitions.
+data Spread
+    = SpreadRepeat  -- ^ `reapeat` value
+    | SpreadPad     -- ^ `pad` value
+    | SpreadReflect -- ^ `reflect value`
+    deriving (Eq, Show)
+
+-- | Define a `<linearGradient>` tag.
+data LinearGradient = LinearGradient
+    { -- | Define coordinate system of the gradient,
+      -- associated to the `gradientUnits` attribute.
+      _linearGradientUnits  :: CoordinateUnits
+      -- | Point defining the beginning of the line gradient.
+      -- Associated to the `x1` and `y1` attribute.
+    , _linearGradientStart  :: Point
+      -- | Point defining the end of the line gradient.
+      -- Associated to the `x2` and `y2` attribute.
+    , _linearGradientStop   :: Point
+      -- | Define how to handle the values outside
+      -- the gradient start and stop. Associated to the
+      -- `spreadMethod` attribute.
+    , _linearGradientSpread :: Spread
+      -- | Define the transformation to apply to the
+      -- gradient points. Associated to the `gradientTransform`
+      -- attribute.
+    , _linearGradientTransform :: [Transformation]
+      -- | List of color stops of the linear gradient.
+    , _linearGradientStops  :: [GradientStop]
+    }
+    deriving (Eq, Show)
+
+-- makeClassy ''LinearGradient
+-- | Lenses for the LinearGradient type.
+class HasLinearGradient c_apmJ where
+  linearGradient :: Lens' c_apmJ LinearGradient
+  linearGradientSpread :: Lens' c_apmJ Spread
+  {-# INLINE linearGradientSpread #-}
+  linearGradientStart :: Lens' c_apmJ Point
+  {-# INLINE linearGradientStart #-}
+  linearGradientStop :: Lens' c_apmJ Point
+  {-# INLINE linearGradientStop #-}
+  linearGradientStops :: Lens' c_apmJ [GradientStop]
+  {-# INLINE linearGradientStops #-}
+  linearGradientTransform :: Lens' c_apmJ [Transformation]
+  {-# INLINE linearGradientTransform #-}
+  linearGradientUnits :: Lens' c_apmJ CoordinateUnits
+  {-# INLINE linearGradientUnits #-}
+  linearGradientSpread = ((.) linearGradient) linearGradientSpread
+  linearGradientStart = ((.) linearGradient) linearGradientStart
+  linearGradientStop = ((.) linearGradient) linearGradientStop
+  linearGradientStops = ((.) linearGradient) linearGradientStops
+  linearGradientTransform
+    = ((.) linearGradient) linearGradientTransform
+  linearGradientUnits = ((.) linearGradient) linearGradientUnits
+
+instance HasLinearGradient LinearGradient where
+  {-# INLINE linearGradientSpread #-}
+  {-# INLINE linearGradientStart #-}
+  {-# INLINE linearGradientStop #-}
+  {-# INLINE linearGradientStops #-}
+  {-# INLINE linearGradientTransform #-}
+  {-# INLINE linearGradientUnits #-}
+  linearGradient = id
+  linearGradientSpread f attr =
+    fmap (\y -> attr { _linearGradientSpread = y }) (f $ _linearGradientSpread attr)
+  linearGradientStart f attr =
+    fmap (\y -> attr { _linearGradientStart = y }) (f $ _linearGradientStart attr)
+  linearGradientStop f attr =
+    fmap (\y -> attr { _linearGradientStop = y }) (f $ _linearGradientStop attr)
+  linearGradientStops f attr =
+    fmap (\y -> attr { _linearGradientStops = y }) (f $ _linearGradientStops attr)
+  linearGradientTransform f attr =
+    fmap (\y -> attr { _linearGradientTransform = y }) (f $ _linearGradientTransform attr)
+  linearGradientUnits f attr =
+    fmap (\y -> attr { _linearGradientUnits = y }) (f $ _linearGradientUnits attr)
+
+instance WithDefaultSvg LinearGradient where
+  defaultSvg = LinearGradient
+    { _linearGradientUnits     = CoordBoundingBox
+    , _linearGradientStart     = (Percent 0, Percent 0)
+    , _linearGradientStop      = (Percent 1, Percent 0)
+    , _linearGradientSpread    = SpreadPad
+    , _linearGradientTransform = []
+    , _linearGradientStops     = []
+    }
+
+-- | Define a `<radialGradient>` tag.
+data RadialGradient = RadialGradient
+  { -- | Define coordinate system of the gradient,
+    -- associated to the `gradientUnits` attribute.
+    _radialGradientUnits   :: CoordinateUnits
+    -- | Center of the radial gradient. Associated to
+    -- the `cx` and `cy` attributes.
+  , _radialGradientCenter  :: Point
+    -- | Radius of the radial gradient. Associated to
+    -- the `r` attribute.
+  , _radialGradientRadius  :: Number
+    -- | X coordinate of the focus point of the radial
+    -- gradient. Associated to the `fx` attribute.
+  , _radialGradientFocusX  :: Maybe Number
+    -- | Y coordinate of the focus point of the radial
+    -- gradient. Associated to the `fy` attribute.
+  , _radialGradientFocusY  :: Maybe Number
+    -- | Define how to handle the values outside
+    -- the gradient start and stop. Associated to the
+    -- `spreadMethod` attribute.
+  , _radialGradientSpread  :: Spread
+    -- | Define the transformation to apply to the
+    -- gradient points. Associated to the `gradientTransform`
+    -- attribute.
+  , _radialGradientTransform :: [Transformation]
+    -- | List of color stops of the radial gradient.
+  , _radialGradientStops   :: [GradientStop]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''RadialGradient
+-- | Lenses for the RadialGradient type.
+
+class HasRadialGradient c_apwt where
+  radialGradient :: Lens' c_apwt RadialGradient
+  radialGradientCenter :: Lens' c_apwt Point
+  {-# INLINE radialGradientCenter #-}
+  radialGradientFocusX :: Lens' c_apwt (Maybe Number)
+  {-# INLINE radialGradientFocusX #-}
+  radialGradientFocusY :: Lens' c_apwt (Maybe Number)
+  {-# INLINE radialGradientFocusY #-}
+  radialGradientRadius :: Lens' c_apwt Number
+  {-# INLINE radialGradientRadius #-}
+  radialGradientSpread :: Lens' c_apwt Spread
+  {-# INLINE radialGradientSpread #-}
+  radialGradientStops :: Lens' c_apwt [GradientStop]
+  {-# INLINE radialGradientStops #-}
+  radialGradientTransform :: Lens' c_apwt [Transformation]
+  {-# INLINE radialGradientTransform #-}
+  radialGradientUnits :: Lens' c_apwt CoordinateUnits
+  {-# INLINE radialGradientUnits #-}
+  radialGradientCenter = ((.) radialGradient) radialGradientCenter
+  radialGradientFocusX = ((.) radialGradient) radialGradientFocusX
+  radialGradientFocusY = ((.) radialGradient) radialGradientFocusY
+  radialGradientRadius = ((.) radialGradient) radialGradientRadius
+  radialGradientSpread = ((.) radialGradient) radialGradientSpread
+  radialGradientStops = ((.) radialGradient) radialGradientStops
+  radialGradientTransform
+    = ((.) radialGradient) radialGradientTransform
+  radialGradientUnits = ((.) radialGradient) radialGradientUnits
+
+instance HasRadialGradient RadialGradient where
+  {-# INLINE radialGradientCenter #-}
+  {-# INLINE radialGradientFocusX #-}
+  {-# INLINE radialGradientFocusY #-}
+  {-# INLINE radialGradientRadius #-}
+  {-# INLINE radialGradientSpread #-}
+  {-# INLINE radialGradientStops #-}
+  {-# INLINE radialGradientTransform #-}
+  {-# INLINE radialGradientUnits #-}
+  radialGradient = id
+  radialGradientCenter f attr =
+    fmap (\y -> attr { _radialGradientCenter = y }) (f $ _radialGradientCenter attr)
+  radialGradientFocusX f attr =
+    fmap (\y -> attr { _radialGradientFocusX = y }) (f $ _radialGradientFocusX attr)
+  radialGradientFocusY f attr =
+    fmap (\y -> attr { _radialGradientFocusY = y }) (f $ _radialGradientFocusY attr)
+  radialGradientRadius f attr =
+    fmap (\y -> attr { _radialGradientRadius = y }) (f $ _radialGradientRadius attr)
+  radialGradientSpread f attr =
+    fmap (\y -> attr { _radialGradientSpread = y }) (f $ _radialGradientSpread attr)
+  radialGradientStops f attr =
+    fmap (\y -> attr { _radialGradientStops = y }) (f $ _radialGradientStops attr)
+  radialGradientTransform f attr =
+    fmap (\y -> attr { _radialGradientTransform = y }) (f $ _radialGradientTransform attr)
+  radialGradientUnits f attr =
+    fmap (\y -> attr { _radialGradientUnits = y }) (f $ _radialGradientUnits attr)
+
+instance WithDefaultSvg RadialGradient where
+  defaultSvg = RadialGradient
+    { _radialGradientUnits   = CoordBoundingBox
+    , _radialGradientCenter  = (Percent 0.5, Percent 0.5)
+    , _radialGradientRadius  = Percent 0.5
+    , _radialGradientFocusX  = Nothing
+    , _radialGradientFocusY  = Nothing
+    , _radialGradientSpread  = SpreadPad
+    , _radialGradientTransform = []
+    , _radialGradientStops   = []
+    }
+
+-- | Define a SVG `<mask>` tag.
+data Mask = Mask
+  { -- | Drawing attributes of the Mask
+    _maskDrawAttributes :: DrawAttributes
+    -- | Correspond to the `maskContentUnits` attributes.
+  , _maskContentUnits :: CoordinateUnits
+    -- | Mapping to the `maskUnits` attribute.
+  , _maskUnits        :: CoordinateUnits
+    -- | Map to the `x` and `y` attributes.
+  , _maskPosition     :: Point
+    -- | Map to the `width` attribute
+  , _maskWidth        :: Number
+    -- | Map to the `height` attribute.
+  , _maskHeight       :: Number
+    -- | Children of the `<mask>` tag.
+  , _maskContent      :: [Tree]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''Mask
+-- | Lenses for the Mask type.
+class HasMask c_apHI where
+  mask :: Lens' c_apHI Mask
+  maskContent :: Lens' c_apHI [Tree]
+  {-# INLINE maskContent #-}
+  maskContentUnits :: Lens' c_apHI CoordinateUnits
+  {-# INLINE maskContentUnits #-}
+  maskDrawAttributes :: Lens' c_apHI DrawAttributes
+  {-# INLINE maskDrawAttributes #-}
+  maskHeight :: Lens' c_apHI Number
+  {-# INLINE maskHeight #-}
+  maskPosition :: Lens' c_apHI Point
+  {-# INLINE maskPosition #-}
+  maskUnits :: Lens' c_apHI CoordinateUnits
+  {-# INLINE maskUnits #-}
+  maskWidth :: Lens' c_apHI Number
+  {-# INLINE maskWidth #-}
+  maskContent = ((.) mask) maskContent
+  maskContentUnits = ((.) mask) maskContentUnits
+  maskDrawAttributes = ((.) mask) maskDrawAttributes
+  maskHeight = ((.) mask) maskHeight
+  maskPosition = ((.) mask) maskPosition
+  maskUnits = ((.) mask) maskUnits
+  maskWidth = ((.) mask) maskWidth
+
+instance HasMask Mask where
+  {-# INLINE maskContent #-}
+  {-# INLINE maskContentUnits #-}
+  {-# INLINE maskDrawAttributes #-}
+  {-# INLINE maskHeight #-}
+  {-# INLINE maskPosition #-}
+  {-# INLINE maskUnits #-}
+  {-# INLINE maskWidth #-}
+  mask = id
+  maskContent f attr =
+    fmap (\y -> attr { _maskContent = y }) (f $ _maskContent attr)
+  maskContentUnits f attr =
+    fmap (\y -> attr { _maskContentUnits = y }) (f $ _maskContentUnits attr)
+  maskDrawAttributes f attr =
+    fmap (\y -> attr { _maskDrawAttributes = y }) (f $ _maskDrawAttributes attr)
+  maskHeight f attr =
+    fmap (\y -> attr { _maskHeight = y }) (f $ _maskHeight attr)
+  maskPosition f attr =
+    fmap (\y -> attr { _maskPosition = y }) (f $ _maskPosition attr)
+  maskUnits f attr =
+    fmap (\y -> attr { _maskUnits = y }) (f $ _maskUnits attr)
+  maskWidth f attr =
+    fmap (\y -> attr { _maskWidth = y }) (f $ _maskWidth attr)
+
+instance WithDrawAttributes Mask where
+  drawAttr = maskDrawAttributes
+
+instance WithDefaultSvg Mask where
+  defaultSvg = Mask
+    { _maskDrawAttributes = mempty
+    , _maskContentUnits = CoordUserSpace
+    , _maskUnits        = CoordBoundingBox
+    , _maskPosition     = (Percent (-0.1), Percent (-0.1))
+    , _maskWidth        = Percent 1.2
+    , _maskHeight       = Percent 1.2
+    , _maskContent      = []
+    }
+
+-- | Define a `<clipPath>` tag.
+data ClipPath = ClipPath
+  { _clipPathDrawAttributes :: DrawAttributes
+    -- | Maps to the `clipPathUnits` attribute
+  , _clipPathUnits          :: CoordinateUnits
+    -- | Maps to the content of the tree
+  , _clipPathContent        :: [Tree]
+  }
+  deriving (Eq, Show)
+
+-- makeClassy ''ClipPath
+-- | Lenses for the ClipPath type.
+class HasClipPath c_apZq where
+  clipPath :: Lens' c_apZq ClipPath
+  clipPathContent :: Lens' c_apZq [Tree]
+  {-# INLINE clipPathContent #-}
+  clipPathDrawAttributes :: Lens' c_apZq DrawAttributes
+  {-# INLINE clipPathDrawAttributes #-}
+  clipPathUnits :: Lens' c_apZq CoordinateUnits
+  {-# INLINE clipPathUnits #-}
+  clipPathContent = ((.) clipPath) clipPathContent
+  clipPathDrawAttributes = ((.) clipPath) clipPathDrawAttributes
+  clipPathUnits = ((.) clipPath) clipPathUnits
+instance HasClipPath ClipPath where
+  {-# INLINE clipPathContent #-}
+  {-# INLINE clipPathDrawAttributes #-}
+  {-# INLINE clipPathUnits #-}
+  clipPath = id
+  clipPathContent f attr =
+    fmap (\y -> attr { _clipPathContent = y }) (f $ _clipPathContent attr)
+  clipPathDrawAttributes f attr =
+    fmap (\y -> attr { _clipPathDrawAttributes = y }) (f $ _clipPathDrawAttributes attr)
+  clipPathUnits f attr =
+    fmap (\y -> attr { _clipPathUnits = y }) (f $ _clipPathUnits attr)
+
+instance WithDrawAttributes ClipPath where
+  drawAttr = clipPathDrawAttributes
+
+instance WithDefaultSvg ClipPath where
+  defaultSvg = ClipPath
+    { _clipPathDrawAttributes = mempty
+    , _clipPathUnits = CoordUserSpace
+    , _clipPathContent = mempty
+    }
+
+-- | Define a `<pattern>` tag.
+data Pattern = Pattern
+    { -- | Pattern drawing attributes.
+      _patternDrawAttributes :: !DrawAttributes
+      -- | Possible `viewBox`.
+    , _patternViewBox  :: !(Maybe (Double, Double, Double, Double))
+      -- | Width of the pattern tile, mapped to the
+      -- `width` attribute
+    , _patternWidth    :: !Number
+      -- | Height of the pattern tile, mapped to the
+      -- `height` attribute
+    , _patternHeight   :: !Number
+      -- | Pattern tile base, mapped to the `x` and
+      -- `y` attributes.
+    , _patternPos      :: !Point
+      -- | Patterns can be chained, so this is a potential
+      -- reference to another pattern
+    , _patternHref     :: !String
+      -- | Elements used in the pattern.
+    , _patternElements :: ![Tree]
+      -- | Define the cordinate system to use for
+      -- the pattern. Mapped to the `patternUnits`
+      -- attribute.
+    , _patternUnit        :: !CoordinateUnits
+      -- | Value of the "preserveAspectRatio" attribute
+    , _patternAspectRatio :: !PreserveAspectRatio 
+      -- | Value of "patternTransform" attribute
+    , _patternTransform   :: !(Maybe [Transformation])
+    }
+    deriving Show
+
+-- makeClassy ''Pattern
+-- | Lenses for the Patter type.
+class HasPattern c_aq6G where
+  pattern :: Lens' c_aq6G Pattern
+  patternAspectRatio :: Lens' c_aq6G PreserveAspectRatio
+  {-# INLINE patternAspectRatio #-}
+  patternDrawAttributes :: Lens' c_aq6G DrawAttributes
+  {-# INLINE patternDrawAttributes #-}
+  patternElements :: Lens' c_aq6G [Tree]
+  {-# INLINE patternElements #-}
+  patternHeight :: Lens' c_aq6G Number
+  {-# INLINE patternHeight #-}
+  patternHref :: Lens' c_aq6G String
+  {-# INLINE patternHref #-}
+  patternPos :: Lens' c_aq6G Point
+  {-# INLINE patternPos #-}
+  patternTransform :: Lens' c_aq6G (Maybe [Transformation])
+  {-# INLINE patternTransform #-}
+  patternUnit :: Lens' c_aq6G CoordinateUnits
+  {-# INLINE patternUnit #-}
+  patternViewBox ::
+    Lens' c_aq6G (Maybe (Double, Double, Double, Double))
+  {-# INLINE patternViewBox #-}
+  patternWidth :: Lens' c_aq6G Number
+  {-# INLINE patternWidth #-}
+  patternAspectRatio = ((.) pattern) patternAspectRatio
+  patternDrawAttributes = ((.) pattern) patternDrawAttributes
+  patternElements = ((.) pattern) patternElements
+  patternHeight = ((.) pattern) patternHeight
+  patternHref = ((.) pattern) patternHref
+  patternPos = ((.) pattern) patternPos
+  patternTransform = ((.) pattern) patternTransform
+  patternUnit = ((.) pattern) patternUnit
+  patternViewBox = ((.) pattern) patternViewBox
+  patternWidth = ((.) pattern) patternWidth
+
+instance HasPattern Pattern where
+  {-# INLINE patternAspectRatio #-}
+  {-# INLINE patternDrawAttributes #-}
+  {-# INLINE patternElements #-}
+  {-# INLINE patternHeight #-}
+  {-# INLINE patternHref #-}
+  {-# INLINE patternPos #-}
+  {-# INLINE patternTransform #-}
+  {-# INLINE patternUnit #-}
+  {-# INLINE patternViewBox #-}
+  {-# INLINE patternWidth #-}
+  pattern = id
+  patternAspectRatio f attr =
+    fmap (\y -> attr { _patternAspectRatio = y }) (f $ _patternAspectRatio attr)
+  patternDrawAttributes f attr =
+    fmap (\y -> attr { _patternDrawAttributes = y }) (f $ _patternDrawAttributes attr)
+  patternElements f attr =
+    fmap (\y -> attr { _patternElements = y }) (f $ _patternElements attr)
+  patternHeight f attr =
+    fmap (\y -> attr { _patternHeight = y }) (f $ _patternHeight attr)
+  patternHref f attr =
+    fmap (\y -> attr { _patternHref = y }) (f $ _patternHref attr)
+  patternPos f attr =
+    fmap (\y -> attr { _patternPos = y }) (f $ _patternPos attr)
+  patternTransform f attr =
+    fmap (\y -> attr { _patternTransform = y }) (f $ _patternTransform attr)
+  patternUnit f attr =
+    fmap (\y -> attr { _patternUnit = y }) (f $ _patternUnit attr)
+  patternViewBox f attr =
+    fmap (\y -> attr { _patternViewBox = y }) (f $ _patternViewBox attr)
+  patternWidth f attr =
+    fmap (\y -> attr { _patternWidth = y }) (f $ _patternWidth attr)
+
+instance WithDrawAttributes Pattern where
+    drawAttr = patternDrawAttributes
+
+instance WithDefaultSvg Pattern where
+  defaultSvg = Pattern
+    { _patternViewBox  = Nothing
+    , _patternWidth    = Num 0
+    , _patternHeight   = Num 0
+    , _patternPos      = (Num 0, Num 0)
+    , _patternElements = []
+    , _patternUnit = CoordBoundingBox
+    , _patternDrawAttributes = mempty
+    , _patternAspectRatio = defaultSvg
+    , _patternHref = ""
+    , _patternTransform = mempty
+    }
+
+-- | Sum types helping keeping track of all the namable
+-- elemens in a SVG document.
+data Element
+    = ElementLinearGradient LinearGradient
+    | ElementRadialGradient RadialGradient
+    | ElementMeshGradient   MeshGradient
+    | ElementGeometry Tree
+    | ElementPattern  Pattern
+    | ElementMarker Marker
+    | ElementMask Mask
+    | ElementClipPath ClipPath
+    deriving Show
+
+-- | Represent a full svg document with style,
+-- geometry and named elements.
+data Document = Document
+    { _viewBox          :: Maybe (Double, Double, Double, Double)
+    , _width            :: Maybe Number
+    , _height           :: Maybe Number
+    , _elements         :: [Tree]
+    , _definitions      :: M.Map String Element
+    , _description      :: String
+    , _styleRules       :: [CssRule]
+    , _documentLocation :: FilePath
+    }
+    deriving Show
+
+-- makeClassy ''Document
+-- | Lenses associated to a SVG document.
+class HasDocument c_aqpq where
+  document :: Lens' c_aqpq Document
+  definitions :: Lens' c_aqpq (M.Map String Element)
+  {-# INLINE definitions #-}
+  definitions = document . definitions
+
+  description :: Lens' c_aqpq String
+  {-# INLINE description #-}
+  description = document . description
+
+  documentLocation :: Lens' c_aqpq FilePath
+  {-# INLINE documentLocation #-}
+  documentLocation = document . documentLocation
+
+  elements :: Lens' c_aqpq [Tree]
+  {-# INLINE elements #-}
+  elements = document . elements
+
+  height :: Lens' c_aqpq (Maybe Number)
+  {-# INLINE height #-}
+  height = document . height
+
+  styleRules :: Lens' c_aqpq [CssRule]
+  {-# INLINE styleRules #-}
+  styleRules = document . styleRules
+
+  viewBox :: Lens' c_aqpq (Maybe (Double, Double, Double, Double))
+  {-# INLINE viewBox #-}
+  viewBox = document . viewBox
+
+  width :: Lens' c_aqpq (Maybe Number)
+  {-# INLINE width #-}
+  width = document . width
+
+instance HasDocument Document where
+  document = id
+  {-# INLINE definitions #-}
+  definitions f attr =
+    fmap (\y -> attr { _definitions = y }) (f $ _definitions attr)
+
+  {-# INLINE description #-}
+  description f attr =
+    fmap (\y -> attr { _description = y }) (f $ _description attr)
+
+  {-# INLINE documentLocation #-}
+  documentLocation f attr =
+    fmap (\y -> attr { _documentLocation = y }) (f $ _documentLocation attr)
+
+  {-# INLINE elements #-}
+  elements f attr =
+    fmap (\y -> attr { _elements = y }) (f $ _elements attr)
+
+  {-# INLINE height #-}
+  height f attr =
+    fmap (\y -> attr { _height = y }) (f $ _height attr)
+
+  {-# INLINE styleRules #-}
+  styleRules f attr =
+    fmap (\y -> attr { _styleRules = y }) (f $ _styleRules attr)
+
+  {-# INLINE viewBox #-}
+  viewBox f attr =
+    fmap (\y -> attr { _viewBox = y }) (f $ _viewBox attr)
+
+  {-# INLINE width #-}
+  width f attr =
+    fmap (\y -> attr { _width = y }) (f $ _width attr)
+
+-- | Calculate the document size in function of the
+-- different available attributes in the document.
+documentSize :: Dpi -> Document -> (Int, Int)
+documentSize _ Document { _viewBox = Just (x1, y1, x2, y2)
+                        , _width = Just (Percent pw)
+                        , _height = Just (Percent ph)
+                        } =
+    (floor $ dx * pw, floor $ dy * ph)
+      where
+        dx = abs $ x2 - x1
+        dy = abs $ y2 - y1
+documentSize _ Document { _width = Just (Num w)
+                        , _height = Just (Num h) } = (floor w, floor h)
+documentSize dpi doc@(Document { _width = Just w
+                               , _height = Just h }) =
+  documentSize dpi $ doc
+    { _width = Just $ toUserUnit dpi w
+    , _height = Just $ toUserUnit dpi h }
+documentSize _ Document { _viewBox = Just (x1, y1, x2, y2) } =
+    (floor . abs $ x2 - x1, floor . abs $ y2 - y1)
+documentSize _ _ = (1, 1)
+
+mayMerge :: Monoid a => Maybe a -> Maybe a -> Maybe a
+mayMerge (Just a) (Just b) = Just $ mappend a b
+mayMerge _ b@(Just _) = b
+mayMerge a Nothing = a
+
+instance Monoid DrawAttributes where
+    mempty = DrawAttributes
+        { _strokeWidth      = Last Nothing
+        , _strokeColor      = Last Nothing
+        , _strokeOpacity    = Nothing
+        , _strokeLineCap    = Last Nothing
+        , _strokeLineJoin   = Last Nothing
+        , _strokeMiterLimit = Last Nothing
+        , _fillColor        = Last Nothing
+        , _groupOpacity     = Nothing
+        , _fillOpacity      = Nothing
+        , _fontSize         = Last Nothing
+        , _fontFamily       = Last Nothing
+        , _fontStyle        = Last Nothing
+        , _transform        = Nothing
+        , _fillRule         = Last Nothing
+        , _attrClass        = mempty
+        , _attrId           = Nothing
+        , _strokeOffset     = Last Nothing
+        , _strokeDashArray  = Last Nothing
+        , _textAnchor       = Last Nothing
+        , _maskRef          = Last Nothing
+        , _clipPathRef      = Last Nothing
+        , _clipRule         = Last Nothing
+
+        , _markerStart      = Last Nothing
+        , _markerMid        = Last Nothing
+        , _markerEnd        = Last Nothing
+        }
+
+    mappend a b = DrawAttributes
+        { _strokeWidth = (mappend `on` _strokeWidth) a b
+        , _strokeColor =  (mappend `on` _strokeColor) a b
+        , _strokeLineCap = (mappend `on` _strokeLineCap) a b
+        , _strokeOpacity = (opacityMappend `on` _strokeOpacity) a b
+        , _strokeLineJoin = (mappend `on` _strokeLineJoin) a b
+        , _strokeMiterLimit = (mappend `on` _strokeMiterLimit) a b
+        , _fillColor =  (mappend `on` _fillColor) a b
+        , _fillOpacity = (opacityMappend `on` _fillOpacity) a b
+        , _fontSize = (mappend `on` _fontSize) a b
+        , _transform = (mayMerge `on` _transform) a b
+        , _fillRule = (mappend `on` _fillRule) a b
+        , _attrClass = _attrClass b
+        , _attrId = _attrId b
+        , _groupOpacity = _groupOpacity b
+        , _strokeOffset = (mappend `on` _strokeOffset) a b
+        , _strokeDashArray = (mappend `on` _strokeDashArray) a b
+        , _fontFamily = (mappend `on` _fontFamily) a b
+        , _fontStyle = (mappend `on` _fontStyle) a b
+        , _textAnchor = (mappend `on` _textAnchor) a b
+        , _maskRef = (mappend `on` _maskRef) a b
+        , _clipPathRef = (mappend `on` _clipPathRef) a b
+        , _clipRule = (mappend `on` _clipRule) a b
+        , _markerStart = (mappend `on` _markerStart) a b
+        , _markerMid = (mappend `on` _markerMid) a b
+        , _markerEnd = (mappend `on` _markerEnd) a b
+        }
+      where
+        opacityMappend Nothing Nothing = Nothing
+        opacityMappend (Just v) Nothing = Just v
+        opacityMappend Nothing (Just v) = Just v
+        opacityMappend (Just v) (Just v2) = Just $ v * v2
+
+instance WithDefaultSvg DrawAttributes where
+  defaultSvg = mempty
+
+instance CssMatcheable Tree where
+  cssAttribOf _ _ = Nothing
+  cssClassOf = view (drawAttr . attrClass)
+  cssIdOf = fmap T.pack . view (drawAttr . attrId)
+  cssNameOf = nameOfTree
+
+--------------------------------------------------------------------------
+--- Dumped
+--------------------------------------------------------------------------
+-- makeClassy ''PreserveAspectRatio 
+--
+-- | Lenses for the PreserveAspectRatio type
+class HasPreserveAspectRatio a where
+  preserveAspectRatio :: Lens' a PreserveAspectRatio
+  aspectRatioAlign :: Lens' a Alignment
+  {-# INLINE aspectRatioAlign #-}
+  aspectRatioAlign = preserveAspectRatio . aspectRatioAlign
+
+  aspectRatioDefer :: Lens' a Bool
+  {-# INLINE aspectRatioDefer #-}
+  aspectRatioDefer = preserveAspectRatio . aspectRatioDefer
+
+  aspectRatioMeetSlice :: Lens' a (Maybe MeetSlice)
+  {-# INLINE aspectRatioMeetSlice #-}
+  aspectRatioMeetSlice = preserveAspectRatio . aspectRatioMeetSlice
+
+instance HasPreserveAspectRatio PreserveAspectRatio where
+  preserveAspectRatio = id
+  {-# INLINE aspectRatioAlign #-}
+  aspectRatioAlign f attr =
+    fmap (\y -> attr { _aspectRatioAlign = y }) (f $ _aspectRatioAlign attr)
+
+  {-# INLINE aspectRatioDefer #-}
+  aspectRatioDefer f attr =
+    fmap (\y -> attr { _aspectRatioDefer = y }) (f $ _aspectRatioDefer attr)
+
+  {-# INLINE aspectRatioMeetSlice #-}
+  aspectRatioMeetSlice f attr =
+    fmap (\y -> attr { _aspectRatioMeetSlice = y }) (f $ _aspectRatioMeetSlice attr)
+
+-- makeClassy ''DrawAttributes
+-- | Lenses for the DrawAttributes type.
+class HasDrawAttributes a where
+  drawAttributes :: Lens' a DrawAttributes
+  attrClass :: Lens' a [T.Text]
+  {-# INLINE attrClass #-}
+  attrClass = drawAttributes . attrClass
+
+  attrId :: Lens' a (Maybe String)
+  {-# INLINE attrId #-}
+  attrId = drawAttributes . attrId
+
+  clipPathRef :: Lens' a (Last ElementRef)
+  {-# INLINE clipPathRef #-}
+  clipPathRef = drawAttributes . clipPathRef
+
+  clipRule :: Lens' a (Last FillRule)
+  {-# INLINE clipRule #-}
+  clipRule = drawAttributes . clipRule
+
+  fillColor :: Lens' a (Last Texture)
+  {-# INLINE fillColor #-}
+  fillColor = drawAttributes . fillColor
+
+  fillOpacity :: Lens' a (Maybe Float)
+  {-# INLINE fillOpacity #-}
+  fillOpacity = drawAttributes . fillOpacity
+
+  fillRule :: Lens' a (Last FillRule)
+  {-# INLINE fillRule #-}
+  fillRule = drawAttributes . fillRule
+
+  fontFamily :: Lens' a (Last [String])
+  {-# INLINE fontFamily #-}
+  fontFamily = drawAttributes . fontFamily
+
+  fontSize :: Lens' a (Last Number)
+  {-# INLINE fontSize #-}
+  fontSize = drawAttributes . fontSize
+
+  fontStyle :: Lens' a (Last FontStyle)
+  {-# INLINE fontStyle #-}
+  fontStyle = drawAttributes . fontStyle
+
+  groupOpacity :: Lens' a (Maybe Float)
+  {-# INLINE groupOpacity #-}
+  groupOpacity = drawAttributes . groupOpacity
+
+  markerEnd :: Lens' a (Last ElementRef)
+  {-# INLINE markerEnd #-}
+  markerEnd = drawAttributes . markerEnd
+
+  markerMid :: Lens' a (Last ElementRef)
+  {-# INLINE markerMid #-}
+  markerMid = drawAttributes . markerMid
+
+  markerStart :: Lens' a (Last ElementRef)
+  {-# INLINE markerStart #-}
+  markerStart = drawAttributes . markerStart
+
+  maskRef :: Lens' a (Last ElementRef)
+  {-# INLINE maskRef #-}
+  maskRef = drawAttributes . maskRef
+
+  strokeColor :: Lens' a (Last Texture)
+  {-# INLINE strokeColor #-}
+  strokeColor = drawAttributes . strokeColor
+
+  strokeDashArray :: Lens' a (Last [Number])
+  {-# INLINE strokeDashArray #-}
+  strokeDashArray = drawAttributes . strokeDashArray
+
+  strokeLineCap :: Lens' a (Last Cap)
+  {-# INLINE strokeLineCap #-}
+  strokeLineCap = drawAttributes . strokeLineCap
+
+  strokeLineJoin :: Lens' a (Last LineJoin)
+  {-# INLINE strokeLineJoin #-}
+  strokeLineJoin = drawAttributes . strokeLineJoin
+
+  strokeMiterLimit :: Lens' a (Last Double)
+  {-# INLINE strokeMiterLimit #-}
+  strokeMiterLimit = drawAttributes . strokeMiterLimit
+
+  strokeOffset :: Lens' a (Last Number)
+  {-# INLINE strokeOffset #-}
+  strokeOffset = drawAttributes . strokeOffset
+
+  strokeOpacity :: Lens' a (Maybe Float)
+  {-# INLINE strokeOpacity #-}
+  strokeOpacity = drawAttributes . strokeOpacity
+
+  strokeWidth :: Lens' a (Last Number)
+  {-# INLINE strokeWidth #-}
+  strokeWidth = drawAttributes . strokeWidth
+
+  textAnchor :: Lens' a (Last TextAnchor)
+  {-# INLINE textAnchor #-}
+  textAnchor = drawAttributes . textAnchor
+
+  transform :: Lens' a (Maybe [Transformation])
+  {-# INLINE transform #-}
+  transform = drawAttributes . transform
+
+instance HasDrawAttributes DrawAttributes where
+  {-# INLINE attrId #-}
+  {-# INLINE clipPathRef #-}
+  {-# INLINE clipRule #-}
+  {-# INLINE fillColor #-}
+  {-# INLINE fillOpacity #-}
+  {-# INLINE fillRule #-}
+  {-# INLINE fontFamily #-}
+  {-# INLINE fontSize #-}
+  {-# INLINE fontStyle #-}
+  {-# INLINE groupOpacity #-}
+  {-# INLINE markerEnd #-}
+  {-# INLINE markerMid #-}
+  {-# INLINE markerStart #-}
+  {-# INLINE maskRef #-}
+  {-# INLINE strokeColor #-}
+  {-# INLINE strokeDashArray #-}
+  {-# INLINE strokeLineCap #-}
+  {-# INLINE strokeLineJoin #-}
+  {-# INLINE strokeMiterLimit #-}
+  {-# INLINE strokeOffset #-}
+  {-# INLINE strokeOpacity #-}
+  {-# INLINE strokeWidth #-}
+  {-# INLINE textAnchor #-}
+  {-# INLINE transform #-}
+  drawAttributes = id
+
+  {-# INLINE attrClass #-}
+  attrClass f attr =
+    fmap (\y -> attr { _attrClass = y }) (f (_attrClass attr))
+  attrId f attr =
+    fmap (\y -> attr { _attrId = y }) (f $ _attrId attr)
+  clipPathRef f attr =
+    fmap (\y -> attr { _clipPathRef = y }) (f $ _clipPathRef attr)
+  clipRule f attr =
+    fmap (\y -> attr { _clipRule = y }) (f $ _clipRule attr)
+  fillColor f attr =
+    fmap (\y -> attr { _fillColor = y }) (f $ _fillColor attr)
+  fillOpacity f attr =
+    fmap (\y -> attr { _fillOpacity = y }) (f $ _fillOpacity attr)
+  fillRule f attr =
+    fmap (\y -> attr { _fillRule = y }) (f $ _fillRule attr)
+  fontFamily f attr =
+    fmap (\y -> attr { _fontFamily = y }) (f $ _fontFamily attr)
+  fontSize f attr =
+    fmap (\y -> attr { _fontSize = y }) (f $ _fontSize attr)
+  fontStyle f attr =
+    fmap (\y -> attr { _fontStyle = y }) (f $ _fontStyle attr)
+  groupOpacity f attr =
+    fmap (\y -> attr { _groupOpacity = y }) (f $ _groupOpacity attr)
+  markerEnd f attr =
+    fmap (\y -> attr { _markerEnd = y }) (f $ _markerEnd attr)
+  markerMid f attr =
+    fmap (\y -> attr { _markerMid = y }) (f $ _markerMid attr)
+  markerStart f attr =
+    fmap (\y -> attr { _markerStart = y }) (f $ _markerStart attr)
+  maskRef f attr =
+    fmap (\y -> attr { _maskRef = y }) (f $ _maskRef attr)
+  strokeColor f attr =
+    fmap (\y -> attr { _strokeColor = y }) (f $ _strokeColor attr)
+  strokeDashArray f attr =
+    fmap (\y -> attr { _strokeDashArray = y }) (f $ _strokeDashArray attr)
+  strokeLineCap f attr =
+    fmap (\y -> attr { _strokeLineCap = y }) (f $ _strokeLineCap attr)
+  strokeLineJoin f attr =
+    fmap (\y -> attr { _strokeLineJoin = y }) (f $ _strokeLineJoin attr)
+  strokeMiterLimit f attr =
+    fmap (\y -> attr { _strokeMiterLimit = y }) (f $ _strokeMiterLimit attr)
+  strokeOffset f attr =
+    fmap (\y -> attr { _strokeOffset = y }) (f $ _strokeOffset attr)
+  strokeOpacity f attr =
+    fmap (\y -> attr { _strokeOpacity = y }) (f $ _strokeOpacity attr)
+  strokeWidth f attr =
+    fmap (\y -> attr { _strokeWidth = y }) (f $ _strokeWidth attr)
+  textAnchor f attr =
+    fmap (\y -> attr { _textAnchor = y }) (f $ _textAnchor attr)
+  transform f attr =
+    fmap (\y -> attr { _transform = y }) (f $ _transform attr)
 
svg-tree.cabal view
@@ -1,5 +1,5 @@ name:                svg-tree
-version:             0.6.2
+version:             0.6.2.1
 synopsis:            SVG file loader and serializer
 description:
   svg-tree provides types representing a SVG document,
@@ -29,7 +29,7 @@ Source-Repository this
     Type:      git
     Location:  git://github.com/Twinside/svg-tree.git
-    Tag:       v0.6.2
+    Tag:       v0.6.2.1
 
 library
   hs-source-dirs: src