summaryrefslogtreecommitdiff
path: root/src/Math.hs
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2015-11-06 20:46:58 +0100
committerGregor Kleen <gkleen@yggdrasil.li>2015-11-06 20:46:58 +0100
commita1068fbdeea74a12e4f33069cf091302f87e8d17 (patch)
treeb5483ab2b71133f9445c6479fb0287e8a62263ea /src/Math.hs
parent14623524bd0d2d01c7a539c771f506a010a46695 (diff)
downloaddirty-haskell.org-a1068fbdeea74a12e4f33069cf091302f87e8d17.tar
dirty-haskell.org-a1068fbdeea74a12e4f33069cf091302f87e8d17.tar.gz
dirty-haskell.org-a1068fbdeea74a12e4f33069cf091302f87e8d17.tar.bz2
dirty-haskell.org-a1068fbdeea74a12e4f33069cf091302f87e8d17.tar.xz
dirty-haskell.org-a1068fbdeea74a12e4f33069cf091302f87e8d17.zip
Started work on math compilation
Diffstat (limited to 'src/Math.hs')
-rw-r--r--src/Math.hs46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/Math.hs b/src/Math.hs
new file mode 100644
index 0000000..e927fdd
--- /dev/null
+++ b/src/Math.hs
@@ -0,0 +1,46 @@
1module Math
2 ( compileMath
3 ) where
4
5import System.IO.Temp (withSystemTempDirectory)
6import System.Process (callProcess)
7import System.Directory (copyFile, getCurrentDirectory, setCurrentDirectory)
8import System.FilePath (takeFileName, FilePath(..), (</>))
9
10import Control.Monad
11import Control.Exception (bracket)
12
13import Control.DeepSeq (($!!))
14
15compileMath :: String -> IO String
16compileMath = withSystemTempDirectory "math" . compileMath'
17
18compileMath' :: String -> FilePath -> IO String
19compileMath' input tmpDir = do
20 mapM_ (copyToTmp . ("tex" </>)) [ "preamble.tex"
21 , "preview.dtx"
22 , "preview.ins"
23 ]
24 withCurrentDirectory tmpDir $ do
25 callProcess "latex" [ "-interaction=batchmode"
26 , "preview.ins"
27 ]
28 writeFile (tmpDir </> "image.tex") input
29 callProcess "latex" [ "-interaction=batchmode"
30 , "image.tex"
31 ]
32 callProcess "dvisvgm" [ "--exact"
33 , "--no-fonts"
34 , tmpDir </> "image.dvi"
35 ]
36 (\x -> return $!! x) =<< (readFile $ tmpDir </> "image.svg")
37 where
38 copyToTmp fp = copyFile fp (tmpDir </> takeFileName fp)
39
40withCurrentDirectory :: FilePath -- ^ Directory to execute in
41 -> IO a -- ^ Action to be executed
42 -> IO a
43withCurrentDirectory dir action =
44 bracket getCurrentDirectory setCurrentDirectory $ \ _ -> do
45 setCurrentDirectory dir
46 action