packages feed

lhslatex-0.1.0.0: lhslatex.hs

import System.Directory
import System.Environment
import Text.Regex.Posix
import System.FilePath.Posix
import Data.List
import System.Process
import Control.Monad

createTmpDir :: FilePath -> IO FilePath
createTmpDir base = do
  let dir = addExtension base ".XXXXXXXXXX"
  exists <- doesDirectoryExist dir
  when exists $ removeDirectoryRecursive dir
  createDirectory dir
  return dir

splitArgs :: [String] -> (String,[String])
splitArgs args =
  let (file, args') = partition (=~ "\\.lhs$") args
      file' = case file of
                [f] -> f
                _   -> error "could not identify .lhs file"
      (stem,_) = splitExtension file'
  in (stem, args')

moveFile :: FilePath -> FilePath -> IO ()
moveFile fp1 fp2 = do
--  error $ show (fp1,fp2)
  exists <- doesFileExist fp2
  when exists (removeFile fp2)
  renameFile fp1 fp2

main :: IO ()
main = do
  args <- getArgs
  let (stem,args') = splitArgs args
      file = addExtension stem ".lhs"
      texFile = addExtension stem ".tex"
      pdfFile = addExtension stem ".pdf"
      auxFile = addExtension stem ".aux"
  old_dir <- getCurrentDirectory
  tmp_dir <- createTmpDir (old_dir </> "lhslatex")
  tInputs' <- lookupEnv "TEXINPUTS"
  let tInputs = case tInputs' of
                  Just e  -> e
                  Nothing -> ""
  setEnv "TEXINPUTS" $ old_dir ++ ":" ++ tInputs
  lhsFile <- readFile file
  setCurrentDirectory tmp_dir
  tex <- readProcess "lhs2TeX" ["-"] lhsFile
  writeFile texFile tex
  callProcess "pdflatex" (args' ++ [texFile])
  moveFile (tmp_dir </> pdfFile) (old_dir </> pdfFile)
  moveFile (tmp_dir </> auxFile) (old_dir </> auxFile)
  removeDirectoryRecursive tmp_dir