diff options
Diffstat (limited to 'Text/Pandoc/PDF.hs')
-rw-r--r-- | Text/Pandoc/PDF.hs | 134 |
1 files changed, 0 insertions, 134 deletions
diff --git a/Text/Pandoc/PDF.hs b/Text/Pandoc/PDF.hs deleted file mode 100644 index 1e2d5e9b5..000000000 --- a/Text/Pandoc/PDF.hs +++ /dev/null @@ -1,134 +0,0 @@ -{- -Copyright (C) 2008 John MacFarlane <jgm@berkeley.edu> - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --} - -{- | - Module : Text.Pandoc.PDF - Copyright : Copyright (C) 2006-7 John MacFarlane - License : GNU GPL, version 2 or above - - Maintainer : John MacFarlane <jgm@berkeley.edu> - Stability : alpha - Portability : portable - -Functions for producing a PDF file from LaTeX. --} -module Text.Pandoc.PDF ( saveLaTeXAsPDF ) where -import Data.List ( isInfixOf ) -import System.Directory -import System.FilePath ( (</>), (<.>), takeBaseName ) -import System.Process ( runProcess, waitForProcess ) -import System.Exit -import System.Environment ( getEnvironment ) -import Text.Pandoc.Shared ( withTempDir ) -import Prelude hiding ( writeFile, readFile, putStrLn ) -import System.IO ( stderr, openFile, IOMode (..), hClose ) -import System.IO.UTF8 - --- | Produce an PDF file from LaTeX. -saveLaTeXAsPDF :: FilePath -- ^ Pathname of PDF file to be produced. - -> FilePath -- ^ Relative directory of source file. - -> String -- ^ LaTeX document. - -> IO () -saveLaTeXAsPDF destinationPDFPath sourceDirRelative latex = do - -- check for pdflatex and bibtex in path: - latexPathMaybe <- findExecutable "pdflatex" - bibtexPathMaybe <- findExecutable "bibtex" - let latexPath = case latexPathMaybe of - Nothing -> error $ "The 'pdflatex' command, which is needed to build a PDF file, was not found." - Just x -> x - let bibtexPath = case bibtexPathMaybe of - Nothing -> error $ "The 'bibtex' command, which is needed to build an PDF file, was not found." - Just x -> x - sourceDirAbsolute <- getCurrentDirectory >>= return . (</> sourceDirRelative) >>= canonicalizePath - withTempDir "pandoc-pdf" $ \tempDir -> do - env <- getEnvironment - let env' = ("TEXINPUTS", ".:" ++ sourceDirAbsolute ++ ":") : env - let baseName = "input" - writeFile (tempDir </> baseName <.> "tex") latex - let runLatex = runProgram latexPath ["-interaction=nonstopmode", baseName] tempDir env' - let runBibtex = runProgram bibtexPath [baseName] tempDir env' - messages1 <- runLatex - let logPath = tempDir </> baseName <.> "log" - tocExists <- doesFileExist (tempDir </> baseName <.> "toc") - logContents <- readFile logPath - let undefinedRefs = "There were undefined references" `isInfixOf` logContents - let needsBibtex = "itation" `isInfixOf` logContents - if needsBibtex - then runBibtex >>= hPutStr stderr . unlines - else return () - if tocExists || undefinedRefs - then do - messages2 <- runLatex - logContents' <- readFile logPath - let stillUndefinedRefs = "There were undefined references" `isInfixOf` logContents' - if stillUndefinedRefs - then runLatex >>= hPutStr stderr . unlines - else hPutStr stderr $ unlines messages2 - else - hPutStr stderr $ unlines messages1 - let pdfPath = tempDir </> baseName <.> "pdf" - pdfExists <- doesFileExist pdfPath - if pdfExists - then copyFile pdfPath destinationPDFPath - else error "The PDF could not be created." - -runProgram :: FilePath -- ^ pathname of executable - -> [String] -- ^ arguments - -> FilePath -- ^ working directory - -> [(String, String)] -- ^ environment - -> IO [String] -runProgram cmdPath arguments workingDir env = do - let runOutputPath = workingDir </> "output" <.> "tmp" - runOutput <- openFile runOutputPath WriteMode - ph <- runProcess cmdPath arguments (Just workingDir) (Just env) Nothing (Just runOutput) (Just runOutput) - ec <- waitForProcess ph -- requires compilation with -threaded - hClose runOutput - case ec of - ExitSuccess -> return [] - _ -> do - output <- readFile runOutputPath - if (takeBaseName cmdPath) == "bibtex" - then return $! lines output - else do - return $! - (if "`ucs.sty' not found" `isInfixOf` output - then ["Please install the 'unicode' package from CTAN:", - " http://www.ctan.org/tex-archive/macros/latex/contrib/unicode/"] - else []) ++ - (if "`ulem.sty' not found" `isInfixOf` output - then ["Please install the 'ulem' package from CTAN:", - " http://www.ctan.org/tex-archive/macros/latex/contrib/misc/"] - else []) ++ - (if "`graphicx.sty' not found" `isInfixOf` output - then ["Please install the 'graphicx' package from CTAN:", - " http://www.ctan.org/tex-archive/macros/latex/required/graphics/"] - else []) ++ - (if "`fancyhdr.sty' not found" `isInfixOf` output - then ["Please install the 'fancyhdr' package from CTAN:", - " http://www.ctan.org/tex-archive/macros/latex/contrib/fancyhdr/"] - else []) ++ - (if "`array.sty' not found" `isInfixOf` output - then ["Please install the 'array' package from CTAN:", - " http://www.ctan.org/tex-archive/macros/latex/required/tools/"] - else []) ++ - (filter isUseful $ lines output) - where isUseful ln = take 1 ln == "!" || - take 2 ln == "l." || - "Error" `isInfixOf` ln || - "error" `isInfixOf` ln - |