{-| Module : $header$ Copyright : (c) Laurent P René de Cotret, 2020 License : GNU GPL, version 2 or above Maintainer : laurent.decotret@outlook.com Stability : internal Portability : portable Prelude for renderers, containing some helpful utilities. -} module Text.Pandoc.Filter.Plot.Renderers.Prelude ( module Prelude , module Text.Pandoc.Filter.Plot.Types , Text , st , unpack , commandSuccess , existsOnPath , executable , OutputSpec(..) ) where import Data.Maybe (isJust) import Data.Text (Text, unpack) import System.Directory (findExecutable) import System.Exit (ExitCode(..)) import System.Process.Typed (runProcess, shell, setStdout, setStderr, nullStream) import Text.Shakespeare.Text (st) import qualified Turtle as Sh import Text.Pandoc.Filter.Plot.Types -- | Check that the supplied command results in -- an exit code of 0 (i.e. no errors) commandSuccess :: Text -> IO Bool commandSuccess s = do ec <- runProcess $ setStdout nullStream $ setStderr nullStream $ shell (unpack s) return $ ec == ExitSuccess -- | Checks that an executable is available on path, at all. existsOnPath :: FilePath -> IO Bool existsOnPath fp = Sh.which (Sh.fromString fp) >>= fmap isJust . return -- | Try to find the executable and normalise its path. -- If it cannot be found, it is left unchanged - just in case. tryToFindExe :: String -> IO FilePath tryToFindExe fp = findExecutable fp >>= maybe (return fp) return -- | Path to the executable of a toolkit. If the executable can -- be found, then it will be the full path to it. executable :: Toolkit -> Configuration -> IO FilePath executable Matplotlib = tryToFindExe . matplotlibExe executable PlotlyPython = tryToFindExe . plotlyPythonExe executable PlotlyR = tryToFindExe . plotlyRExe executable Matlab = tryToFindExe . matlabExe executable Mathematica = tryToFindExe . mathematicaExe executable Octave = tryToFindExe . octaveExe executable GGPlot2 = tryToFindExe . ggplot2Exe executable GNUPlot = tryToFindExe . gnuplotExe executable Graphviz = tryToFindExe . graphvizExe -- | Internal description of all information -- needed to output a figure. data OutputSpec = OutputSpec { oConfiguration :: Configuration -- ^ Pandoc-plot configuration , oFigureSpec :: FigureSpec -- ^ Figure spec , oScriptPath :: FilePath -- ^ Path to the script to render , oFigurePath :: FilePath -- ^ Figure output path }