git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: support `\lstinputlisting`.

Closes #2116.

commit6949d74e01cceab360db4dd8f4b1c0550b246908 authorJohn MacFarlane <jgm@berkeley.edu> dateWed 8 Feb 2017, 00:07 (10 years ago) parente4d7bed
1 file changed+34−11
src/Text/Pandoc/Readers/LaTeX.hs+34−11
src/Text/Pandoc/Readers/LaTeX.hs+34−11
@@ -48,10 +48,11 @@ import Data.Maybe (fromMaybe, maybeToList)
4848import System.FilePath (replaceExtension, takeExtension, addExtension)
4949import Data.List (intercalate)
5050import qualified Data.Map as M
51−import Text.Pandoc.Highlighting (fromListingsLanguage)
51+import Text.Pandoc.Highlighting (fromListingsLanguage, languagesByExtension)
5252import Text.Pandoc.ImageSize (numUnit, showFl)
5353import Control.Monad.Except (throwError)
54−import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, warningWithPos )
54+import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, warningWithPos,
55+ readFileFromDirs)
5556
5657-- | Parse LaTeX from string and return 'Pandoc' document.
5758readLaTeX :: PandocMonad m
@@ -357,6 +358,8 @@ blockCommands = M.fromList $
357358 addMeta "bibliography" . splitBibs))
358359 , ("addbibresource", mempty <$ (skipopts *> braced >>=
359360 addMeta "bibliography" . splitBibs))
361+ -- includes
362+ , ("lstinputlisting", inputListing)
360363 ] ++ map ignoreBlocks
361364 -- these commands will be ignored unless --parse-raw is specified,
362365 -- in which case they will appear as raw latex blocks
@@ -959,6 +962,34 @@ include = do
959962 dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
960963 mconcat <$> mapM (insertIncludedFile blocks dirs) fs'
961964
965+inputListing :: PandocMonad m => LP m Blocks
966+inputListing = do
967+ options <- option [] keyvals
968+ f <- filter (/='"') <$> braced
969+ dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
970+ codeLines <- lines <$> readFileFromDirs dirs f
971+ let (ident,classes,kvs) = parseListingsOptions options
972+ let language = case lookup "language" options >>= fromListingsLanguage of
973+ Just l -> [l]
974+ Nothing -> take 1 $ languagesByExtension (takeExtension f)
975+ let firstline = fromMaybe 1 $ lookup "firstline" options >>= safeRead
976+ let lastline = fromMaybe (length codeLines) $
977+ lookup "lastline" options >>= safeRead
978+ let codeContents = intercalate "\n" $ take (1 + lastline - firstline) $
979+ drop (firstline - 1) codeLines
980+ return $ codeBlockWith (ident,ordNub (classes ++ language),kvs) codeContents
981+
982+parseListingsOptions :: [(String, String)] -> Attr
983+parseListingsOptions options =
984+ let kvs = [ (if k == "firstnumber"
985+ then "startFrom"
986+ else k, v) | (k,v) <- options ]
987+ classes = [ "numberLines" |
988+ lookup "numbers" options == Just "left" ]
989+ ++ maybeToList (lookup "language" options
990+ >>= fromListingsLanguage)
991+ in (fromMaybe "" (lookup "label" options), classes, kvs)
992+
962993----
963994
964995keyval :: PandocMonad m => LP m (String, String)
@@ -1037,15 +1068,7 @@ environments = M.fromList
10371068 , ("verbatim", codeBlock <$> verbEnv "verbatim")
10381069 , ("Verbatim", fancyverbEnv "Verbatim")
10391070 , ("BVerbatim", fancyverbEnv "BVerbatim")
1040− , ("lstlisting", do options <- option [] keyvals
1041− let kvs = [ (if k == "firstnumber"
1042− then "startFrom"
1043− else k, v) | (k,v) <- options ]
1044− let classes = [ "numberLines" |
1045− lookup "numbers" options == Just "left" ]
1046− ++ maybeToList (lookup "language" options
1047− >>= fromListingsLanguage)
1048− let attr = (fromMaybe "" (lookup "label" options),classes,kvs)
1071+ , ("lstlisting", do attr <- parseListingsOptions <$> option [] keyvals
10491072 codeBlockWith attr <$> verbEnv "lstlisting")
10501073 , ("minted", do options <- option [] keyvals
10511074 lang <- grouped (many1 $ satisfy (/='}'))