11{-# LANGUAGE CPP #-}
22{-# LANGUAGE OverloadedStrings #-}
3+ {-# LANGUAGE ScopedTypeVariables #-}
34{- |
45Module : Text.Pandoc.Class.IO
56Copyright : Copyright (C) 2016-2020 Jesse Rosenthal, John MacFarlane
@@ -31,6 +32,7 @@ module Text.Pandoc.Class.IO
3132 , readFileLazy
3233 , readFileStrict
3334 , readStdinStrict
35+ , runConversion
3436 , extractMedia
3537 , writeMedia
3638 ) where
@@ -60,7 +62,7 @@ import System.IO.Error
6062import System.Random (StdGen )
6163import Text.Pandoc.Class.CommonState (CommonState (.. ))
6264import Text.Pandoc.Class.PandocMonad
63- (PandocMonad , getsCommonState , getMediaBag , report )
65+ (PandocMonad ( trace ) , getsCommonState , getMediaBag , report )
6466import Text.Pandoc.Definition (Pandoc , Inline (Image ))
6567import Text.Pandoc.Error (PandocError (.. ))
6668import Text.Pandoc.Logging (LogMessage (.. ), messageVerbosity , showLogMessage )
@@ -80,6 +82,9 @@ import qualified System.Environment as Env
8082import qualified System.FilePath.Glob
8183import qualified System.Random
8284import qualified Text.Pandoc.UTF8 as UTF8
85+ import Text.Pandoc.Process (pipeProcess )
86+ import System.Exit (ExitCode (ExitSuccess ))
87+ import Text.Pandoc.Shared (tshow )
8388#ifndef EMBED_DATA_FILES
8489import qualified Paths_pandoc as Paths
8590#endif
@@ -170,6 +175,21 @@ readFileStrict s = liftIOError B.readFile s
170175readStdinStrict :: (PandocMonad m , MonadIO m ) => m B. ByteString
171176readStdinStrict = liftIOError (const B. getContents ) " stdin"
172177
178+ -- | Runs an image conversion step, returning an error on failure.
179+ -- Not available when sandboxed.
180+ runConversion :: (PandocMonad m , MonadIO m ) => (String , [String ], BL. ByteString ) -> m (Either T. Text BL. ByteString )
181+ runConversion (cmd, args, bs) = do
182+ trace (T. intercalate " " $ map T. pack $ cmd : args)
183+ liftIO $ E. catch
184+ (do (exit, out) <- pipeProcess Nothing cmd
185+ args
186+ bs
187+ return $ if exit == ExitSuccess
188+ then Right out
189+ else Left " conversion from SVG failed" )
190+ (\ (e :: E. SomeException ) -> return $ Left $
191+ " check that " <> T. pack cmd <> " is in path.\n " <> tshow e)
192+
173193-- | Return a list of paths that match a glob, relative to the working
174194-- directory. See 'System.FilePath.Glob' for the glob syntax.
175195glob :: (PandocMonad m , MonadIO m ) => String -> m [FilePath ]
0 commit comments