module TypesetAsImage where import System.FilePath (replaceExtension) import System.Directory (removeFile) import System.IO (openTempFile, hClose, hPutStr, getContents) import System (system) import Data.List (intercalate) import Data.Char -- Needs package: base64-string import Codec.Binary.Base64.String as Base64 import Text.XHtml import System.IO.Unsafe (unsafeInterleaveIO) import BeautifyTeXOutput (beautifyFormula) import Paths (getTemporaryDirectory, getPathToAdditionalTeXFiles) typesetAsHtmlImg formula = do pngImage <- typesetAsPNG formula return $ asHtml pngImage where asHtml pngImage = let header = drop 16 pngImage w = sum $ zipWith (*) [256^3, 256^2, 256, 1] $ map ord $ take 4 header h = sum $ zipWith (*) [256^3, 256^2, 256, 1] $ map ord $ take 4 $ drop 4 header in image ! [ src $ "data:image/png;base64," ++ Base64.encode pngImage , alt formula , width (show (w `div` 2)) , height (show (h `div` 2)) ] typesetAsPNG formula = unsafeInterleaveIO $ do tmp_dir <- getTemporaryDirectory (tempPath, tempHandle) <- openTempFile tmp_dir "temp.tex" let pathTo ext = replaceExtension tempPath ext let texSource = asTeX formula hPutStr tempHandle texSource hClose tempHandle tex_dir <- getPathToAdditionalTeXFiles system $ "TEXINPUTS=\"" ++ tex_dir ++ ":$TEXINPUTS\" latex -interaction=batchmode --output-dir=\"" ++ tmp_dir ++ "\" " ++ pathTo "tex" ++ " > /dev/null" removeFile $ pathTo "tex" removeFile $ pathTo "aux" removeFile $ pathTo "log" system $ "dvipng -x 2400 -T tight -z 9 -bg transparent -o " ++ pathTo "png" ++ " " ++ pathTo "dvi" ++ " > /dev/null" removeFile $ pathTo "dvi" pngImage <- readFile $ pathTo "png" removeFile $ pathTo "png" return pngImage asTeX formula = intercalate "\n" $ [ "\\documentclass{article}" , "\\usepackage{amsmath}" , "\\pagestyle{empty}" , "" , "\\begin{document}" , "\\input{lambdaTeX}" , "" , unlines $ map ("> "++) $ lines $ beautifyFormula formula , "" , "\\end{document}" ]