reanimate-svg 0.12.2.1 → 0.12.2.2
raw patch · 11 files changed
+428/−384 lines, 11 filesdep +typed-processdep ~lensPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: typed-process
Dependency ranges changed: lens
API changes (from Hackage documentation)
- Graphics.SvgTree.Types: data MeshGradientPatch
- Graphics.SvgTree.Types: data MeshGradientRow
+ Graphics.SvgTree.Types: newtype MeshGradientPatch
+ Graphics.SvgTree.Types: newtype MeshGradientRow
- Graphics.SvgTree: parseSvgFile :: FilePath -> ByteString -> Maybe Document
+ Graphics.SvgTree: parseSvgFile :: FilePath -> Text -> Maybe Document
- Graphics.SvgTree.Types: Blend :: !DrawAttributes -> !FilterAttributes -> !Last FilterSource -> !Last FilterSource -> !BlendMode -> Blend
+ Graphics.SvgTree.Types: Blend :: !DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> !Maybe FilterSource -> !BlendMode -> Blend
- Graphics.SvgTree.Types: ColorMatrix :: !DrawAttributes -> !FilterAttributes -> !Last FilterSource -> !ColorMatrixType -> !String -> ColorMatrix
+ Graphics.SvgTree.Types: ColorMatrix :: !DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> !ColorMatrixType -> !String -> ColorMatrix
- Graphics.SvgTree.Types: ComponentTransfer :: !DrawAttributes -> !FilterAttributes -> ![FilterElement] -> !Last FilterSource -> ComponentTransfer
+ Graphics.SvgTree.Types: ComponentTransfer :: !DrawAttributes -> !FilterAttributes -> ![FilterElement] -> !Maybe FilterSource -> ComponentTransfer
- Graphics.SvgTree.Types: Composite :: DrawAttributes -> !FilterAttributes -> Last FilterSource -> Last FilterSource -> CompositeOperator -> Number -> Number -> Number -> Number -> Composite
+ Graphics.SvgTree.Types: Composite :: DrawAttributes -> !FilterAttributes -> Maybe FilterSource -> Maybe FilterSource -> CompositeOperator -> Number -> Number -> Number -> Number -> Composite
- Graphics.SvgTree.Types: ConvolveMatrix :: DrawAttributes -> !FilterAttributes -> !Last FilterSource -> NumberOptionalNumber -> [Double] -> Double -> Double -> Int -> Int -> EdgeMode -> NumberOptionalNumber -> Bool -> ConvolveMatrix
+ Graphics.SvgTree.Types: ConvolveMatrix :: DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> NumberOptionalNumber -> [Double] -> Double -> Double -> Int -> Int -> EdgeMode -> NumberOptionalNumber -> Bool -> ConvolveMatrix
- Graphics.SvgTree.Types: DisplacementMap :: !DrawAttributes -> !FilterAttributes -> !Last FilterSource -> !Last FilterSource -> !Last Double -> ChannelSelector -> ChannelSelector -> DisplacementMap
+ Graphics.SvgTree.Types: DisplacementMap :: !DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> !Maybe FilterSource -> !Maybe Double -> ChannelSelector -> ChannelSelector -> DisplacementMap
- Graphics.SvgTree.Types: DrawAttributes :: !Last Number -> !Last Texture -> !Maybe Float -> !Last Cap -> !Last LineJoin -> !Last Double -> !Last Texture -> !Maybe Float -> !Maybe Float -> !Maybe [Transformation] -> !Last FillRule -> !Last ElementRef -> !Last ElementRef -> !Last FillRule -> ![Text] -> !Maybe String -> !Last Number -> !Last [Number] -> !Last Number -> !Last [String] -> !Last FontStyle -> !Last TextAnchor -> !Last ElementRef -> !Last ElementRef -> !Last ElementRef -> !Last ElementRef -> DrawAttributes
+ Graphics.SvgTree.Types: DrawAttributes :: !Maybe Number -> !Maybe Texture -> !Maybe Float -> !Maybe Cap -> !Maybe LineJoin -> !Maybe Double -> !Maybe Texture -> !Maybe Float -> !Maybe Float -> !Maybe [Transformation] -> !Maybe FillRule -> !Maybe ElementRef -> !Maybe ElementRef -> !Maybe FillRule -> ![Text] -> !Maybe String -> !Maybe Number -> !Maybe [Number] -> !Maybe Number -> !Maybe [String] -> !Maybe FontStyle -> !Maybe TextAnchor -> !Maybe ElementRef -> !Maybe ElementRef -> !Maybe ElementRef -> !Maybe ElementRef -> DrawAttributes
- Graphics.SvgTree.Types: FilterAttributes :: !Last Number -> !Maybe String -> !Last Number -> !Last Number -> !Last Number -> FilterAttributes
+ Graphics.SvgTree.Types: FilterAttributes :: !Maybe Number -> !Maybe String -> !Maybe Number -> !Maybe Number -> !Maybe Number -> FilterAttributes
- Graphics.SvgTree.Types: GaussianBlur :: DrawAttributes -> !FilterAttributes -> Last FilterSource -> Number -> Last Number -> EdgeMode -> GaussianBlur
+ Graphics.SvgTree.Types: GaussianBlur :: DrawAttributes -> !FilterAttributes -> Maybe FilterSource -> Number -> Maybe Number -> EdgeMode -> GaussianBlur
- Graphics.SvgTree.Types: MergeNode :: !DrawAttributes -> !Last FilterSource -> MergeNode
+ Graphics.SvgTree.Types: MergeNode :: !DrawAttributes -> !Maybe FilterSource -> MergeNode
- Graphics.SvgTree.Types: MeshGradientPatch :: ![GradientStop] -> MeshGradientPatch
+ Graphics.SvgTree.Types: MeshGradientPatch :: [GradientStop] -> MeshGradientPatch
- Graphics.SvgTree.Types: MeshGradientRow :: ![MeshGradientPatch] -> MeshGradientRow
+ Graphics.SvgTree.Types: MeshGradientRow :: [MeshGradientPatch] -> MeshGradientRow
- Graphics.SvgTree.Types: Morphology :: DrawAttributes -> !FilterAttributes -> !Last FilterSource -> OperatorType -> NumberOptionalNumber -> Morphology
+ Graphics.SvgTree.Types: Morphology :: DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> OperatorType -> NumberOptionalNumber -> Morphology
- Graphics.SvgTree.Types: Offset :: !DrawAttributes -> !FilterAttributes -> !Last FilterSource -> !Number -> !Number -> Offset
+ Graphics.SvgTree.Types: Offset :: !DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> !Number -> !Number -> Offset
- Graphics.SvgTree.Types: SpecularLighting :: DrawAttributes -> !FilterAttributes -> !Last FilterSource -> Double -> Double -> Double -> NumberOptionalNumber -> SpecularLighting
+ Graphics.SvgTree.Types: SpecularLighting :: DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> Double -> Double -> Double -> NumberOptionalNumber -> SpecularLighting
- Graphics.SvgTree.Types: Tile :: !DrawAttributes -> !FilterAttributes -> !Last FilterSource -> Tile
+ Graphics.SvgTree.Types: Tile :: !DrawAttributes -> !FilterAttributes -> !Maybe FilterSource -> Tile
- Graphics.SvgTree.Types: Turbulence :: !DrawAttributes -> !FilterAttributes -> !(Double, Last Double) -> Int -> Double -> StitchTiles -> TurbulenceType -> Turbulence
+ Graphics.SvgTree.Types: Turbulence :: !DrawAttributes -> !FilterAttributes -> !(Double, Maybe Double) -> Int -> Double -> StitchTiles -> TurbulenceType -> Turbulence
- Graphics.SvgTree.Types: [_blendIn2] :: Blend -> !Last FilterSource
+ Graphics.SvgTree.Types: [_blendIn2] :: Blend -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_blendIn] :: Blend -> !Last FilterSource
+ Graphics.SvgTree.Types: [_blendIn] :: Blend -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_clipPathRef] :: DrawAttributes -> !Last ElementRef
+ Graphics.SvgTree.Types: [_clipPathRef] :: DrawAttributes -> !Maybe ElementRef
- Graphics.SvgTree.Types: [_clipRule] :: DrawAttributes -> !Last FillRule
+ Graphics.SvgTree.Types: [_clipRule] :: DrawAttributes -> !Maybe FillRule
- Graphics.SvgTree.Types: [_colorMatrixIn] :: ColorMatrix -> !Last FilterSource
+ Graphics.SvgTree.Types: [_colorMatrixIn] :: ColorMatrix -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_compTransferIn] :: ComponentTransfer -> !Last FilterSource
+ Graphics.SvgTree.Types: [_compTransferIn] :: ComponentTransfer -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_compositeIn2] :: Composite -> Last FilterSource
+ Graphics.SvgTree.Types: [_compositeIn2] :: Composite -> Maybe FilterSource
- Graphics.SvgTree.Types: [_compositeIn] :: Composite -> Last FilterSource
+ Graphics.SvgTree.Types: [_compositeIn] :: Composite -> Maybe FilterSource
- Graphics.SvgTree.Types: [_convolveMatrixIn] :: ConvolveMatrix -> !Last FilterSource
+ Graphics.SvgTree.Types: [_convolveMatrixIn] :: ConvolveMatrix -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_displacementMapIn2] :: DisplacementMap -> !Last FilterSource
+ Graphics.SvgTree.Types: [_displacementMapIn2] :: DisplacementMap -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_displacementMapIn] :: DisplacementMap -> !Last FilterSource
+ Graphics.SvgTree.Types: [_displacementMapIn] :: DisplacementMap -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_displacementMapScale] :: DisplacementMap -> !Last Double
+ Graphics.SvgTree.Types: [_displacementMapScale] :: DisplacementMap -> !Maybe Double
- Graphics.SvgTree.Types: [_fillColor] :: DrawAttributes -> !Last Texture
+ Graphics.SvgTree.Types: [_fillColor] :: DrawAttributes -> !Maybe Texture
- Graphics.SvgTree.Types: [_fillRule] :: DrawAttributes -> !Last FillRule
+ Graphics.SvgTree.Types: [_fillRule] :: DrawAttributes -> !Maybe FillRule
- Graphics.SvgTree.Types: [_filterHeight] :: FilterAttributes -> !Last Number
+ Graphics.SvgTree.Types: [_filterHeight] :: FilterAttributes -> !Maybe Number
- Graphics.SvgTree.Types: [_filterRef] :: DrawAttributes -> !Last ElementRef
+ Graphics.SvgTree.Types: [_filterRef] :: DrawAttributes -> !Maybe ElementRef
- Graphics.SvgTree.Types: [_filterWidth] :: FilterAttributes -> !Last Number
+ Graphics.SvgTree.Types: [_filterWidth] :: FilterAttributes -> !Maybe Number
- Graphics.SvgTree.Types: [_filterX] :: FilterAttributes -> !Last Number
+ Graphics.SvgTree.Types: [_filterX] :: FilterAttributes -> !Maybe Number
- Graphics.SvgTree.Types: [_filterY] :: FilterAttributes -> !Last Number
+ Graphics.SvgTree.Types: [_filterY] :: FilterAttributes -> !Maybe Number
- Graphics.SvgTree.Types: [_fontFamily] :: DrawAttributes -> !Last [String]
+ Graphics.SvgTree.Types: [_fontFamily] :: DrawAttributes -> !Maybe [String]
- Graphics.SvgTree.Types: [_fontSize] :: DrawAttributes -> !Last Number
+ Graphics.SvgTree.Types: [_fontSize] :: DrawAttributes -> !Maybe Number
- Graphics.SvgTree.Types: [_fontStyle] :: DrawAttributes -> !Last FontStyle
+ Graphics.SvgTree.Types: [_fontStyle] :: DrawAttributes -> !Maybe FontStyle
- Graphics.SvgTree.Types: [_gaussianBlurIn] :: GaussianBlur -> Last FilterSource
+ Graphics.SvgTree.Types: [_gaussianBlurIn] :: GaussianBlur -> Maybe FilterSource
- Graphics.SvgTree.Types: [_gaussianBlurStdDeviationY] :: GaussianBlur -> Last Number
+ Graphics.SvgTree.Types: [_gaussianBlurStdDeviationY] :: GaussianBlur -> Maybe Number
- Graphics.SvgTree.Types: [_markerEnd] :: DrawAttributes -> !Last ElementRef
+ Graphics.SvgTree.Types: [_markerEnd] :: DrawAttributes -> !Maybe ElementRef
- Graphics.SvgTree.Types: [_markerMid] :: DrawAttributes -> !Last ElementRef
+ Graphics.SvgTree.Types: [_markerMid] :: DrawAttributes -> !Maybe ElementRef
- Graphics.SvgTree.Types: [_markerStart] :: DrawAttributes -> !Last ElementRef
+ Graphics.SvgTree.Types: [_markerStart] :: DrawAttributes -> !Maybe ElementRef
- Graphics.SvgTree.Types: [_maskRef] :: DrawAttributes -> !Last ElementRef
+ Graphics.SvgTree.Types: [_maskRef] :: DrawAttributes -> !Maybe ElementRef
- Graphics.SvgTree.Types: [_mergeNodeIn] :: MergeNode -> !Last FilterSource
+ Graphics.SvgTree.Types: [_mergeNodeIn] :: MergeNode -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_meshGradientPatchStops] :: MeshGradientPatch -> ![GradientStop]
+ Graphics.SvgTree.Types: [_meshGradientPatchStops] :: MeshGradientPatch -> [GradientStop]
- Graphics.SvgTree.Types: [_meshGradientRowPatches] :: MeshGradientRow -> ![MeshGradientPatch]
+ Graphics.SvgTree.Types: [_meshGradientRowPatches] :: MeshGradientRow -> [MeshGradientPatch]
- Graphics.SvgTree.Types: [_morphologyIn] :: Morphology -> !Last FilterSource
+ Graphics.SvgTree.Types: [_morphologyIn] :: Morphology -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_offsetIn] :: Offset -> !Last FilterSource
+ Graphics.SvgTree.Types: [_offsetIn] :: Offset -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_specLightingIn] :: SpecularLighting -> !Last FilterSource
+ Graphics.SvgTree.Types: [_specLightingIn] :: SpecularLighting -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_strokeColor] :: DrawAttributes -> !Last Texture
+ Graphics.SvgTree.Types: [_strokeColor] :: DrawAttributes -> !Maybe Texture
- Graphics.SvgTree.Types: [_strokeDashArray] :: DrawAttributes -> !Last [Number]
+ Graphics.SvgTree.Types: [_strokeDashArray] :: DrawAttributes -> !Maybe [Number]
- Graphics.SvgTree.Types: [_strokeLineCap] :: DrawAttributes -> !Last Cap
+ Graphics.SvgTree.Types: [_strokeLineCap] :: DrawAttributes -> !Maybe Cap
- Graphics.SvgTree.Types: [_strokeLineJoin] :: DrawAttributes -> !Last LineJoin
+ Graphics.SvgTree.Types: [_strokeLineJoin] :: DrawAttributes -> !Maybe LineJoin
- Graphics.SvgTree.Types: [_strokeMiterLimit] :: DrawAttributes -> !Last Double
+ Graphics.SvgTree.Types: [_strokeMiterLimit] :: DrawAttributes -> !Maybe Double
- Graphics.SvgTree.Types: [_strokeOffset] :: DrawAttributes -> !Last Number
+ Graphics.SvgTree.Types: [_strokeOffset] :: DrawAttributes -> !Maybe Number
- Graphics.SvgTree.Types: [_strokeWidth] :: DrawAttributes -> !Last Number
+ Graphics.SvgTree.Types: [_strokeWidth] :: DrawAttributes -> !Maybe Number
- Graphics.SvgTree.Types: [_textAnchor] :: DrawAttributes -> !Last TextAnchor
+ Graphics.SvgTree.Types: [_textAnchor] :: DrawAttributes -> !Maybe TextAnchor
- Graphics.SvgTree.Types: [_tileIn] :: Tile -> !Last FilterSource
+ Graphics.SvgTree.Types: [_tileIn] :: Tile -> !Maybe FilterSource
- Graphics.SvgTree.Types: [_turbulenceBaseFrequency] :: Turbulence -> !(Double, Last Double)
+ Graphics.SvgTree.Types: [_turbulenceBaseFrequency] :: Turbulence -> !(Double, Maybe Double)
- Graphics.SvgTree.Types: attrClass :: HasDrawAttributes c_avvw => Lens' c_avvw [Text]
+ Graphics.SvgTree.Types: attrClass :: HasDrawAttributes c_anqN => Lens' c_anqN [Text]
- Graphics.SvgTree.Types: attrId :: HasDrawAttributes c_avvw => Lens' c_avvw (Maybe String)
+ Graphics.SvgTree.Types: attrId :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe String)
- Graphics.SvgTree.Types: blendIn :: Lens' Blend (Last FilterSource)
+ Graphics.SvgTree.Types: blendIn :: Lens' Blend (Maybe FilterSource)
- Graphics.SvgTree.Types: blendIn2 :: Lens' Blend (Last FilterSource)
+ Graphics.SvgTree.Types: blendIn2 :: Lens' Blend (Maybe FilterSource)
- Graphics.SvgTree.Types: class HasDrawAttributes c_avvw
+ Graphics.SvgTree.Types: class HasDrawAttributes c_anqN
- Graphics.SvgTree.Types: class HasFilterAttributes c_aGMB
+ Graphics.SvgTree.Types: class HasFilterAttributes c_axYc
- Graphics.SvgTree.Types: clipPathRef :: HasDrawAttributes c_avvw => Lens' c_avvw (Last ElementRef)
+ Graphics.SvgTree.Types: clipPathRef :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe ElementRef)
- Graphics.SvgTree.Types: clipRule :: HasDrawAttributes c_avvw => Lens' c_avvw (Last FillRule)
+ Graphics.SvgTree.Types: clipRule :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe FillRule)
- Graphics.SvgTree.Types: colorMatrixIn :: Lens' ColorMatrix (Last FilterSource)
+ Graphics.SvgTree.Types: colorMatrixIn :: Lens' ColorMatrix (Maybe FilterSource)
- Graphics.SvgTree.Types: compTransferIn :: Lens' ComponentTransfer (Last FilterSource)
+ Graphics.SvgTree.Types: compTransferIn :: Lens' ComponentTransfer (Maybe FilterSource)
- Graphics.SvgTree.Types: compositeIn :: Lens' Composite (Last FilterSource)
+ Graphics.SvgTree.Types: compositeIn :: Lens' Composite (Maybe FilterSource)
- Graphics.SvgTree.Types: compositeIn2 :: Lens' Composite (Last FilterSource)
+ Graphics.SvgTree.Types: compositeIn2 :: Lens' Composite (Maybe FilterSource)
- Graphics.SvgTree.Types: convolveMatrixIn :: Lens' ConvolveMatrix (Last FilterSource)
+ Graphics.SvgTree.Types: convolveMatrixIn :: Lens' ConvolveMatrix (Maybe FilterSource)
- Graphics.SvgTree.Types: diffuseLightingIn :: Lens' DiffuseLighting (Last FilterSource)
+ Graphics.SvgTree.Types: diffuseLightingIn :: Lens' DiffuseLighting (Maybe FilterSource)
- Graphics.SvgTree.Types: displacementMapIn :: Lens' DisplacementMap (Last FilterSource)
+ Graphics.SvgTree.Types: displacementMapIn :: Lens' DisplacementMap (Maybe FilterSource)
- Graphics.SvgTree.Types: displacementMapIn2 :: Lens' DisplacementMap (Last FilterSource)
+ Graphics.SvgTree.Types: displacementMapIn2 :: Lens' DisplacementMap (Maybe FilterSource)
- Graphics.SvgTree.Types: displacementMapScale :: Lens' DisplacementMap (Last Double)
+ Graphics.SvgTree.Types: displacementMapScale :: Lens' DisplacementMap (Maybe Double)
- Graphics.SvgTree.Types: drawAttributes :: HasDrawAttributes c_avvw => Lens' c_avvw DrawAttributes
+ Graphics.SvgTree.Types: drawAttributes :: HasDrawAttributes c_anqN => Lens' c_anqN DrawAttributes
- Graphics.SvgTree.Types: fillColor :: HasDrawAttributes c_avvw => Lens' c_avvw (Last Texture)
+ Graphics.SvgTree.Types: fillColor :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Texture)
- Graphics.SvgTree.Types: fillOpacity :: HasDrawAttributes c_avvw => Lens' c_avvw (Maybe Float)
+ Graphics.SvgTree.Types: fillOpacity :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Float)
- Graphics.SvgTree.Types: fillRule :: HasDrawAttributes c_avvw => Lens' c_avvw (Last FillRule)
+ Graphics.SvgTree.Types: fillRule :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe FillRule)
- Graphics.SvgTree.Types: filterAttributes :: HasFilterAttributes c_aGMB => Lens' c_aGMB FilterAttributes
+ Graphics.SvgTree.Types: filterAttributes :: HasFilterAttributes c_axYc => Lens' c_axYc FilterAttributes
- Graphics.SvgTree.Types: filterHeight :: HasFilterAttributes c_aGMB => Lens' c_aGMB (Last Number)
+ Graphics.SvgTree.Types: filterHeight :: HasFilterAttributes c_axYc => Lens' c_axYc (Maybe Number)
- Graphics.SvgTree.Types: filterRef :: HasDrawAttributes c_avvw => Lens' c_avvw (Last ElementRef)
+ Graphics.SvgTree.Types: filterRef :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe ElementRef)
- Graphics.SvgTree.Types: filterResult :: HasFilterAttributes c_aGMB => Lens' c_aGMB (Maybe String)
+ Graphics.SvgTree.Types: filterResult :: HasFilterAttributes c_axYc => Lens' c_axYc (Maybe String)
- Graphics.SvgTree.Types: filterWidth :: HasFilterAttributes c_aGMB => Lens' c_aGMB (Last Number)
+ Graphics.SvgTree.Types: filterWidth :: HasFilterAttributes c_axYc => Lens' c_axYc (Maybe Number)
- Graphics.SvgTree.Types: filterX :: HasFilterAttributes c_aGMB => Lens' c_aGMB (Last Number)
+ Graphics.SvgTree.Types: filterX :: HasFilterAttributes c_axYc => Lens' c_axYc (Maybe Number)
- Graphics.SvgTree.Types: filterY :: HasFilterAttributes c_aGMB => Lens' c_aGMB (Last Number)
+ Graphics.SvgTree.Types: filterY :: HasFilterAttributes c_axYc => Lens' c_axYc (Maybe Number)
- Graphics.SvgTree.Types: fontFamily :: HasDrawAttributes c_avvw => Lens' c_avvw (Last [String])
+ Graphics.SvgTree.Types: fontFamily :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe [String])
- Graphics.SvgTree.Types: fontSize :: HasDrawAttributes c_avvw => Lens' c_avvw (Last Number)
+ Graphics.SvgTree.Types: fontSize :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Number)
- Graphics.SvgTree.Types: fontStyle :: HasDrawAttributes c_avvw => Lens' c_avvw (Last FontStyle)
+ Graphics.SvgTree.Types: fontStyle :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe FontStyle)
- Graphics.SvgTree.Types: gaussianBlurIn :: Lens' GaussianBlur (Last FilterSource)
+ Graphics.SvgTree.Types: gaussianBlurIn :: Lens' GaussianBlur (Maybe FilterSource)
- Graphics.SvgTree.Types: gaussianBlurStdDeviationY :: Lens' GaussianBlur (Last Number)
+ Graphics.SvgTree.Types: gaussianBlurStdDeviationY :: Lens' GaussianBlur (Maybe Number)
- Graphics.SvgTree.Types: groupOpacity :: HasDrawAttributes c_avvw => Lens' c_avvw (Maybe Float)
+ Graphics.SvgTree.Types: groupOpacity :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Float)
- Graphics.SvgTree.Types: markerEnd :: HasDrawAttributes c_avvw => Lens' c_avvw (Last ElementRef)
+ Graphics.SvgTree.Types: markerEnd :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe ElementRef)
- Graphics.SvgTree.Types: markerMid :: HasDrawAttributes c_avvw => Lens' c_avvw (Last ElementRef)
+ Graphics.SvgTree.Types: markerMid :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe ElementRef)
- Graphics.SvgTree.Types: markerStart :: HasDrawAttributes c_avvw => Lens' c_avvw (Last ElementRef)
+ Graphics.SvgTree.Types: markerStart :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe ElementRef)
- Graphics.SvgTree.Types: maskRef :: HasDrawAttributes c_avvw => Lens' c_avvw (Last ElementRef)
+ Graphics.SvgTree.Types: maskRef :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe ElementRef)
- Graphics.SvgTree.Types: mergeNodeIn :: Lens' MergeNode (Last FilterSource)
+ Graphics.SvgTree.Types: mergeNodeIn :: Lens' MergeNode (Maybe FilterSource)
- Graphics.SvgTree.Types: morphologyIn :: Lens' Morphology (Last FilterSource)
+ Graphics.SvgTree.Types: morphologyIn :: Lens' Morphology (Maybe FilterSource)
- Graphics.SvgTree.Types: offsetIn :: Lens' Offset (Last FilterSource)
+ Graphics.SvgTree.Types: offsetIn :: Lens' Offset (Maybe FilterSource)
- Graphics.SvgTree.Types: specLightingIn :: Lens' SpecularLighting (Last FilterSource)
+ Graphics.SvgTree.Types: specLightingIn :: Lens' SpecularLighting (Maybe FilterSource)
- Graphics.SvgTree.Types: strokeColor :: HasDrawAttributes c_avvw => Lens' c_avvw (Last Texture)
+ Graphics.SvgTree.Types: strokeColor :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Texture)
- Graphics.SvgTree.Types: strokeDashArray :: HasDrawAttributes c_avvw => Lens' c_avvw (Last [Number])
+ Graphics.SvgTree.Types: strokeDashArray :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe [Number])
- Graphics.SvgTree.Types: strokeLineCap :: HasDrawAttributes c_avvw => Lens' c_avvw (Last Cap)
+ Graphics.SvgTree.Types: strokeLineCap :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Cap)
- Graphics.SvgTree.Types: strokeLineJoin :: HasDrawAttributes c_avvw => Lens' c_avvw (Last LineJoin)
+ Graphics.SvgTree.Types: strokeLineJoin :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe LineJoin)
- Graphics.SvgTree.Types: strokeMiterLimit :: HasDrawAttributes c_avvw => Lens' c_avvw (Last Double)
+ Graphics.SvgTree.Types: strokeMiterLimit :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Double)
- Graphics.SvgTree.Types: strokeOffset :: HasDrawAttributes c_avvw => Lens' c_avvw (Last Number)
+ Graphics.SvgTree.Types: strokeOffset :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Number)
- Graphics.SvgTree.Types: strokeOpacity :: HasDrawAttributes c_avvw => Lens' c_avvw (Maybe Float)
+ Graphics.SvgTree.Types: strokeOpacity :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Float)
- Graphics.SvgTree.Types: strokeWidth :: HasDrawAttributes c_avvw => Lens' c_avvw (Last Number)
+ Graphics.SvgTree.Types: strokeWidth :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe Number)
- Graphics.SvgTree.Types: textAnchor :: HasDrawAttributes c_avvw => Lens' c_avvw (Last TextAnchor)
+ Graphics.SvgTree.Types: textAnchor :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe TextAnchor)
- Graphics.SvgTree.Types: tileIn :: Lens' Tile (Last FilterSource)
+ Graphics.SvgTree.Types: tileIn :: Lens' Tile (Maybe FilterSource)
- Graphics.SvgTree.Types: transform :: HasDrawAttributes c_avvw => Lens' c_avvw (Maybe [Transformation])
+ Graphics.SvgTree.Types: transform :: HasDrawAttributes c_anqN => Lens' c_anqN (Maybe [Transformation])
- Graphics.SvgTree.Types: turbulenceBaseFrequency :: Lens' Turbulence (Double, Last Double)
+ Graphics.SvgTree.Types: turbulenceBaseFrequency :: Lens' Turbulence (Double, Maybe Double)
Files
- changelog.md +8/−0
- reanimate-svg.cabal +5/−4
- src/Graphics/SvgTree.hs +4/−4
- src/Graphics/SvgTree/CssTypes.hs +15/−15
- src/Graphics/SvgTree/PathParser.hs +6/−2
- src/Graphics/SvgTree/Types/Basic.hs +25/−25
- src/Graphics/SvgTree/Types/Fold.hs +2/−2
- src/Graphics/SvgTree/Types/Hashable.hs +1/−4
- src/Graphics/SvgTree/Types/Internal.hs +237/−241
- src/Graphics/SvgTree/XmlParser.hs +29/−34
- test/W3C.hs +96/−53
changelog.md view
@@ -1,5 +1,13 @@ -*-change-log-*- +v0.12.2.2++ * Update dependencies.++v0.12.0.0++ * Improve filter-element support.+ v0.11.0.0 * Drop support for GHC 7.
reanimate-svg.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: reanimate-svg-version: 0.12.2.1+version: 0.12.2.2 synopsis: SVG file loader and serializer description: reanimate-svg provides types representing a SVG document,@@ -15,6 +15,7 @@ license-file: LICENSE author: Vincent Berthoux, David Himmelstrup maintainer: David Himmelstrup <lemmih@gmail.com>+homepage: https://github.com/reanimate/reanimate-svg#readme -- copyright: category: Graphics, Svg build-type: Simple@@ -23,7 +24,7 @@ Source-Repository head Type: git- Location: git://github.com/lemmih/reanimate-svg.git+ Location: git://github.com/reanimate/reanimate-svg.git library hs-source-dirs: src@@ -60,7 +61,7 @@ , text >= 1.1 , transformers >= 0.3 && < 0.6 , mtl >= 2.1 && < 2.3- , lens >= 4.6 && < 5+ , lens >= 4.6 && < 6 , double-conversion >= 2.0.0.0 && < 3.0.0.0 , hashable >= 1.3.0.0 @@ -80,7 +81,7 @@ Diff, vector, linear, QuickCheck >= 2.1.0, text,- temporary,+ temporary, typed-process, tasty, tasty-golden, tasty-hunit, tasty-quickcheck, tasty-rerun >= 1.1.17, tasty-expected-failure
src/Graphics/SvgTree.hs view
@@ -22,9 +22,9 @@ where import Control.Lens-import qualified Data.ByteString as B import Data.List (foldl') import qualified Data.Text as T+import qualified Data.Text.IO as T import Graphics.SvgTree.CssParser (cssRulesOfText) import Graphics.SvgTree.CssTypes import Graphics.SvgTree.Types@@ -36,14 +36,14 @@ -- a SVG Document. loadSvgFile :: FilePath -> IO (Maybe Document) loadSvgFile filename =- parseSvgFile filename <$> B.readFile filename+ parseSvgFile filename <$> T.readFile filename -- | Parse an in-memory SVG file parseSvgFile :: -- | Source path/URL of the document, used -- to resolve relative links. FilePath ->- B.ByteString ->+ T.Text -> Maybe Document parseSvgFile filename fileContent = parseXMLDoc fileContent >>= unparseDocument filename@@ -54,7 +54,7 @@ Nothing -> error "Invalid XML" Just xml -> unparse xml --- | Save a svg Document on a file on disk.+-- | Save a svg Document to a file on disk. saveXmlFile :: FilePath -> Document -> IO () saveXmlFile filePath = writeFile filePath . ppcTopElement prettyConfigPP . xmlOfDocument
src/Graphics/SvgTree/CssTypes.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE OverloadedStrings #-}--- | Define the types used to describes CSS elements+-- | Defines the types used to describes CSS elements module Graphics.SvgTree.CssTypes ( CssSelector( .. ) , CssSelectorRule@@ -41,7 +41,7 @@ -- | Serialize an element to a text builder. tserialize :: a -> TB.Builder --- | Describe an element of a CSS selector. Multiple+-- | Describes an element of a CSS selector. Multiple -- elements can be combined in a CssSelector type. data CssDescriptor = OfClass T.Text -- ^ .IDENT@@ -64,10 +64,10 @@ ft = TB.fromText si = TB.singleton --- | Define complex selector.+-- | Defines complex selector. data CssSelector- = Nearby -- ^ Correspond to the `+` CSS selector.- | DirectChildren -- ^ Correspond to the `>` CSS selectro.+ = Nearby -- ^ Corresponds to the `+` CSS selector.+ | DirectChildren -- ^ Corresponds to the `>` CSS selectro. | AllOf [CssDescriptor] -- ^ Grouping construct, all the elements -- of the list must be matched. deriving (Eq, Show)@@ -81,13 +81,13 @@ si = TB.singleton -- | A CssSelectorRule is a list of all the elements--- that must be meet in a depth first search fashion.+-- that must be met in a depth first search fashion. type CssSelectorRule = [CssSelector] --- | Represent a CSS selector and the different declarations+-- | Represents a CSS selector and the different declarations -- to apply to the matched elemens. data CssRule = CssRule- { -- | At the first level represent a list of elements+ { -- | At the first level represents a list of elements -- to be matched. If any match is made, you can apply -- the declarations. At the second level cssRuleSelector :: ![CssSelectorRule]@@ -122,7 +122,7 @@ -- | Return a value of a given attribute if present cssAttribOf :: a -> T.Text -> Maybe T.Text --- | Represent a zipper in depth at the first list+-- | Represents a zipper in depth at the first list -- level, and the previous nodes at in the second -- list level. type CssContext a = [[a]]@@ -152,7 +152,7 @@ | otherwise = go upper selectors go (_:upper) selector = go upper selector --- | Given CSS rules, find all the declaration to apply to the+-- | Given CSS rules, find all the declarations to apply to the -- element in a given context. findMatchingDeclarations :: CssMatcheable a => [CssRule] -> CssContext a -> [CssDeclaration]@@ -162,7 +162,7 @@ , selector <- cssRuleSelector rule , isMatching context $ reverse selector ] --- | Represent the content to apply to some+-- | Represents the content to apply to some -- CSS matched rules. data CssDeclaration = CssDeclaration { -- | Property name to change (like font-family or color).@@ -181,7 +181,7 @@ si = TB.singleton --- | Encode complex number possibly dependant to the current+-- | Encode complex number possibly depending on the current -- render size. data Number = Num Double -- ^ Simple coordinate in current user coordinate.@@ -253,9 +253,9 @@ ft = TB.fromText si = TB.singleton --- | This function replace all device dependant units to user--- units given it's DPI configuration.--- Preserve percentage and "em" notation.+-- | This function replaces all device dependant units with user+-- units given its DPI configuration.+-- Preserves percentage and "em" notation. toUserUnit :: Dpi -> Number -> Number toUserUnit dpi = go where go nu = case nu of
src/Graphics/SvgTree/PathParser.hs view
@@ -39,6 +39,9 @@ shorthand = process' <$> (string "." *> many1 digit) process' = either (const 0) id . parseOnly doubleNumber . T.pack . (++) "0." +flag :: Parser Bool+flag = fmap (/='0') digit+ viewBoxParser :: Parser (Double, Double, Double, Double) viewBoxParser = (,,,) <$> iParse <*> iParse <*> iParse <*> iParse@@ -91,11 +94,12 @@ manyComma a = a `sepBy1` commaWsp numComma = num <* commaWsp+ flagComma = flag <* commaWsp ellipticalArgs = (,,,,,) <$> numComma <*> numComma <*> numComma- <*> fmap (/= 0) numComma- <*> fmap (/= 0) numComma+ <*> flagComma+ <*> flagComma <*> point unwordsS :: [ShowS] -> ShowS
src/Graphics/SvgTree/Types/Basic.hs view
@@ -12,8 +12,8 @@ -- | Basic coordinate type. type Coord = Double --- | Real Point, fully determined and not--- dependant of the rendering context.+-- | Real Point, fully determined and+-- independent of the rendering context. type RPoint = V2 Coord -- FIXME: Use 'V2 Number' instead of tuple@@ -21,7 +21,7 @@ type Point = (Number, Number) -- | Tell if a path command is absolute (in the current--- user coordiante) or relative to the previous poitn.+-- user coordiante) or relative to the previous point. data Origin = OriginAbsolute -- ^ Next point in absolute coordinate | OriginRelative -- ^ Next point relative to the previous@@ -33,35 +33,35 @@ | GradientBicubic deriving (Eq, Show, Generic) --- | Define the possible values of various *units attributes+-- | Defines 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, Generic) --- | This type represent the align information of the--- preserveAspectRatio SVGattribute+-- | This type represents 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+ = 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, Generic) --- | This type represent the "meet or slice" information--- of the preserveAspectRatio SVGattribute+-- | This type represents the "meet or slice" information+-- of the `preserveAspectRatio` SVG attribute data MeetSlice = Meet | Slice deriving (Eq, Show, Generic) --- | Describe how the line should be terminated--- when stroking them. Describe the values of the+-- | Describes how the line should be terminated+-- when stroked. Describes the values of the -- `stroke-linecap` attribute. -- See `_strokeLineCap` data Cap@@ -70,7 +70,7 @@ | CapSquare -- ^ Straight further of the ends (`square` value) deriving (Eq, Show, Generic) --- | Define the possible values of the `stroke-linejoin`+-- | Defines the possible values of the `stroke-linejoin` -- attribute. -- see `_strokeLineJoin` data LineJoin@@ -79,7 +79,7 @@ | JoinRound -- ^ `round` value deriving (Eq, Show, Generic) --- | Describe the different value which can be used+-- | Describes the different values which can be used -- in the `fill` or `stroke` attributes. data Texture = ColorRef PixelRGBA8 -- ^ Direct solid color (#rrggbb, #rgb)@@ -87,9 +87,9 @@ | FillNone -- ^ Equivalent to the `none` value. deriving (Eq, Show, Generic) --- | Describe the possile filling algorithms.+-- | Describe the possible filling algorithms. -- Map the values of the `fill-rule` attributes. data FillRule- = FillEvenOdd -- ^ Correspond to the `evenodd` value.- | FillNonZero -- ^ Correspond to the `nonzero` value.+ = FillEvenOdd -- ^ Corresponds to the `evenodd` value.+ | FillNonZero -- ^ Corresponds to the `nonzero` value. deriving (Eq, Show, Generic)
src/Graphics/SvgTree/Types/Fold.hs view
@@ -12,8 +12,8 @@ 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+-- The function passed in parameter receives a list+-- representing the path used to go arrive to the -- current node. zipTree :: ([[Tree]] -> Tree) -> Tree -> Tree zipTree f = dig [] where
src/Graphics/SvgTree/Types/Hashable.hs view
@@ -2,7 +2,6 @@ {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE ViewPatterns #-} {-# OPTIONS_GHC -Wno-orphans -O0 #-} module Graphics.SvgTree.Types.Hashable where@@ -10,12 +9,10 @@ import Codec.Picture (PixelRGBA8 (..)) import Control.Lens import Data.Hashable-import Data.Monoid import GHC.Generics (Generic) import Graphics.SvgTree.Types.Internal -- Orphan instances :(-instance Hashable a => Hashable (Last a) deriving instance Generic PixelRGBA8 @@ -198,7 +195,7 @@ defaultSvg = Tree NoNode unpack :: Tree -> TreeBranch-unpack t = (_treeBranch t)+unpack = _treeBranch pattern Tree :: TreeBranch -> Tree pattern Tree branch <-
src/Graphics/SvgTree/Types/Internal.hs view
@@ -2,13 +2,12 @@ {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} --- | This module define all the types used in the definition+-- | This module defines all the types used in the definition -- of a svg scene. -- -- Most of the types are lensified.@@ -455,9 +454,9 @@ where import Codec.Picture (PixelRGBA8 (..))+import Control.Applicative ((<|>)) import Control.Lens.TH (makeClassy, makeLenses) import Data.Function (on)-import Data.Monoid (Last (..)) import qualified Data.Text as T import GHC.Generics (Generic) import Graphics.SvgTree.CssTypes@@ -489,7 +488,7 @@ QuadraticBezier !Origin ![(RPoint, RPoint)] | -- | Quadratic bezier, 'T' or 't' command SmoothQuadraticBezierCurveTo !Origin ![RPoint]- | -- | Eliptical arc, 'A' or 'a' command.+ | -- | Elliptical arc, 'A' or 'a' command. EllipticalArc !Origin ![(Coord, Coord, Coord, Bool, Bool, RPoint)] | -- | Close the path, 'Z' or 'z' svg path command. EndPath@@ -534,7 +533,7 @@ !Coord | -- | Translation along a vector Translate !Double !Double- | -- | Scaling on both axis or on X axis and Y axis.+ | -- | Scaling on both axes or on X axis and Y axis. Scale !Double !(Maybe Double) | -- | Rotation around `(0, 0)` or around an optional -- point.@@ -543,7 +542,7 @@ SkewX !Double | -- | Skew transformation along the Y axis. SkewY !Double- | -- | Unkown transformation, like identity.+ | -- | Unknown transformation, like identity. TransformUnknown deriving (Eq, Show, Generic) @@ -620,7 +619,7 @@ TextAnchorEnd deriving (Eq, Show, Generic) --- | Correspond to the possible values of the+-- | Corresponds to the possible values of -- the attributes which are either `none` or -- `url(#elem)` data ElementRef@@ -641,110 +640,107 @@ deriving (Eq, Show, Generic) data FilterAttributes = FilterAttributes- { _filterHeight :: !(Last Number),+ { _filterHeight :: !(Maybe Number), _filterResult :: !(Maybe String),- _filterWidth :: !(Last Number),- _filterX :: !(Last Number),- _filterY :: !(Last Number)+ _filterWidth :: !(Maybe Number),+ _filterX :: !(Maybe Number),+ _filterY :: !(Maybe Number) } deriving (Eq, Show, Generic) instance WithDefaultSvg FilterAttributes where defaultSvg = FilterAttributes- { _filterHeight = Last Nothing,+ { _filterHeight = Nothing, _filterResult = Nothing,- _filterWidth = Last Nothing,- _filterX = Last Nothing,- _filterY = Last Nothing+ _filterWidth = Nothing,+ _filterX = Nothing,+ _filterY = Nothing } --- | This type define how to draw any primitives,+-- | This type defines 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),+ { -- | Corresponds to the `stroke-width` SVG attribute.+ _strokeWidth :: !(Maybe Number),+ -- | Corresponds to the `stroke` attribute.+ _strokeColor :: !(Maybe 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+ -- | Corresponds to the `stroke-linecap` SVG attribute.+ _strokeLineCap :: !(Maybe Cap),+ -- | Corresponds to the `stroke-linejoin` attribute.+ _strokeLineJoin :: !(Maybe LineJoin),+ -- | Defines the distance of the miter join, corresponds -- to the `stroke-miterlimit` attritbue.- _strokeMiterLimit :: !(Last Double),- -- | Define the filling color of the elements. Corresponding+ _strokeMiterLimit :: !(Maybe Double),+ -- | Define the fill color of the elements. Corresponds -- to the `fill` attribute.- _fillColor :: !(Last Texture),+ _fillColor :: !(Maybe Texture), -- | Define the `fill-opacity` attribute, the transparency -- for the "content". _fillOpacity :: !(Maybe Float),- -- | Define the global or group opacity attribute.+ -- | Defines 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),+ -- | Defines the `fill-rule` used during the rendering.+ _fillRule :: !(Maybe FillRule),+ -- | Defines the `mask` attribute.+ _maskRef :: !(Maybe ElementRef),+ -- | Defines the `clip-path` attribute.+ _clipPathRef :: !(Maybe ElementRef),+ -- | Defines the `clip-rule` attribute.+ _clipRule :: !(Maybe 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+ -- | Defines the start distance of the dashing pattern.+ -- Corresponds to the `stroke-dashoffset` attribute.+ _strokeOffset :: !(Maybe Number),+ -- | Defines the dashing pattern for the lines. Corresponds -- to the `stroke-dasharray` attribute.- _strokeDashArray :: !(Last [Number]),- -- | Current size of the text, correspond to the+ _strokeDashArray :: !(Maybe [Number]),+ -- | Current size of the text, corresponds 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+ _fontSize :: !(Maybe Number),+ -- | Defines the possible fonts to be used for text rendering.+ -- Maps to the `font-family` attribute.+ _fontFamily :: !(Maybe [String]),+ -- | Maps to the `font-style` attribute.+ _fontStyle :: !(Maybe FontStyle),+ -- | Defines how to interpret the text position, corresponds -- 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`+ _textAnchor :: !(Maybe TextAnchor),+ -- | Defines the marker used for the start of the line.+ -- Corresponds to the `marker-start` attribute.+ _markerStart :: !(Maybe ElementRef),+ -- | Defines the marker used for every point of the+ -- polyline/path. Corresponds 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),- _filterRef :: !(Last ElementRef)+ _markerMid :: !(Maybe ElementRef),+ -- | Defines the marker used for the end of the line.+ -- Corresponds to the `marker-end` attribute.+ _markerEnd :: !(Maybe ElementRef),+ _filterRef :: !(Maybe ElementRef) } deriving (Eq, Show, Generic) makeClassy ''DrawAttributes --- | This primitive describe an unclosed suite of+-- | This primitive describes an unclosed suite of -- segments. Correspond to the `<polyline>` tag. data PolyLine = PolyLine { _polyLineDrawAttributes :: DrawAttributes, -- | Geometry definition of the polyline.- -- correspond to the `points` attribute+ -- Corresponds to the `points` attribute _polyLinePoints :: [RPoint] } deriving (Eq, Show, Generic)@@ -752,13 +748,13 @@ instance WithDefaultSvg PolyLine where defaultSvg = PolyLine mempty mempty --- | Primitive decriving polygon composed--- of segements. Correspond to the `<polygon>`+-- | Primitive decribing polygon composed+-- of segements. Corresponds to the `<polygon>` -- tag data Polygon = Polygon { _polygonDrawAttributes :: DrawAttributes,- -- | Points of the polygon. Correspond to- -- the `points` attributes.+ -- | Points of the polygon. Corresponds to+ -- the `points` attribute. _polygonPoints :: [RPoint] } deriving (Eq, Show, Generic)@@ -766,14 +762,14 @@ instance WithDefaultSvg Polygon where defaultSvg = Polygon mempty mempty --- | Define a simple line. Correspond to the+-- | Defines a simple line. Corresponds to the -- `<line>` tag. data Line = Line { _lineDrawAttributes :: DrawAttributes,- -- | First point of the the line, correspond+ -- | First point of the line, corresponds -- to the `x1` and `y1` attributes. _linePoint1 :: !Point,- -- | Second point of the the line, correspond+ -- | Second point of the line, corresponds -- to the `x2` and `y2` attributes. _linePoint2 :: !Point }@@ -789,21 +785,21 @@ where zeroPoint = (Num 0, Num 0) --- | Define a rectangle. Correspond to+-- | Defines a rectangle. Corresponds to -- `<rectangle>` svg tag. data Rectangle = Rectangle { _rectangleDrawAttributes :: DrawAttributes,- -- | Upper left corner of the rectangle, correspond+ -- | Upper left corner of the rectangle, corresponds -- to the attributes `x` and `y`. _rectUpperLeftCorner :: !Point,- -- | Rectangle width, correspond, strangely, to+ -- | Rectangle width, corresponds to -- the `width` attribute. _rectWidth :: !(Maybe Number),- -- | Rectangle height, correspond, amazingly, to+ -- | Rectangle height, corresponds to -- the `height` attribute. _rectHeight :: !(Maybe Number),- -- | Define the rounded corner radius radius- -- of the rectangle. Correspond to the `rx` and+ -- | Defines the rounded corner radius+ -- of the rectangle. Corresponds to the `rx` and -- `ry` attributes. _rectCornerRadius :: !(Maybe Number, Maybe Number) }@@ -822,8 +818,8 @@ -- | Type mapping the `<path>` svg tag. data Path = Path { _pathDrawAttributes :: DrawAttributes,- -- | Definition of the path, correspond to the- -- `d` attributes.+ -- | Definition of the path, corresponds to the+ -- `d` attribute. _pathDefinition :: [PathCommand] } deriving (Eq, Show, Generic)@@ -831,7 +827,7 @@ instance WithDefaultSvg Path where defaultSvg = Path mempty mempty --- | Define a SVG group, corresponding `<g>` tag.+-- | Defines a SVG group, corresponds to `<g>` tag. data Group = Group { _groupDrawAttributes :: DrawAttributes, -- | Content of the group, corresponding to all the tags@@ -853,7 +849,7 @@ _groupAspectRatio = defaultSvg } --- | Define the `<filter>` tag.+-- | Defines the `<filter>` tag. data Filter = Filter { _filterDrawAttributes :: DrawAttributes, _filterSelfAttributes :: !FilterAttributes,@@ -869,13 +865,13 @@ _filterChildren = [] } --- | Define a `<circle>`.+-- | Defines a `<circle>`. data Circle = Circle { _circleDrawAttributes :: DrawAttributes,- -- | Define the center of the circle, describe- -- the `cx` and `cy` attributes.+ -- | Defines the center of the circle.+ -- Corresponds to the `cx` and `cy` attributes. _circleCenter :: !Point,- -- | Radius of the circle, equivalent to the `r`+ -- | Radius of the circle, corresponds to the `r` -- attribute. _circleRadius :: !Number }@@ -889,16 +885,16 @@ _circleRadius = Num 0 } --- | Define an `<ellipse>`+-- | Defines an `<ellipse>` data Ellipse = Ellipse { _ellipseDrawAttributes :: DrawAttributes,- -- | Center of the ellipse, map to the `cx`+ -- | Center of the ellipse, corresponds to the `cx` -- and `cy` attributes. _ellipseCenter :: !Point,- -- | Radius along the X axis, map the+ -- | Radius along the X axis, corresponds to the -- `rx` attribute. _ellipseXRadius :: !Number,- -- | Radius along the Y axis, map the+ -- | Radius along the Y axis, corresponds to the -- `ry` attribute. _ellipseYRadius :: !Number }@@ -913,13 +909,13 @@ _ellipseYRadius = Num 0 } --- | Define a color stop for the gradients. Represent+-- | Defines a color stop for the gradients. Represents -- the `<stop>` SVG tag. data GradientStop = GradientStop- { -- | Gradient offset between 0 and 1, correspond+ { -- | Gradient offset between 0 and 1, corresponds -- to the `offset` attribute. _gradientOffset :: !Float,- -- | Color of the gradient stop. Correspond+ -- | Color of the gradient stop. Corresponds -- to the `stop-color` attribute. _gradientColor :: !PixelRGBA8, -- | Path command used in mesh patch@@ -938,10 +934,10 @@ _gradientOpacity = Nothing } --- | Define `<meshpatch>` SVG tag-data MeshGradientPatch = MeshGradientPatch+-- | Defines `<meshpatch>` SVG tag+newtype MeshGradientPatch = MeshGradientPatch { -- | List of stop, from 2 to 4 in a patch- _meshGradientPatchStops :: ![GradientStop]+ _meshGradientPatchStops :: [GradientStop] } deriving (Eq, Show, Generic) @@ -949,16 +945,16 @@ defaultSvg = MeshGradientPatch [] -- | Define a `<meshrow>` tag.-data MeshGradientRow = MeshGradientRow+newtype MeshGradientRow = MeshGradientRow { -- | List of patch in a row- _meshGradientRowPatches :: ![MeshGradientPatch]+ _meshGradientRowPatches :: [MeshGradientPatch] } deriving (Eq, Show, Generic) instance WithDefaultSvg MeshGradientRow where defaultSvg = MeshGradientRow [] --- | Define a `<meshgradient>` tag.+-- | Defines a `<meshgradient>` tag. data MeshGradient = MeshGradient { _meshGradientDrawAttributes :: DrawAttributes, -- | Original x coordinate of the mesh gradient@@ -971,7 +967,7 @@ _meshGradientUnits :: !CoordinateUnits, -- | Optional transform _meshGradientTransform :: ![Transformation],- -- | List of patch rows in the the mesh.+ -- | List of patch rows in the mesh. _meshGradientRows :: ![MeshGradientRow] } deriving (Eq, Show, Generic)@@ -988,7 +984,7 @@ _meshGradientRows = mempty } --- | Define an `<image>` tag.+-- | Defines an `<image>` tag. data Image = Image { _imageDrawAttributes :: DrawAttributes, -- | Position of the image referenced by its@@ -1016,23 +1012,23 @@ _imageAspectRatio = defaultSvg } --- | Define an `<use>` for a named content.+-- | Defines an `<use>` for a named content. -- Every named content can be reused in the -- document using this element. data Use = Use { _useDrawAttributes :: DrawAttributes, -- | Position where to draw the "used" element.- -- Correspond to the `x` and `y` attributes.+ -- Corresponds to the `x` and `y` attributes. _useBase :: Point,- -- | Referenced name, correspond to `xlink:href`+ -- | Referenced name, corresponds to `xlink:href` -- attribute. _useName :: String,- -- | Define the width of the region where- -- to place the element. Map to the `width`+ -- | Defines the width of the region where+ -- to place the element. Corresponds to the `width` -- attribute. _useWidth :: Maybe Number,- -- | Define the height of the region where- -- to place the element. Map to the `height`+ -- | Defines the height of the region where+ -- to place the element. Corresponds to the `height` -- attribute. _useHeight :: Maybe Number }@@ -1048,7 +1044,7 @@ _useHeight = Nothing } --- | Define position information associated to+-- | Defines position information associated to -- `<text>` or `<tspan>` svg tag. data TextInfo = TextInfo { -- | `x` attribute.@@ -1076,7 +1072,7 @@ (dx1 <> dx2) (dy1 <> dy2) (r1 <> r2)- (getLast $ Last l1 <> Last l2)+ (l2 <|> l1) instance Monoid TextInfo where mempty = TextInfo [] [] [] [] [] Nothing@@ -1085,19 +1081,19 @@ instance WithDefaultSvg TextInfo where defaultSvg = mempty --- | Define the content of a `<tspan>` tag.+-- | Defines the content of a `<tspan>` tag. data TextSpanContent = -- | Raw text SpanText !T.Text | -- | Equivalent to a `<tref>` SpanTextRef !String- | -- | Define a `<tspan>`+ | -- | Defines a `<tspan>` SpanSub !TextSpan deriving (Eq, Show, Generic) --- | Define a `<tspan>` tag.+-- | Defines a `<tspan>` tag. data TextSpan = TextSpan- { -- | Placing information for the text.+ { -- | Placement information for the text. _spanInfo :: !TextInfo, -- | Drawing attributes for the text span. _spanDrawAttributes :: !DrawAttributes,@@ -1117,31 +1113,31 @@ -- | Describe the content of the `method` attribute on -- text path. data TextPathMethod- = -- | Map to the `align` value.+ = -- | Corresponds to the `align` value. TextPathAlign- | -- | Map to the `stretch` value.+ | -- | Corresponds to the `stretch` value. TextPathStretch deriving (Eq, Show, Generic) --- | Describe the content of the `spacing` text path+-- | Describes the content of the `spacing` text path -- attribute. data TextPathSpacing- = -- | Map to the `exact` value.+ = -- | Corresponds to the `exact` value. TextPathSpacingExact- | -- | Map to the `auto` value.+ | -- | Corresponds to the `auto` value. TextPathSpacingAuto deriving (Eq, Show, Generic) --- | Describe the `<textpath>` SVG tag.+-- | Describes the `<textpath>` SVG tag. data TextPath = TextPath- { -- | Define the beginning offset on the path,+ { -- | Defines the beginning offset on the path, -- the `startOffset` attribute. _textPathStartOffset :: !Number,- -- | Define the `xlink:href` attribute.+ -- | Defines the `xlink:href` attribute. _textPathName :: !String,- -- | Correspond to the `method` attribute.+ -- | Corresponds to the `method` attribute. _textPathMethod :: !TextPathMethod,- -- | Correspond to the `spacing` attribute.+ -- | Corresponds to the `spacing` attribute. _textPathSpacing :: !TextPathSpacing } deriving (Eq, Show, Generic)@@ -1155,7 +1151,7 @@ _textPathSpacing = TextPathSpacingExact } --- | Define the possible values of the `lengthAdjust`+-- | Defines the possible values of the `lengthAdjust` -- attribute. data TextAdjust = -- | Value `spacing`@@ -1164,9 +1160,9 @@ TextAdjustSpacingAndGlyphs deriving (Eq, Show, Generic) --- | Define the global `<text>` SVG tag.+-- | Defines the global `<text>` SVG tag. data Text = Text- { -- | Define the `lengthAdjust` attribute.+ { -- | Defines the `lengthAdjust` attribute. _textAdjust :: !TextAdjust, -- | Root of the text content. _textRoot :: !TextSpan@@ -1267,7 +1263,7 @@ data SpecularLighting = SpecularLighting { _specLightingDrawAttributes :: DrawAttributes, _specLightingFilterAttr :: !FilterAttributes,- _specLightingIn :: !(Last FilterSource),+ _specLightingIn :: !(Maybe FilterSource), _specLightingSurfaceScale :: Double, _specLightingSpecularConst :: Double, _specLightingSpecularExp :: Double,@@ -1280,7 +1276,7 @@ SpecularLighting { _specLightingDrawAttributes = defaultSvg, _specLightingFilterAttr = defaultSvg,- _specLightingIn = Last Nothing,+ _specLightingIn = Nothing, _specLightingSurfaceScale = 1, _specLightingSpecularConst = 1, _specLightingSpecularExp = 1,@@ -1290,7 +1286,7 @@ data ConvolveMatrix = ConvolveMatrix { _convolveMatrixDrawAttributes :: DrawAttributes, _convolveMatrixFilterAttr :: !FilterAttributes,- _convolveMatrixIn :: !(Last FilterSource),+ _convolveMatrixIn :: !(Maybe FilterSource), _convolveMatrixOrder :: NumberOptionalNumber, _convolveMatrixKernelMatrix :: [Double], _convolveMatrixDivisor :: Double,@@ -1308,7 +1304,7 @@ ConvolveMatrix { _convolveMatrixDrawAttributes = defaultSvg, _convolveMatrixFilterAttr = defaultSvg,- _convolveMatrixIn = Last Nothing,+ _convolveMatrixIn = Nothing, _convolveMatrixOrder = Num1 3, _convolveMatrixKernelMatrix = [], _convolveMatrixDivisor = 1,@@ -1323,7 +1319,7 @@ data DiffuseLighting = DiffuseLighting { _diffuseLightingDrawAttributes :: DrawAttributes, _diffuseLightingFilterAttr :: !FilterAttributes,- _diffuseLightingIn :: !(Last FilterSource),+ _diffuseLightingIn :: !(Maybe FilterSource), _diffuseLightingSurfaceScale :: Double, _diffuseLightingDiffuseConst :: Double, _diffuseLightingKernelUnitLength :: NumberOptionalNumber@@ -1335,7 +1331,7 @@ DiffuseLighting { _diffuseLightingDrawAttributes = defaultSvg, _diffuseLightingFilterAttr = defaultSvg,- _diffuseLightingIn = Last Nothing,+ _diffuseLightingIn = Nothing, _diffuseLightingSurfaceScale = 1, _diffuseLightingDiffuseConst = 1, _diffuseLightingKernelUnitLength = Num1 0@@ -1344,7 +1340,7 @@ data Morphology = Morphology { _morphologyDrawAttributes :: DrawAttributes, _morphologyFilterAttr :: !FilterAttributes,- _morphologyIn :: !(Last FilterSource),+ _morphologyIn :: !(Maybe FilterSource), _morphologyOperator :: OperatorType, _morphologyRadius :: NumberOptionalNumber }@@ -1356,7 +1352,7 @@ Morphology { _morphologyDrawAttributes = defaultSvg, _morphologyFilterAttr = defaultSvg,- _morphologyIn = Last Nothing,+ _morphologyIn = Nothing, _morphologyOperator = OperatorOver, _morphologyRadius = Num1 0 }@@ -1443,9 +1439,9 @@ data DisplacementMap = DisplacementMap { _displacementMapDrawAttributes :: !DrawAttributes, _displacementMapFilterAttr :: !FilterAttributes,- _displacementMapIn :: !(Last FilterSource),- _displacementMapIn2 :: !(Last FilterSource),- _displacementMapScale :: !(Last Double),+ _displacementMapIn :: !(Maybe FilterSource),+ _displacementMapIn2 :: !(Maybe FilterSource),+ _displacementMapScale :: !(Maybe Double), _displacementMapXChannelSelector :: ChannelSelector, _displacementMapYChannelSelector :: ChannelSelector }@@ -1456,9 +1452,9 @@ DisplacementMap { _displacementMapDrawAttributes = defaultSvg, _displacementMapFilterAttr = defaultSvg,- _displacementMapIn = Last Nothing,- _displacementMapIn2 = Last Nothing,- _displacementMapScale = Last Nothing,+ _displacementMapIn = Nothing,+ _displacementMapIn2 = Nothing,+ _displacementMapScale = Nothing, _displacementMapXChannelSelector = ChannelA, _displacementMapYChannelSelector = ChannelA }@@ -1485,8 +1481,8 @@ data Blend = Blend { _blendDrawAttributes :: !DrawAttributes, _blendFilterAttr :: !FilterAttributes,- _blendIn :: !(Last FilterSource),- _blendIn2 :: !(Last FilterSource),+ _blendIn :: !(Maybe FilterSource),+ _blendIn2 :: !(Maybe FilterSource), _blendMode :: !BlendMode } deriving (Eq, Show, Generic)@@ -1496,8 +1492,8 @@ Blend { _blendDrawAttributes = defaultSvg, _blendFilterAttr = defaultSvg,- _blendIn = Last Nothing,- _blendIn2 = Last Nothing,+ _blendIn = Nothing,+ _blendIn2 = Nothing, _blendMode = Normal } @@ -1521,7 +1517,7 @@ data Offset = Offset { _offsetDrawAttributes :: !DrawAttributes, _offsetFilterAttr :: !FilterAttributes,- _offsetIn :: !(Last FilterSource),+ _offsetIn :: !(Maybe FilterSource), _offsetDX :: !Number, _offsetDY :: !Number }@@ -1532,7 +1528,7 @@ Offset { _offsetDrawAttributes = defaultSvg, _offsetFilterAttr = defaultSvg,- _offsetIn = Last Nothing,+ _offsetIn = Nothing, _offsetDX = Num 0, _offsetDY = Num 0 }@@ -1540,7 +1536,7 @@ data Tile = Tile { _tileDrawAttributes :: !DrawAttributes, _tileFilterAttr :: !FilterAttributes,- _tileIn :: !(Last FilterSource)+ _tileIn :: !(Maybe FilterSource) } deriving (Eq, Show, Generic) @@ -1549,7 +1545,7 @@ Tile { _tileDrawAttributes = defaultSvg, _tileFilterAttr = defaultSvg,- _tileIn = Last Nothing+ _tileIn = Nothing } data Merge = Merge@@ -1570,7 +1566,7 @@ data MergeNode = MergeNode { _mergeNodeDrawAttributes :: !DrawAttributes, --Does not have filter attributes!- _mergeNodeIn :: !(Last FilterSource)+ _mergeNodeIn :: !(Maybe FilterSource) } deriving (Eq, Show, Generic) @@ -1578,14 +1574,14 @@ defaultSvg = MergeNode { _mergeNodeDrawAttributes = defaultSvg,- _mergeNodeIn = Last Nothing+ _mergeNodeIn = Nothing } data ComponentTransfer = ComponentTransfer { _compTransferDrawAttributes :: !DrawAttributes, _compTransferFilterAttr :: !FilterAttributes, _compTransferChildren :: ![FilterElement],- _compTransferIn :: !(Last FilterSource)+ _compTransferIn :: !(Maybe FilterSource) } deriving (Eq, Show, Generic) @@ -1595,7 +1591,7 @@ { _compTransferDrawAttributes = defaultSvg, _compTransferFilterAttr = defaultSvg, _compTransferChildren = [],- _compTransferIn = Last Nothing+ _compTransferIn = Nothing } data FuncType@@ -1717,7 +1713,7 @@ data ColorMatrix = ColorMatrix { _colorMatrixDrawAttributes :: !DrawAttributes, _colorMatrixFilterAttr :: !FilterAttributes,- _colorMatrixIn :: !(Last FilterSource),+ _colorMatrixIn :: !(Maybe FilterSource), _colorMatrixType :: !ColorMatrixType, _colorMatrixValues :: !String }@@ -1728,7 +1724,7 @@ ColorMatrix { _colorMatrixDrawAttributes = defaultSvg, _colorMatrixFilterAttr = defaultSvg,- _colorMatrixIn = Last Nothing,+ _colorMatrixIn = Nothing, _colorMatrixType = Matrix, _colorMatrixValues = "" }@@ -1745,8 +1741,8 @@ data Composite = Composite { _compositeDrawAttributes :: DrawAttributes, _compositeFilterAttr :: !FilterAttributes,- _compositeIn :: Last FilterSource,- _compositeIn2 :: Last FilterSource,+ _compositeIn :: Maybe FilterSource,+ _compositeIn2 :: Maybe FilterSource, _compositeOperator :: CompositeOperator, _compositeK1 :: Number, _compositeK2 :: Number,@@ -1760,8 +1756,8 @@ Composite { _compositeDrawAttributes = defaultSvg, _compositeFilterAttr = defaultSvg,- _compositeIn = Last Nothing,- _compositeIn2 = Last Nothing,+ _compositeIn = Nothing,+ _compositeIn2 = Nothing, _compositeOperator = CompositeOver, _compositeK1 = Num 0, _compositeK2 = Num 0,@@ -1772,7 +1768,7 @@ data Turbulence = Turbulence { _turbulenceDrawAttributes :: !DrawAttributes, _turbulenceFilterAttr :: !FilterAttributes,- _turbulenceBaseFrequency :: !(Double, Last Double), -- Not negative+ _turbulenceBaseFrequency :: !(Double, Maybe Double), -- Not negative _turbulenceNumOctaves :: Int, -- Not negative _turbulenceSeed :: Double, _turbulenceStitchTiles :: StitchTiles,@@ -1795,7 +1791,7 @@ Turbulence { _turbulenceDrawAttributes = defaultSvg, _turbulenceFilterAttr = defaultSvg,- _turbulenceBaseFrequency = (0, Last Nothing),+ _turbulenceBaseFrequency = (0, Nothing), _turbulenceNumOctaves = 1, _turbulenceSeed = 0, _turbulenceStitchTiles = NoStitch,@@ -1811,9 +1807,9 @@ data GaussianBlur = GaussianBlur { _gaussianBlurDrawAttributes :: DrawAttributes, _gaussianBlurFilterAttr :: !FilterAttributes,- _gaussianBlurIn :: Last FilterSource,+ _gaussianBlurIn :: Maybe FilterSource, _gaussianBlurStdDeviationX :: Number,- _gaussianBlurStdDeviationY :: Last Number,+ _gaussianBlurStdDeviationY :: Maybe Number, _gaussianBlurEdgeMode :: EdgeMode } deriving (Eq, Show, Generic)@@ -1823,13 +1819,13 @@ GaussianBlur { _gaussianBlurDrawAttributes = defaultSvg, _gaussianBlurFilterAttr = defaultSvg,- _gaussianBlurIn = Last Nothing,+ _gaussianBlurIn = Nothing, _gaussianBlurStdDeviationX = Num 0,- _gaussianBlurStdDeviationY = Last Nothing,+ _gaussianBlurStdDeviationY = Nothing, _gaussianBlurEdgeMode = EdgeDuplicate } --- | Define the orientation, associated to the+-- | Defines the orientation, associated to the -- `orient` attribute on the Marker data MarkerOrientation = -- | Auto value@@ -1847,7 +1843,7 @@ MarkerUnitUserSpaceOnUse deriving (Eq, Show, Generic) --- | Define the content of the `markerUnits` attribute+-- | Defines the content of the `markerUnits` attribute -- on the Marker. data Overflow = -- | Value `visible`@@ -1856,21 +1852,21 @@ OverflowHidden deriving (Eq, Show, Generic) --- | Define the `<marker>` tag.+-- | Defines the `<marker>` tag. data Marker = Marker { _markerDrawAttributes :: DrawAttributes,- -- | Define the reference point of the marker.- -- correspond to the `refX` and `refY` attributes.+ -- | Defines the reference point of the marker.+ -- corresponds to the `refX` and `refY` attributes. _markerRefPoint :: !(Number, Number),- -- | Define the width of the marker. Correspond to+ -- | Defines the width of the marker. Corresponds to -- the `markerWidth` attribute. _markerWidth :: !(Maybe Number),- -- | Define the height of the marker. Correspond to+ -- | Defines the height of the marker. Corresponds to -- the `markerHeight` attribute. _markerHeight :: !(Maybe Number),- -- | Correspond to the `orient` attribute.+ -- | Corresponds to the `orient` attribute. _markerOrient :: !(Maybe MarkerOrientation),- -- | Map the `markerUnits` attribute.+ -- | Corresponds to the `markerUnits` attribute. _markerUnits :: !(Maybe MarkerUnit), -- | Optional viewbox _markerViewBox :: !(Maybe (Double, Double, Double, Double)),@@ -1927,7 +1923,7 @@ ClipPathNode _ -> "clipPath" SvgNode {} -> "svg" --- | Define the possible values for the `spreadMethod`+-- | Defines the possible values for the `spreadMethod` -- values used for the gradient definitions. data Spread = -- | `reapeat` value@@ -1938,10 +1934,10 @@ SpreadReflect deriving (Eq, Show, Generic) --- | Define a `<linearGradient>` tag.+-- | Defines a `<linearGradient>` tag. data LinearGradient = LinearGradient { _linearGradientDrawAttributes :: DrawAttributes,- -- | Define coordinate system of the gradient,+ -- | Defines coordinate system of the gradient, -- associated to the `gradientUnits` attribute. _linearGradientUnits :: CoordinateUnits, -- | Point defining the beginning of the line gradient.@@ -1975,10 +1971,10 @@ _linearGradientStops = [] } --- | Define a `<radialGradient>` tag.+-- | Defines a `<radialGradient>` tag. data RadialGradient = RadialGradient { _radialGradientDrawAttributes :: DrawAttributes,- -- | Define coordinate system of the gradient,+ -- | Defines coordinate system of the gradient, -- associated to the `gradientUnits` attribute. _radialGradientUnits :: CoordinateUnits, -- | Center of the radial gradient. Associated to@@ -1993,7 +1989,7 @@ -- | 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+ -- | Defines how to handle the values outside -- the gradient start and stop. Associated to the -- `spreadMethod` attribute. _radialGradientSpread :: Spread,@@ -2020,18 +2016,18 @@ _radialGradientStops = [] } --- | Define a SVG `<mask>` tag.+-- | Defines a SVG `<mask>` tag. data Mask = Mask { _maskDrawAttributes :: DrawAttributes,- -- | Correspond to the `maskContentUnits` attributes.+ -- | Corresponds to the `maskContentUnits` attributes. _maskContentUnits :: CoordinateUnits,- -- | Mapping to the `maskUnits` attribute.+ -- | Corresponds to the `maskUnits` attribute. _maskUnits :: CoordinateUnits,- -- | Map to the `x` and `y` attributes.+ -- | Corresponds to the `x` and `y` attributes. _maskPosition :: Point,- -- | Map to the `width` attribute+ -- | Corresponds to the `width` attribute _maskWidth :: Number,- -- | Map to the `height` attribute.+ -- | Corresponds to the `height` attribute. _maskHeight :: Number, -- | Children of the `<mask>` tag. _maskContent :: [Tree]@@ -2050,12 +2046,12 @@ _maskContent = [] } --- | Define a `<clipPath>` tag.+-- | Defines a `<clipPath>` tag. data ClipPath = ClipPath { _clipPathDrawAttributes :: DrawAttributes,- -- | Maps to the `clipPathUnits` attribute+ -- | Corresponds to the `clipPathUnits` attribute _clipPathUnits :: CoordinateUnits,- -- | Maps to the content of the tree+ -- | Corresponds to the content of the tree _clipPathContent :: [Tree] } deriving (Eq, Show, Generic)@@ -2068,7 +2064,7 @@ _clipPathContent = mempty } --- | Define a `<pattern>` tag.+-- | Defines a `<pattern>` tag. data Pattern = Pattern { _patternDrawAttributes :: DrawAttributes, -- | Possible `viewBox`.@@ -2087,13 +2083,13 @@ _patternHref :: !String, -- | Elements used in the pattern. _patternElements :: ![Tree],- -- | Define the cordinate system to use for- -- the pattern. Mapped to the `patternUnits`+ -- | Defines the cordinate system to use for+ -- the pattern. Corresponds to the `patternUnits` -- attribute. _patternUnit :: !CoordinateUnits,- -- | Value of the "preserveAspectRatio" attribute+ -- | Value of the `preserveAspectRatio` attribute _patternAspectRatio :: !PreserveAspectRatio,- -- | Value of "patternTransform" attribute+ -- | Value of `patternTransform` attribute _patternTransform :: !(Maybe [Transformation]) } deriving (Eq, Show, Generic)@@ -2126,7 +2122,7 @@ | ElementClipPath ClipPath deriving (Eq, Show, Generic) --- | Represent a full svg document with style,+-- | Represents a full svg document with style, -- geometry and named elements. data Document = Document { _documentViewBox :: Maybe (Double, Double, Double, Double),@@ -2161,11 +2157,10 @@ } = (floor w, floor h) documentSize dpi- doc@( Document- { _documentWidth = Just w,- _documentHeight = Just h- }- ) =+ doc@Document+ { _documentWidth = Just w,+ _documentHeight = Just h+ } = documentSize dpi $ doc { _documentWidth = Just $ toUserUnit dpi w,@@ -2183,69 +2178,70 @@ instance Semigroup DrawAttributes where (<>) a b = DrawAttributes- { _strokeWidth = (mappend `on` _strokeWidth) a b,- _strokeColor = (mappend `on` _strokeColor) a b,- _strokeLineCap = (mappend `on` _strokeLineCap) a b,+ { _strokeWidth = chooseLast _strokeWidth,+ _strokeColor = chooseLast _strokeColor,+ _strokeLineCap = chooseLast _strokeLineCap, _strokeOpacity = (opacityMappend `on` _strokeOpacity) a b,- _strokeLineJoin = (mappend `on` _strokeLineJoin) a b,- _strokeMiterLimit = (mappend `on` _strokeMiterLimit) a b,- _fillColor = (mappend `on` _fillColor) a b,+ _strokeLineJoin = chooseLast _strokeLineJoin,+ _strokeMiterLimit = chooseLast _strokeMiterLimit,+ _fillColor = chooseLast _fillColor, _fillOpacity = (opacityMappend `on` _fillOpacity) a b,- _fontSize = (mappend `on` _fontSize) a b,+ _fontSize = chooseLast _fontSize, _transform = (mayMerge `on` _transform) a b,- _fillRule = (mappend `on` _fillRule) a b,+ _fillRule = chooseLast _fillRule, _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,- _filterRef = (mappend `on` _filterRef) a b+ _strokeOffset = chooseLast _strokeOffset,+ _strokeDashArray = chooseLast _strokeDashArray,+ _fontFamily = chooseLast _fontFamily,+ _fontStyle = chooseLast _fontStyle,+ _textAnchor = chooseLast _textAnchor,+ _maskRef = chooseLast _maskRef,+ _clipPathRef = chooseLast _clipPathRef,+ _clipRule = chooseLast _clipRule,+ _markerStart = chooseLast _markerStart,+ _markerMid = chooseLast _markerMid,+ _markerEnd = chooseLast _markerEnd,+ _filterRef = chooseLast _filterRef } 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+ chooseLast f = f b <|> f a instance Monoid DrawAttributes where mappend = (<>) mempty = DrawAttributes- { _strokeWidth = Last Nothing,- _strokeColor = Last Nothing,+ { _strokeWidth = Nothing,+ _strokeColor = Nothing, _strokeOpacity = Nothing,- _strokeLineCap = Last Nothing,- _strokeLineJoin = Last Nothing,- _strokeMiterLimit = Last Nothing,- _fillColor = Last Nothing,+ _strokeLineCap = Nothing,+ _strokeLineJoin = Nothing,+ _strokeMiterLimit = Nothing,+ _fillColor = Nothing, _groupOpacity = Nothing, _fillOpacity = Nothing,- _fontSize = Last Nothing,- _fontFamily = Last Nothing,- _fontStyle = Last Nothing,+ _fontSize = Nothing,+ _fontFamily = Nothing,+ _fontStyle = Nothing, _transform = Nothing,- _fillRule = Last Nothing,+ _fillRule = 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,- _filterRef = Last Nothing+ _strokeOffset = Nothing,+ _strokeDashArray = Nothing,+ _textAnchor = Nothing,+ _maskRef = Nothing,+ _clipPathRef = Nothing,+ _clipRule = Nothing,+ _markerStart = Nothing,+ _markerMid = Nothing,+ _markerEnd = Nothing,+ _filterRef = Nothing } instance WithDefaultSvg DrawAttributes where
src/Graphics/SvgTree/XmlParser.hs view
@@ -25,7 +25,6 @@ import Data.Attoparsec.Text (Parser, parseOnly, string) import Data.List (foldl', intercalate) import Data.Maybe (catMaybes, fromMaybe)-import Data.Monoid import qualified Data.Text as T import Graphics.SvgTree.ColorParser import Graphics.SvgTree.CssParser (complexNumber, dashArray, num,@@ -62,10 +61,6 @@ aparse = fmap Just . aparse aserialize = (>>= aserialize) -instance ParseableAttribute v => ParseableAttribute (Last v) where- aparse = fmap Last . aparse- aserialize = aserialize . getLast- instance ParseableAttribute String where aparse = Just aserialize = Just@@ -522,23 +517,23 @@ EdgeWrap -> "wrap" EdgeNone -> "none" -instance ParseableAttribute (Number, Last Number) where+instance ParseableAttribute (Number, Maybe Number) where aparse s = case aparse s of- Just [x] -> Just (x, Last Nothing)- Just [x,y] -> Just (x, Last (Just y))+ Just [x] -> Just (x, Nothing)+ Just [x,y] -> Just (x, Just y) _ -> Nothing - aserialize (x, Last Nothing) = aserialize [x]- aserialize (x, Last (Just y)) = aserialize [x, y]+ aserialize (x, Nothing) = aserialize [x]+ aserialize (x, Just y) = aserialize [x, y] -instance ParseableAttribute (Double, Last Double) where+instance ParseableAttribute (Double, Maybe Double) where aparse s = case aparse s of- Just [x] -> Just (x, Last Nothing)- Just [x,y] -> Just (x, Last (Just y))+ Just [x] -> Just (x, Nothing)+ Just [x,y] -> Just (x, Just y) _ -> Nothing - aserialize (x, Last Nothing) = aserialize [x]- aserialize (x, Last (Just y)) = aserialize [x, y]+ aserialize (x, Nothing) = aserialize [x]+ aserialize (x, Just y) = aserialize [x, y] parse :: Parser a -> String -> Maybe a parse p str = case parseOnly p (T.pack str) of@@ -655,16 +650,16 @@ v = a ^. elLens defaultVal = defaultSvg ^. elLens -parserLastSetter :: String -> Lens' a (Last e) -> (String -> Maybe e) -> Serializer e+parserMaybeSetter :: String -> Lens' a (Maybe e) -> (String -> Maybe e) -> Serializer e -> SvgAttributeLens a-parserLastSetter attribute elLens parser serialize =+parserMaybeSetter attribute elLens parser serialize = SvgAttributeLens attribute updater serializer where updater el str = case parser str of Nothing -> el- Just v -> el & elLens .~ Last (Just v)+ Just v -> el & elLens ?~ v - serializer a = getLast (a ^. elLens) >>= serialize+ serializer a = (a ^. elLens) >>= serialize classSetter :: SvgAttributeLens DrawAttributes classSetter = SvgAttributeLens "class" updater serializer@@ -677,10 +672,10 @@ lst -> Just . T.unpack $ T.intercalate " " lst cssUniqueNumber :: ASetter el el- a (Last Number)+ a (Maybe Number) -> CssUpdater el cssUniqueNumber setter attr ((CssNumber n:_):_) =- attr & setter .~ Last (Just n)+ attr & setter ?~ n cssUniqueNumber _ attr _ = attr cssUniqueFloat :: (Fractional n)@@ -690,10 +685,10 @@ attr & setter ?~ realToFrac n cssUniqueFloat _ attr _ = attr -cssUniqueMayFloat :: ASetter el el a (Last Double)+cssUniqueMayFloat :: ASetter el el a (Maybe Double) -> CssUpdater el cssUniqueMayFloat setter attr ((CssNumber (Num n):_):_) =- attr & setter .~ Last (Just n)+ attr & setter ?~ n cssUniqueMayFloat _ attr _ = attr cssIdentAttr :: ParseableAttribute a => Lens' el a -> CssUpdater el@@ -705,7 +700,7 @@ fontFamilyParser :: CssUpdater DrawAttributes fontFamilyParser attr (lst:_) = attr & fontFamily .~ fontNames where- fontNames = Last . Just $ T.unpack <$> extractString lst+ fontNames = Just $ T.unpack <$> extractString lst extractString [] = [] extractString (CssIdent n:rest) = n : extractString rest@@ -715,13 +710,13 @@ cssUniqueTexture :: ASetter el el- a (Last Texture)+ a (Maybe Texture) -> CssUpdater el cssUniqueTexture setter attr css = case css of- ((CssIdent "none":_):_) -> attr & setter .~ Last (Just FillNone)- ((CssColor c:_):_) -> attr & setter .~ Last (Just $ ColorRef c)+ ((CssIdent "none":_):_) -> attr & setter ?~ FillNone+ ((CssColor c:_):_) -> attr & setter ?~ ColorRef c ((CssFunction "url" [CssReference c]:_):_) ->- attr & setter .~ Last (Just . TextureRef $ T.unpack c)+ attr & setter ?~ TextureRef (T.unpack c) _ -> attr cssUniqueColor :: ASetter el el a PixelRGBA8 -> CssUpdater el@@ -729,11 +724,11 @@ ((CssColor c:_):_) -> attr & setter .~ c _ -> attr -cssElementRefSetter :: Lens' el (Last ElementRef) -> CssUpdater el+cssElementRefSetter :: Lens' el (Maybe ElementRef) -> CssUpdater el cssElementRefSetter setter attr ((CssFunction "url" [CssReference c]:_):_) =- attr & setter .~ Last (Just . Ref $ T.unpack c)+ attr & setter ?~ Ref (T.unpack c) cssElementRefSetter setter attr ((CssIdent "none":_):_) =- attr & setter .~ Last (Just RefNone)+ attr & setter ?~ RefNone cssElementRefSetter _ attr _ = attr cssMayStringSetter :: ASetter el el a (Maybe String) -> CssUpdater el@@ -746,11 +741,11 @@ cssNullSetter :: CssUpdater a cssNullSetter attr _ = attr -cssDashArray :: ASetter el el a (Last [Number]) -> CssUpdater el+cssDashArray :: ASetter el el a (Maybe [Number]) -> CssUpdater el cssDashArray setter attr (lst:_) = case [n | CssNumber n <- lst ] of [] -> attr- v -> attr & setter .~ Last (Just v)+ v -> attr & setter ?~ v cssDashArray _ attr _ = attr @@ -769,7 +764,7 @@ ,(opacitySetter "fill-opacity" fillOpacity, cssUniqueFloat fillOpacity) ,(opacitySetter "stroke-opacity" strokeOpacity, cssUniqueFloat strokeOpacity) ,("font-size" `parseIn` fontSize, cssUniqueNumber fontSize)- ,(parserLastSetter "font-family" fontFamily (Just . commaSeparate)+ ,(parserMaybeSetter "font-family" fontFamily (Just . commaSeparate) (Just . intercalate ", "), fontFamilyParser) ,("fill-rule" `parseIn` fillRule, cssIdentAttr fillRule)
test/W3C.hs view
@@ -1,42 +1,45 @@+{-# LANGUAGE DataKinds #-} module Main (main) where -import Test.Tasty-import Test.Tasty.Ingredients.Rerun (defaultMainWithRerun)-import Test.Tasty.ExpectedFailure-import Test.Tasty.HUnit-import qualified Data.ByteString.Char8 as BS+import Data.Algorithm.Diff+import Data.Algorithm.DiffOutput+import qualified Data.ByteString.Lazy as BS+import Data.Char+import Data.List+import Control.Monad+import Control.Exception (evaluate, handle, ErrorCall(..)) import Graphics.SvgTree import Graphics.SvgTree.Printer-import System.Process import System.Directory-import System.FilePath-import Data.List import System.Environment-import Data.Algorithm.Diff-import Data.Algorithm.DiffOutput-import Data.Char+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import System.FilePath+import System.Process.Typed+import Test.Tasty+import Test.Tasty.ExpectedFailure+import Test.Tasty.HUnit+import Test.Tasty.Ingredients.Rerun (defaultMainWithRerun) main :: IO ()-main = return ()--- main = do--- args <- getArgs--- case args of--- [path] -> do--- haveFile <- doesFileExist path--- if haveFile--- then do--- raw <- readFile path--- golden <- prettyPrintSvg =<< sanitizeSvg raw--- cycled <- prettyPrintSvg (cycleSvg golden)--- if golden == cycled--- then putStrLn "Good"--- else do--- putStrLn "Mismatch!"--- let d = getGroupedDiff (lines golden) (lines cycled) :: [Diff [String]]--- ranges = diffToLineRanges d--- print (prettyDiffs ranges)--- else runTestSuite--- _ -> runTestSuite+-- main = return ()+main = do+ args <- getArgs+ case args of+ ["sort"] -> sortTestCases+ ["cycle", path] -> do+ inp <- readFile path+ putStrLn $ cycleSvg inp+ [path] -> do+ haveFile <- doesFileExist path+ if haveFile+ then do+ passed <- checkCycled path+ if passed+ then putStrLn "Good"+ else putStrLn "Mismatch!"+ else runTestSuite+ _ -> runTestSuite runTestSuite :: IO () runTestSuite = do@@ -48,39 +51,79 @@ unitTestFolder :: FilePath -> IO TestTree unitTestFolder path = do files <- sort <$> getDirectoryContents path- return $ testGroup "animate"- [ testSvg fullPath- | file <- files- , let fullPath = path </> file- , takeExtension fullPath == ".svg"- ]+ return $+ testGroup+ "animate"+ [ testSvg fullPath+ | file <- files,+ let fullPath = path </> file,+ takeExtension fullPath == ".svg"+ ] +sortTestCases :: IO ()+sortTestCases = do+ goodFiles <- getDirectoryContents "test/good"+ badFiles <- getDirectoryContents "test/bad"+ forM_ goodFiles $ \file -> when (takeExtension file == ".svg") $ do+ -- putStrLn $ "Processing: " ++ ("test/good" </> file)+ passed <- checkCycled ("test/good" </> file)+ unless passed $ do+ putStrLn $ "Marking bad: " ++ file+ renameFile ("test/good" </> file) ("test/bad" </> file)+ forM_ badFiles $ \file -> when (takeExtension file == ".svg") $ do+ -- putStrLn $ "Processing: " ++ ("test/bad" </> file)+ passed <- checkCycled ("test/bad" </> file)+ when passed $ do+ putStrLn $ "Marking good: " ++ file+ renameFile ("test/bad" </> file) ("test/good" </> file)++checkCycled :: FilePath -> IO Bool+checkCycled path =+ handle (\ExitCodeException{} -> return False) $+ handle (\ErrorCall{} -> return False) $ do+ raw <- readFile path+ golden <- sanitizeSvg raw+ cycled <- sanitizeSvg (cycleSvg raw)+ return (golden == cycled)+ testSvg :: FilePath -> TestTree-testSvg path = testCase (takeBaseName path) $ do- raw <- readFile path- golden <- prettyPrintSvg =<< sanitizeSvg raw- cycled <- prettyPrintSvg (cycleSvg golden)- assert (golden == cycled)+testSvg path = testCase (takeBaseName path) $+ assert =<< checkCycled path -- Sanitize SVG using rsvg-convert-sanitizeSvg :: String -> IO String-sanitizeSvg = readProcess "rsvg-convert" ["--format", "svg"]+sanitizeSvg :: String -> IO BS.ByteString+sanitizeSvg inp = do+ let inpT = T.pack inp+ evaluate (T.length inpT)+ (stdout, stderr) <- readProcess_ $+ setStdin (textInput inpT) $+ proc "rsvg-convert" ["--format", "png"]+ return stdout +textInput :: T.Text -> StreamSpec 'STInput ()+textInput = byteStringInput . BS.fromStrict . T.encodeUtf8+ -- Ugly hack to ignore the differences between #FFF and #fff. lowerHashValues :: String -> String-lowerHashValues ('#':more) = '#' : map toLower before ++ lowerHashValues after+lowerHashValues ('#' : more) = '#' : map toLower before ++ lowerHashValues after where (before, after) = splitAt 6 more-lowerHashValues (c:cs) = c:lowerHashValues cs+lowerHashValues (c : cs) = c : lowerHashValues cs lowerHashValues [] = [] -prettyPrintSvg :: String -> IO String-prettyPrintSvg = fmap lowerHashValues .- readProcess "svgo" ["--input=-", "--output=-", "--pretty"- , "--enable=sortAttrs,convertColors"- , "--disable=cleanupIDs,prefixIds,convertTransform,mergePaths,collapseGroups" ]+-- prettyPrintSvg :: String -> IO String+-- prettyPrintSvg =+-- fmap lowerHashValues+-- . readProcess+-- "svgo"+-- [ "--input=-",+-- "--output=-",+-- "--pretty",+-- "--enable=sortAttrs,convertColors",+-- "--disable=cleanupIDs,prefixIds,convertTransform,mergePaths,collapseGroups"+-- ] -- Parse and print SVG with reanimate-svg library. cycleSvg :: String -> String-cycleSvg = - maybe "Failed to parse" ppDocument . parseSvgFile "input" . BS.pack+cycleSvg =+ maybe "Failed to parse" ppDocument . parseSvgFile "input" . T.pack