packages feed

diagrams-input 0.1.1 → 0.1.2

raw patch · 7 files changed

+84/−77 lines, 7 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Diagrams.SVG.Path: myDouble :: Parser Text Double
- Diagrams.SVG.ReadSVG: parseCircle :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseCircle :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseClipPath :: (MonadThrow m, InputConstraints b n, Show n, Read n, Renderable (Text n) b) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseClipPath :: (MonadThrow m, InputConstraints b n, Show n, Read n, Renderable (Text n) b) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseDefs :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseDefs :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseEllipse :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseEllipse :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseG :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseG :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseImage :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Renderable (DImage (N b) Embedded) b, Typeable b, Typeable n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseImage :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Renderable (DImage (N b) Embedded) b, Typeable b, Typeable n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseLine :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseLine :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseLinearGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseLinearGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parsePath :: (MonadThrow m, InputConstraints b n, Show n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parsePath :: (MonadThrow m, InputConstraints b n, Show n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parsePattern :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parsePattern :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parsePolyLine :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parsePolyLine :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parsePolygon :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parsePolygon :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseRadialGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseRadialGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseRect :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseRect :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseSVG :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => Sink Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseSVG :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => ConduitT Event Void m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseSwitch :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseSwitch :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseSymbol :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseSymbol :: (MonadThrow m, InputConstraints b n, Renderable (Text n) b, Read n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseText :: (MonadThrow m, InputConstraints b n, Read n, RealFloat n, Renderable (Text n) b) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseText :: (MonadThrow m, InputConstraints b n, Read n, RealFloat n, Renderable (Text n) b) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.SVG.ReadSVG: parseUse :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Typeable n) => Consumer Event m (Maybe (Tag b n))
+ Diagrams.SVG.ReadSVG: parseUse :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Typeable n) => forall o. ConduitT Event o m (Maybe (Tag b n))
- Diagrams.TwoD.Input: loadImageEmbedded :: (InputConstraints b n, Renderable (Text n) b, Read n, n ~ Place) => String -> IO (Either String (QDiagram b V2 n Any))
+ Diagrams.TwoD.Input: loadImageEmbedded :: (InputConstraints b n, Renderable (Text n) b, Read n, n ~ Place) => FilePath -> IO (Either String (QDiagram b V2 n Any))

Files

CHANGELOG.md view
@@ -1,3 +1,11 @@+# v0.1.2 (14 June 2023)++- Add new function `readSVGLBS` to read an SVG directly from a lazy+  `ByteString` (thanks to Igor Moreno)+- Fix parsing bug that was causing some paths to be read+  incorrectly ([#17](https://github.com/diagrams/diagrams-input/issues/17))+- Test with GHC 9.6+ # v0.1.1 (8 Jan 2023)  - Fix example in documentation
README.md view
@@ -42,7 +42,6 @@ ### TODO - [ ] fill = "none" => path open - [ ] Scale viewbox to width and height-- [ ] Bug in arc command - [ ] marker tag - [ ] Transform exceptions into Left values in Image.hs (if monad transformers and conduit is easy for you please help me) - [ ] inherit-attribute
diagrams-input.cabal view
@@ -1,5 +1,5 @@ Name:                diagrams-input-Version:             0.1.1+Version:             0.1.2 Synopsis:            Parse raster and SVG files for diagrams Description:         Parse raster and SVG images for the diagrams DSL. License:             BSD3@@ -11,7 +11,7 @@ Build-type:          Simple Cabal-version:       >=1.10 Extra-source-files:  CHANGELOG.md, README.md-tested-with:         GHC ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.4 || ==9.4.1+tested-with:         GHC ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.7 || ==9.4.5 || ==9.6.1 Source-repository head   type:     git   location: http://github.com/diagrams/diagrams-input.git
src/Diagrams/SVG/Attributes.hs view
@@ -171,15 +171,6 @@                 | otherwise = Nothing pp = parseDouble . pack -myDouble = AT.choice [dotDouble, double]--dotDouble =-   do AT.skipSpace-      AT.char '.'-      frac <- AT.decimal-      let denominator = fromIntegral (10^(length $ digits 10 frac))-      return ((fromIntegral frac) / denominator)- parsePoints :: RealFloat n => Text -> [(n, n)] parsePoints t = either (const []) id (AT.parseOnly (many' parsePoint) t) 
src/Diagrams/SVG/Path.hs view
@@ -13,6 +13,7 @@     , outline     , nextSegment     , svgArc+    , myDouble     -- * Parsing (Generating Path Commands)     , PathCommand(..)     , parsePathCommand@@ -23,19 +24,20 @@ import Data.Attoparsec.Combinator import Data.Attoparsec.Text import qualified Data.Attoparsec.Text as AT-import Data.Char (isAlpha, isHexDigit, digitToInt)+import Data.Char (digitToInt, isAlpha, isHexDigit) import Data.Colour.Names (readColourName) import Data.Colour.SRGB-import qualified Data.List.Split as S+import Data.Digits (digits) import Data.List (foldl')-import Data.Maybe (fromMaybe, fromJust, isJust, isNothing, maybeToList, catMaybes)+import qualified Data.List.Split as S+import Data.Maybe (catMaybes, fromJust, fromMaybe, isJust, isNothing, maybeToList)+import Data.Text (Text (..), empty, pack, unpack) import qualified Data.Text as T-import Data.Text(Text(..), pack, unpack, empty) import Diagrams.Attributes import Diagrams.Path+import Diagrams.Prelude import Diagrams.Segment import Diagrams.TwoD.Types-import Diagrams.Prelude  data AbsRel = Abs | Rel deriving Show data PathCommand n =@@ -91,10 +93,19 @@                              AT.choice [ do { AT.char a; b <- parser; return b},                                          do {            b <- parser; return b} ] } -doubleWithOptional a = do { d <- double `withOptional` a ; return (fromRational $ toRational d) }+myDouble = AT.choice [dotDouble, double] -spaceDouble = do { AT.skipSpace; d <- double; return (fromRational $ toRational d) }+dotDouble =+   do AT.skipSpace+      AT.char '.'+      frac <- AT.decimal+      let denominator = fromIntegral (10^(length $ digits 10 frac))+      return ((fromIntegral frac) / denominator) +doubleWithOptional a = do { d <- myDouble `withOptional` a ; return (fromRational $ toRational d) }++spaceDouble = do { AT.skipSpace; d <- myDouble; return (fromRational $ toRational d) }+ tuple2 = do { a <- spaceDouble; b <- doubleWithOptional ','; return (a, b) }  tuple4 = do { a <- spaceDouble;@@ -212,22 +223,22 @@ nextSegment ((cx,cy), (x0,y0), O trail) (T Abs (x,y)) = ((2*x0-cx, 2*y0-cy ), (x, y), O $ trail ++ [bez3 (x0-cx, y0-cy) (x-x0, y-y0) (x-x0, y-y0)]) nextSegment ((cx,cy), (x0,y0), O trail) (T Rel (x,y)) = ((2*x0-cx, 2*y0-cy),  (x, y), O $ trail ++ [bez3 (x0-cx, y0-cy) (x, y) (x, y)]) -nextSegment (_, (x0,y0), O trail) (A Abs (rx,ry,xAxisRot,fl0,fl1,x,y) ) = (nul, nul, O $ trail ++ [svgArc (rx,ry) xAxisRot fl0 fl1 (x, y)])-nextSegment (_, (x0,y0), O trail) (A Rel (rx,ry,xAxisRot,fl0,fl1,x,y) ) = (nul, nul, O $ trail ++ [svgArc (rx,ry) xAxisRot fl0 fl1 (x, y)])--nul = (0,0)+nextSegment (_, (x0,y0), O trail) (A Abs (rx,ry,xAxisRot,fl0,fl1,x,y) ) = ((x, y), (x, y), O $ trail ++ [svgArc (rx,ry) xAxisRot fl0 fl1 (x-x0, y-y0)])+nextSegment (_, (x0,y0), O trail) (A Rel (rx,ry,xAxisRot,fl0,fl1,x,y) ) = ((x+x0, y+y0), (x+x0, y+y0), O $ trail ++ [svgArc (rx,ry) xAxisRot fl0 fl1 (x, y)])  straight' = lineFromSegments . (:[]) . straight . r2  bez3 point1 point2 point3 = lineFromSegments [bezier3 (r2 point1) (r2 point2) (r2 point3)]  -- | The arc command: see <http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes>+-- Conversion from endpoint to center parametrization, see B.2.4 -- To Do: scale if rx,ry,xAxisRot are such that there is no solution svgArc :: (RealFloat n, Show n) => (n, n) -> n -> n -> n -> (n,n) -> Trail' Line V2 n svgArc (rxx, ryy) xAxisRot largeArcFlag sweepFlag (x2, y2)      | x2 == 0 && y2 == 0 = emptyLine -- spec F6.2      | rx == 0 || ry == 0 = straight' (x2,y2) -- spec F6.2      | otherwise = -- Debug.Trace.trace (show (dtheta) ++ show dir1) $+-- https://hackage.haskell.org/package/diagrams-lib-1.4.6/docs/Diagrams-TwoD-Arc.html                    unLoc (arc' 1 dir1 (dtheta @@ rad) # scaleY ry # scaleX rx # rotate (phi @@ rad))   where rx | rxx < 0   = -rxx  -- spec F6.2            | otherwise =  rxx@@ -252,7 +263,7 @@             | otherwise =   root * ry * x1' / rx         cx = (cos phi) * cx' - (sin phi) * cy' + ((x1+x2)/2)         cy = (sin phi) * cx' + (cos phi) * cy' + ((y1+y2)/2)-        dir1 = dirBetween (p2 ((x1'-cx')/rx, (y1'-cy')/ry)) origin+        dir1 = dirBetween origin (p2 ((x1'-cx')/rx, (y1'-cy')/ry))         v1 = r2 (( x1'-cx')/rx,  (y1'-cy')/ry)         v2 = r2 ((-x1'-cx')/rx, (-y1'-cy')/ry)         -- angleV1V2 is unfortunately necessary probably because of something like <https://ghc.haskell.org/trac/ghc/ticket/10010>@@ -261,4 +272,3 @@                   | otherwise = (signedAngleBetween v2 v1) ^. rad         dtheta | fs == 0   = if angleV1V2 > 0 then angleV1V2 - (2*pi) else angleV1V2                | otherwise = if angleV1V2 < 0 then angleV1V2 + (2*pi) else angleV1V2-
src/Diagrams/SVG/ReadSVG.hs view
@@ -125,7 +125,7 @@              => Filesystem.Path.FilePath -> IO (Either String (Diagram b)) readSVGFile fp = if (extension fp) == (Just "svg")     then catchAny (runResourceT $ do-           tree <- parseFile def (encodeString fp) $$ force "error in parseSVG: " parseSVG+           tree <- runConduit $ parseFile def (encodeString fp) .| force "error in parseSVG: " parseSVG            pure $ Right $ diagram tree)          $ \e -> pure $ Left $ "error in parseFile: " <> show e      else pure $ Left "Not a svg file"@@ -174,8 +174,8 @@  -- | Parse \<svg\>, see <http://www.w3.org/TR/SVG/struct.html#SVGElement> parseSVG :: (MonadThrow m, InputConstraints b n, Renderable (TT.Text n) b, Read n) -          => Sink Event m (Maybe (Tag b n))-parseSVG = tagName "{http://www.w3.org/2000/svg}svg" svgAttrs $+          => ConduitT Event Void m (Maybe (Tag b n))+parseSVG = tag' (Text.XML.Stream.Parse.anyOf ["svg", "{http://www.w3.org/2000/svg}svg"]) svgAttrs $    \(cpa,ca,gea,pa,class_,style,ext,x,y,w,h,vb,ar,zp,ver,baseprof,cScripT,cStyleT,xmlns,xml) ->    do gs <- many gContent       let st hmaps = (parseStyles style hmaps) ++ -- parse the style attribute (style="stop-color:#000000;stop-opacity:0.8")@@ -192,7 +192,7 @@                             (reverse gs)  svgContent :: (MonadThrow m, InputConstraints b n, Renderable (TT.Text n) b, Read n) -            => Consumer Event m (Maybe (Tag b n))+            => ConduitT Event Void m (Maybe (Tag b n)) svgContent = choose -- the likely most common are checked first      [parseG, parsePath, parseCircle, parseRect, parseEllipse, parseLine, parsePolyLine, parsePolygon,       parseDefs, parseSymbol, parseUse, -- structural elements@@ -203,7 +203,7 @@ --------------------------------------------------------------------------- -- | Parse \<g\>, see <http://www.w3.org/TR/SVG/struct.html#GElement> parseG :: (MonadThrow m, InputConstraints b n, Renderable (TT.Text n) b, Read n) -        => Consumer Event m (Maybe (Tag b n))+        => forall o. ConduitT Event o m (Maybe (Tag b n)) parseG = tagName "{http://www.w3.org/2000/svg}g" gAttrs    $ \(cpa,ca,gea,pa,class_,style,ext,tr) ->    do insideGs <- many gContent@@ -218,7 +218,7 @@                             (reverse insideGs)  gContent :: (MonadThrow m, InputConstraints b n, Show n, Read n, Renderable (TT.Text n) b) -          => Consumer Event m (Maybe (Tag b n))+          => forall o. ConduitT Event o m (Maybe (Tag b n)) gContent = choose -- the likely most common are checked first      [parsePath, parseG, parseRect, parseCircle, parseEllipse, parseLine, parsePolyLine, parsePolygon,       parseUse, parseSymbol, parseStyle, parseDefs, -- structural elements@@ -230,7 +230,7 @@ --------------------------------------------------------------------------- -- | Parse \<defs\>, see <http://www.w3.org/TR/SVG/struct.html#DefsElement> parseDefs :: (MonadThrow m, InputConstraints b n, Renderable (TT.Text n) b, Read n) -           => Consumer Event m (Maybe (Tag b n))+           => forall o. ConduitT Event o m (Maybe (Tag b n)) parseDefs = tagName "{http://www.w3.org/2000/svg}defs" gAttrs $    \(cpa,ca,gea,pa,class_,style,ext,tr) ->    do insideDefs <- many gContent@@ -253,7 +253,7 @@ --    .fil1 {fill:#3A73B8} --   ]]> --  </style>-parseStyle :: (MonadThrow m, RealFloat n) => Consumer Event m (Maybe (Tag b n))+parseStyle :: (MonadThrow m, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseStyle = tagName "{http://www.w3.org/2000/svg}style" sAttrs $    \(ca,type_,media,title) ->    do insideStyle <- content@@ -266,7 +266,7 @@ ----------------------------------------------------------------------------------- -- | Parse \<symbol\>, see <http://www.w3.org/TR/SVG/struct.html#SymbolElement> parseSymbol :: (MonadThrow m, InputConstraints b n, Renderable (TT.Text n) b, Read n) -             => Consumer Event m (Maybe (Tag b n))+             => forall o. ConduitT Event o m (Maybe (Tag b n)) parseSymbol = tagName "{http://www.w3.org/2000/svg}symbol" symbolAttrs $    \(ca,gea,pa,class_,style,ext,ar,viewbox) ->    do insideSym <- many gContent@@ -282,7 +282,7 @@  ----------------------------------------------------------------------------------- -- | Parse \<use\>, see <http://www.w3.org/TR/SVG/struct.html#UseElement>-parseUse :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Typeable n) => Consumer Event m (Maybe (Tag b n))+parseUse :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Typeable n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseUse = tagName "{http://www.w3.org/2000/svg}use" useAttrs    $ \(ca,cpa,gea,pa,xlink,class_,style,ext,tr,x,y,w,h) ->    do -- insideUse <- many useContent@@ -300,23 +300,23 @@                                                                  p (vbH, miny) 0 y))) .                                                  (applyTr (parseTr tr)) . (applyStyleSVG st maps) -useContent :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))+useContent :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n)) useContent = choose [parseDesc,parseTitle] -- descriptive elements  -------------------------------------------------------------------------------------- -- | Parse \<switch\>, see <http://www.w3.org/TR/SVG/struct.html#SwitchElement>-parseSwitch :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))+parseSwitch :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseSwitch = tagName "{http://www.w3.org/2000/svg}switch" switchAttrs    $ \(cpa,ca,gea,pa,class_,style,ext,tr) ->    do -- insideSwitch <- many switchContent       return $ Leaf (id1 ca) mempty mempty --- switchContent :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))+-- switchContent :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n)) switchContent = choose [parsePath, parseRect, parseCircle, parseEllipse, parseLine, parsePolyLine, parsePolygon]  ----------------------------------------------------------------------------------- -- | Parse \<rect\>,  see <http://www.w3.org/TR/SVG11/shapes.html#RectElement>-parseRect :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+parseRect :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseRect = tagName "{http://www.w3.org/2000/svg}rect" rectAttrs $   \(cpa,ca,gea,pa,class_,style,ext,ar,tr,x,y,w,h,rx,ry) -> do     let st hmaps = (parseStyles style hmaps) ++@@ -334,7 +334,7 @@  --------------------------------------------------------------------------------------------------- -- | Parse \<circle\>,  see <http://www.w3.org/TR/SVG11/shapes.html#CircleElement>-parseCircle :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+parseCircle :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseCircle = tagName "{http://www.w3.org/2000/svg}circle" circleAttrs $   \(cpa,ca,gea,pa,class_,style,ext,tr,r,cx,cy) -> do     let -- st :: (RealFloat n, RealFloat a, Read a) => (HashMaps b n, ViewBox n) -> [SVGStyle n a]@@ -349,7 +349,7 @@  --------------------------------------------------------------------------------------------------- -- | Parse \<ellipse\>,  see <http://www.w3.org/TR/SVG11/shapes.html#EllipseElement>-parseEllipse :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+parseEllipse :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseEllipse = tagName "{http://www.w3.org/2000/svg}ellipse" ellipseAttrs $   \(cpa,ca,gea,pa,class_,style,ext,tr,rx,ry,cx,cy) -> do     let st hmaps = (parseStyles style hmaps) ++@@ -363,7 +363,7 @@  --------------------------------------------------------------------------------------------------- -- | Parse \<line\>,  see <http://www.w3.org/TR/SVG11/shapes.html#LineElement>-parseLine :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+parseLine :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseLine = tagName "{http://www.w3.org/2000/svg}line" lineAttrs $   \(cpa,ca,gea,pa,class_,style,ext,tr,x1,y1,x2,y2) -> do     let st hmaps = (parseStyles style hmaps) ++@@ -379,7 +379,7 @@  --------------------------------------------------------------------------------------------------- -- | Parse \<polyline\>,  see <http://www.w3.org/TR/SVG11/shapes.html#PolylineElement>-parsePolyLine :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+parsePolyLine :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parsePolyLine = tagName "{http://www.w3.org/2000/svg}polyline" polygonAttrs $   \(cpa,ca,gea,pa,class_,style,ext,tr,points) -> do     let st hmaps = (parseStyles style hmaps) ++@@ -397,7 +397,7 @@  -------------------------------------------------------------------------------------------------- -- | Parse \<polygon\>,  see <http://www.w3.org/TR/SVG11/shapes.html#PolygonElement>-parsePolygon :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+parsePolygon :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parsePolygon = tagName "{http://www.w3.org/2000/svg}polygon" polygonAttrs $   \(cpa,ca,gea,pa,class_,style,ext,tr,points) -> do     let st hmaps = (parseStyles style hmaps) ++@@ -415,7 +415,7 @@  -------------------------------------------------------------------------------------------------- -- | Parse \<path\>,  see <http://www.w3.org/TR/SVG11/paths.html#PathElement>-parsePath :: (MonadThrow m, InputConstraints b n, Show n) => Consumer Event m (Maybe (Tag b n))+parsePath :: (MonadThrow m, InputConstraints b n, Show n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parsePath = tagName "{http://www.w3.org/2000/svg}path" pathAttrs $   \(cpa,ca,gea,pa,class_,style,ext,tr,d,pathLength) -> do     let st hmaps = (parseStyles style hmaps) ++@@ -429,7 +429,7 @@ ------------------------------------------------------------------------------------------------- -- | Parse \<clipPath\>, see <http://www.w3.org/TR/SVG/masking.html#ClipPathElement> parseClipPath :: (MonadThrow m, InputConstraints b n, Show n, Read n, Renderable (TT.Text n) b) -               => Consumer Event m (Maybe (Tag b n))+               => forall o. ConduitT Event o m (Maybe (Tag b n)) parseClipPath = tagName "{http://www.w3.org/2000/svg}clipPath" clipPathAttrs $   \(cpa,ca,pa,class_,style,ext,ar,viewbox) -> do     insideClipPath <- many clipPathContent@@ -444,7 +444,7 @@                      (reverse insideClipPath)  clipPathContent :: (MonadThrow m, InputConstraints b n, Show n, Read n, Renderable (TT.Text n) b) -                 => Consumer Event m (Maybe (Tag b n))+                 => forall o. ConduitT Event o m (Maybe (Tag b n)) clipPathContent = choose [parseRect, parseCircle, parseEllipse, parseLine, parsePolyLine, parsePath,                           parsePolygon, parseText, parseUse] @@ -452,7 +452,7 @@ -- | Parse \<image\>, see <http://www.w3.org/TR/SVG/struct.html#ImageElement> -- <image width="28" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAADCAYAAACAjW/aAAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH2AkMDx4ErQ9V0AAAAClJREFUGJVjYMACGhoa/jMwMPyH0kQDYvQxYpNsaGjAyibCQrL00dSHACypIHXUNrh3AAAAAElFTkSuQmCC" height="3"/> parseImage :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Renderable (DImage (N b) Embedded) b,-              Typeable b, Typeable n) => Consumer Event m (Maybe (Tag b n))+              Typeable b, Typeable n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseImage = tagName "{http://www.w3.org/2000/svg}image" imageAttrs $   \(ca,cpa,gea,xlink,pa,class_,style,ext,ar,tr,x,y,w,h) ->   do return $ Leaf (id1 ca) mempty (\(_,(minx,miny,vbW,vbH)) -> (dataUriToImage (xlinkHref xlink) (p (minx,vbW) 0 w) (p (miny,vbH) 0 h))@@ -498,7 +498,7 @@ ------------------------------------------------------------------------------------------------- -- | Parse \<text\>, see <http://www.w3.org/TR/SVG/text.html#TextElement> parseText :: (MonadThrow m, InputConstraints b n, Read n, RealFloat n, Renderable (TT.Text n) b)-            => Consumer Event m (Maybe (Tag b n))+            => forall o. ConduitT Event o m (Maybe (Tag b n)) parseText = tagName "{http://www.w3.org/2000/svg}text" textAttrs $   \(cpa,ca,gea,pa,class_,style,ext,tr,la,x,y,dx,dy,rot,textlen) ->     do let st hmaps = (parseStyles style hmaps) ++@@ -636,7 +636,7 @@ -- | Parse \<linearGradient\>, see <http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement> -- example: <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="68.2461" y1="197.6797" --           x2="52.6936" y2="237.5337" gradientTransform="matrix(1 0 0 -1 -22.5352 286.4424)">-parseLinearGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))+parseLinearGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseLinearGradient = tagName "{http://www.w3.org/2000/svg}linearGradient" linearGradAttrs $   \(ca,pa,xlink,class_,style,ext,x1,y1,x2,y2,gradientUnits,gradientTransform,spreadMethod) -> -- TODO gradientUnits   do gs <- many gradientContent@@ -660,7 +660,7 @@    --   parseDesc, parseMetaData, parseTitle] -- descriptive Elements (rarely used here, so tested at the end)  -- | Parse \<radialGradient\>, see <http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement>-parseRadialGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))+parseRadialGradient :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseRadialGradient = tagName "{http://www.w3.org/2000/svg}radialGradient" radialGradAttrs $ -- TODO gradientUnits   \(ca,pa,xlink,class_,style,ext,cx,cy,r,fx,fy,gradientUnits,gradientTransform,spreadMethod) ->    do gs <- many gradientContent@@ -731,7 +731,7 @@ ----------------------------------------------------------------------------------------------------  parseFont :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Renderable (DImage (N b) Embedded) b, Renderable (Path V2 n) b,-              Typeable b, Typeable n, Show n, Read n, Renderable (TT.Text n) b) => Consumer Event m (Maybe (Tag b n))+              Typeable b, Typeable n, Show n, Read n, Renderable (TT.Text n) b) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseFont = tagName "{http://www.w3.org/2000/svg}font" fontAttrs $   \(ca,pa,class_,style,ext,hOriginX,hOriginY,hAdvX,vOriginX,vOriginY,vAdvY) ->   do gs <- many fontContent@@ -755,13 +755,13 @@         toSvgGlyph (GG (Glyph glyphId g d horizAdvX _ _ _ (Just unicode) glyphName o a l)) = (unicode,(glyphName,horizAdvX,d))  fontContent :: (MonadThrow m, InputConstraints b n, Read n, Show n, Renderable (TT.Text n) b) -             => Consumer Event m (Maybe (FontContent b n))+             => forall o. ConduitT Event o m (Maybe (FontContent b n)) fontContent = choose -- the likely most common are checked first      [parseGlyph, parseHKern, parseFontFace, parseMissingGlyph, parseVKern]   parseFontFace :: (MonadThrow m, V b ~ V2, N b ~ n, Read n, RealFloat n, Renderable (DImage (N b) Embedded) b,-              Typeable b, Typeable n) => Consumer Event m (Maybe (FontContent b n))+              Typeable b, Typeable n) => forall o. ConduitT Event o m (Maybe (FontContent b n)) parseFontFace = tagName "{http://www.w3.org/2000/svg}font-face" fontFaceAttrs $   \(ca,fontFamily,fontStyle,fontVariant,fontWeight,fontStretch,fontSize,unicodeRange,unitsPerEm,panose1,     stemv,stemh,slope,capHeight,xHeight,accentHeight,ascent,descent,widths,bbox,ideographic,alphabetic,mathematical,@@ -774,7 +774,7 @@   parseMissingGlyph :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Read n, Renderable (DImage (N b) Embedded) b,-              Typeable b, Typeable n) => Consumer Event m (Maybe (FontContent b n))+              Typeable b, Typeable n) => forall o. ConduitT Event o m (Maybe (FontContent b n)) parseMissingGlyph = tagName "{http://www.w3.org/2000/svg}missing-glyph" missingGlyphAttrs $   \(ca,pa,class_,style,d,horizAdvX,vertOriginX,vertOriginY,vertAdvY) ->   do return $ GG $ Glyph (id1 ca) (Leaf (id1 ca) mempty mempty) Nothing@@ -784,7 +784,7 @@  parseGlyph :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Read n, Renderable (DImage (N b) Embedded) b,               Renderable (Path V2 n) b, Show n, Typeable b, Typeable n, Renderable (TT.Text n) b) -           => Consumer Event m (Maybe (FontContent b n))+           => forall o. ConduitT Event o m (Maybe (FontContent b n)) parseGlyph = tagName "{http://www.w3.org/2000/svg}glyph" glyphAttrs $   \(ca,pa,class_,style,d,horizAdvX,vertOriginX,vertOriginY,vertAdvY,unicode,glyphName,orientation,arabicForm,lang) ->   do gs <- many gContent@@ -795,12 +795,12 @@  getN = maybe 0 (read . T.unpack) -parseHKern :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Read n, Typeable b, Typeable n) => Consumer Event m (Maybe (FontContent b n))+parseHKern :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Read n, Typeable b, Typeable n) => forall o. ConduitT Event o m (Maybe (FontContent b n)) parseHKern = tagName "{http://www.w3.org/2000/svg}hkern" kernAttrs $   \(ca,u1,g1,u2,g2,k) ->   do return $ KK $ Kern HKern (charList u1) (charList g1) (charList u2) (charList g2) (getN k) -parseVKern :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Read n, Typeable b, Typeable n) => Consumer Event m (Maybe (FontContent b n))+parseVKern :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n, Read n, Typeable b, Typeable n) => forall o. ConduitT Event o m (Maybe (FontContent b n)) parseVKern = tagName "{http://www.w3.org/2000/svg}vkern" kernAttrs $   \(ca,u1,g1,u2,g2,k) ->   do return $ KK $ Kern VKern (charList u1) (charList g1) (charList u2) (charList g2) (getN k)@@ -812,7 +812,7 @@ -- descriptive elements ------------------------------------------------------o	---------------------------------- -- | Parse \<desc\>, see <http://www.w3.org/TR/SVG/struct.html#DescriptionAndTitleElements>--- parseDesc :: (MonadThrow m, Metric (V b), RealFloat (N b)) => Consumer Event m (Maybe (Tag b n))+-- parseDesc :: (MonadThrow m, Metric (V b), RealFloat (N b)) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseDesc = tagName "{http://www.w3.org/2000/svg}desc" descAttrs    $ \(ca,class_,style) ->    do desc <- content@@ -824,7 +824,7 @@    do title <- content       return $ Leaf (id1 ca) mempty mempty -skipArbitraryTag :: (MonadThrow m, InputConstraints b n, Renderable (TT.Text n) b, Read n) => Consumer Event m (Maybe (Tag b n))+skipArbitraryTag :: (MonadThrow m, InputConstraints b n, Renderable (TT.Text n) b, Read n) => forall o. ConduitT Event o m (Maybe (Tag b n)) skipArbitraryTag = do t <- ignoreAnyTreeContent                       if isJust t then return (Just $ Leaf (Just "") mempty mempty)                                   else return Nothing@@ -849,22 +849,22 @@ -- {-  Maybe we implement it one day -parseMetaData :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => Consumer Event m (Maybe (Tag b n))+parseMetaData :: (MonadThrow m, V b ~ V2, N b ~ n, RealFloat n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseMetaData = tagName "{http://www.w3.org/2000/svg}metadata" ignoreAttrs    $ \_ ->    do -- meta <- many metaContent       return $ Leaf Nothing mempty mempty --- metaContent :: (MonadThrow m, Metric (V b), RealFloat (N b)) => Consumer Event m (Maybe (Tag b n))+-- metaContent :: (MonadThrow m, Metric (V b), RealFloat (N b)) => forall o. ConduitT Event o m (Maybe (Tag b n)) metaContent = choose [parseRDF] -- extend if needed --- parseRDF :: (MonadThrow m, Metric (V b), RealFloat (N b)) => Consumer Event m (Maybe (Tag b n))+-- parseRDF :: (MonadThrow m, Metric (V b), RealFloat (N b)) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseRDF = tagName "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF" ignoreAttrs           $ \_ ->           do -- c <- parseWork              return $ Leaf Nothing mempty mempty --- parseWork :: (MonadThrow m, Metric (V b), RealFloat (N b)) => Consumer Event m (Maybe (Tag b n))+-- parseWork :: (MonadThrow m, Metric (V b), RealFloat (N b)) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseWork = tagName "{http://creativecommons.org/ns#}Work" ignoreAttrs    $ \_ ->    do -- c <- many workContent@@ -885,7 +885,7 @@ parseSubject = tagName "{http://purl.org/dc/elements/1.1/}subject" ignoreAttrs    $ \_ -> do { c <- parseBag ; return $ Leaf Nothing mempty mempty } --- parseBag :: (MonadThrow m, Metric (V b), Ord (N b), Floating (N b)) => Consumer Event m (Maybe (Tag b n))+-- parseBag :: (MonadThrow m, Metric (V b), Ord (N b), Floating (N b)) => forall o. ConduitT Event o m (Maybe (Tag b n)) parseBag = tagName "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}Bag" ignoreAttrs    $ \_ -> do { c <- parseList ; return $ Leaf Nothing mempty mempty } @@ -951,13 +951,13 @@ -- sceletons  -- | Parse \<pattern\>, see <http://www.w3.org/TR/SVG/pservers.html#PatternElement>-parsePattern :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+parsePattern :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) parsePattern = tagName "{http://www.w3.org/2000/svg}pattern" patternAttrs $   \(cpa,ca,pa,class_,style,ext,view,ar,x,y,w,h,pUnits,pCUnits,pTrans) ->   do c <- content -- insidePattern <- many patternContent      return $ Leaf (Just "") mempty mempty -patternContent :: (MonadThrow m, InputConstraints b n) => Consumer Event m (Maybe (Tag b n))+patternContent :: (MonadThrow m, InputConstraints b n) => forall o. ConduitT Event o m (Maybe (Tag b n)) patternContent = choose [parseImage]  -- | Parse \<filter\>, see <http://www.w3.org/TR/SVG/filters.html#FilterElement>
src/Diagrams/TwoD/Input.hs view
@@ -19,6 +19,7 @@ import           Codec.Picture import           Codec.Picture.Types  (dynamicMap) +import           Data.Either (isRight) import           Data.Semigroup import           Data.Typeable        (Typeable) @@ -33,23 +34,21 @@  -- | Load 2d formats given by a filepath and embed them loadImageEmbedded :: (InputConstraints b n, Renderable (TT.Text n) b, Read n, n ~ Place) -                   => String -> IO (Either String (QDiagram b V2 n Any))+                   => FilePath -> IO (Either String (QDiagram b V2 n Any)) loadImageEmbedded path = do   dImg <- readImage path   svgImg <- readSVGFile (decodeString path)-  return $ msum  [ svgImg,-                   fmap (image.rasterImage) dImg ] -- skip "Left"s and use the first "Right" image-  where-    rasterImage img = DImage (ImageRaster img) (dynamicMap imageWidth img) (dynamicMap imageHeight img) mempty+  return $ if isRight svgImg then svgImg else fmap (image.rasterImage) dImg+ where+   rasterImage img = DImage (ImageRaster img) (dynamicMap imageWidth img) (dynamicMap imageHeight img) mempty  -- | Load 2d formats given by a filepath and make a reference loadImageExternal :: (InputConstraints b n, Renderable (DImage n External) b)                     => FilePath -> IO (Either String (QDiagram b V2 n Any)) loadImageExternal path = do+  --  svgImg <- readSVGFile (decodeString path)   dImg <- readImage path---  svgImg <- readSVGFile path-  return $ msum [ fmap (image.rasterPath) dImg ]---                svgImg ] -- skip "Left"s and use the first "Right" image-  where-    rasterPath img = DImage (ImageRef path) (dynamicMap imageWidth img) (dynamicMap imageHeight img) mempty+  return $ fmap (image.rasterPath) dImg+ where+   rasterPath img = DImage (ImageRef path) (dynamicMap imageWidth img) (dynamicMap imageHeight img) mempty