summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Filter/Pyplot/Scripting.hs
diff options
context:
space:
mode:
authorLaurentRDC <>2019-04-07 01:10:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2019-04-07 01:10:00 (GMT)
commit30fea466d0dd6beb5e55a851e802ea7b470a35d0 (patch)
treeb57fc92c54441a600f9db9f8760e15c72aad4158 /src/Text/Pandoc/Filter/Pyplot/Scripting.hs
parentb870c74b0ab480ca62602ebfd5fe89e3fc4f7094 (diff)
version 2.1.0.02.1.0.0
Diffstat (limited to 'src/Text/Pandoc/Filter/Pyplot/Scripting.hs')
-rw-r--r--src/Text/Pandoc/Filter/Pyplot/Scripting.hs68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/Text/Pandoc/Filter/Pyplot/Scripting.hs b/src/Text/Pandoc/Filter/Pyplot/Scripting.hs
new file mode 100644
index 0000000..ec90780
--- /dev/null
+++ b/src/Text/Pandoc/Filter/Pyplot/Scripting.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+{-|
+Module : Text.Pandoc.Filter.Pyplot.Scripting
+Copyright : (c) Laurent P René de Cotret, 2019
+License : MIT
+Maintainer : laurent.decotret@outlook.com
+Stability : internal
+Portability : portable
+
+This module defines types and functions that help
+with running Python scripts.
+-}
+module Text.Pandoc.Filter.Pyplot.Scripting
+ ( runTempPythonScript
+ , hasBlockingShowCall
+ , PythonScript
+ , ScriptResult(..)
+ ) where
+
+import Data.Hashable (hash)
+import Data.Monoid (Any(..))
+import Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Text.IO as T
+
+import System.Exit (ExitCode (..))
+import System.FilePath ((</>))
+import System.IO.Temp (getCanonicalTemporaryDirectory)
+import System.Process.Typed (runProcess, shell)
+
+-- | String representation of a Python script
+type PythonScript = Text
+
+-- | Possible result of running a Python script
+data ScriptResult
+ = ScriptSuccess
+ | ScriptFailure Int
+
+-- | Take a python script in string form, write it in a temporary directory,
+-- then execute it.
+runTempPythonScript :: String -- ^ Interpreter (e.g. "python" or "python35")
+ -> PythonScript -- ^ Content of the script
+ -> IO ScriptResult -- ^ Result with exit code.
+runTempPythonScript interpreter script = do
+ -- We involve the script hash as a temporary filename
+ -- so that there is never any collision
+ scriptPath <- (</> hashedPath) <$> getCanonicalTemporaryDirectory
+ T.writeFile scriptPath script
+
+ ec <- runProcess $ shell $ mconcat [interpreter, " ", show scriptPath]
+ case ec of
+ ExitSuccess -> return ScriptSuccess
+ ExitFailure code -> return $ ScriptFailure code
+ where
+ hashedPath = show . hash $ script
+
+-- | Detect the presence of a blocking show call, for example "plt.show()"
+hasBlockingShowCall :: PythonScript -> Bool
+hasBlockingShowCall script =
+ anyOf
+ [ "plt.show()" `elem` scriptLines
+ , "pyplot.show()" `elem` scriptLines
+ , "matplotlib.pyplot.show()" `elem` scriptLines
+ ]
+ where
+ scriptLines = T.lines script
+ anyOf xs = getAny $ mconcat $ Any <$> xs \ No newline at end of file