git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Improved handling of included files.
6dff7dcJohn MacFarlane
src/Text/Pandoc/Readers/LaTeX.hs+24−11
@@ -1,3 +1,4 @@
1+{-# LANGUAGE ScopedTypeVariables #-}
1{-
2{-
2Copyright (C) 2006-2012 John MacFarlane <jgm@berkeley.edu>
3Copyright (C) 2006-2012 John MacFarlane <jgm@berkeley.edu>
3
4
@@ -45,7 +46,8 @@ import Text.Pandoc.Builder
45import Data.Char (isLetter, isPunctuation, isSpace)
46import Data.Char (isLetter, isPunctuation, isSpace)
46import Control.Applicative
47import Control.Applicative
47import Data.Monoid
48import Data.Monoid
49+import System.Environment (getEnv)
48−import System.FilePath (replaceExtension)
50+import System.FilePath (replaceExtension, (</>))
49import Data.List (intercalate)
51import Data.List (intercalate)
50import qualified Data.Map as M
52import qualified Data.Map as M
51import qualified Control.Exception as E
53import qualified Control.Exception as E
@@ -682,27 +684,38 @@ handleIncludes :: String -> IO String
682handleIncludes [] = return []
684handleIncludes [] = return []
683handleIncludes ('\\':xs) =
685handleIncludes ('\\':xs) =
684 case runParser include defaultParserState "input" ('\\':xs) of
686 case runParser include defaultParserState "input" ('\\':xs) of
685− Right (fs, rest) -> do let getfile f = E.catch (UTF8.readFile f)
687+ Right (fs, rest) -> do yss <- mapM readTeXFile fs
686− (\e -> let _ = (e :: E.SomeException)
687− in return "")
688− yss <- mapM getfile fs
689− (intercalate "\n" yss ++) `fmap`
688+ handleIncludes $ intercalate "\n" yss ++ rest
690− handleIncludes rest
691 _ -> case runParser (verbCmd <|> verbatimEnv) defaultParserState
689 _ -> case runParser (verbCmd <|> verbatimEnv) defaultParserState
692 "input" ('\\':xs) of
690 "input" ('\\':xs) of
693 Right (r, rest) -> (r ++) `fmap` handleIncludes rest
691 Right (r, rest) -> (r ++) `fmap` handleIncludes rest
694 _ -> ('\\':) `fmap` handleIncludes xs
692 _ -> ('\\':) `fmap` handleIncludes xs
695handleIncludes (x:xs) = (x:) `fmap` handleIncludes xs
693handleIncludes (x:xs) = (x:) `fmap` handleIncludes xs
696
694
695+readTeXFile :: FilePath -> IO String
696+readTeXFile f = do
697+ texinputs <- E.catch (getEnv "TEXINPUTS") $ \(_ :: E.SomeException) ->
698+ return "."
699+ let ds = splitBy (==':') texinputs
700+ readFileFromDirs ds f
701+
702+readFileFromDirs :: [FilePath] -> FilePath -> IO String
703+readFileFromDirs [] _ = return ""
704+readFileFromDirs (d:ds) f =
705+ E.catch (UTF8.readFile $ d </> f) $ \(_ :: E.SomeException) ->
706+ readFileFromDirs ds f
707+
697include :: LP ([FilePath], String)
708include :: LP ([FilePath], String)
698include = do
709include = do
699− name <- controlSeq "include" <|> controlSeq "usepackage"
710+ name <- controlSeq "include"
711+ <|> controlSeq "input"
712+ <|> controlSeq "usepackage"
700 skipopts
713 skipopts
701 fs <- (splitBy (==',')) <$> braced
714 fs <- (splitBy (==',')) <$> braced
702 rest <- getInput
715 rest <- getInput
703− let fs' = if name == "include"
716+ let fs' = if name == "usepackage"
704− then map (flip replaceExtension ".tex") fs
717+ then map (flip replaceExtension ".sty") fs
705− else map (flip replaceExtension ".sty") fs
718+ else map (flip replaceExtension ".tex") fs
706 return (fs', rest)
719 return (fs', rest)
707
720
708verbCmd :: LP (String, String)
721verbCmd :: LP (String, String)