@@ -48,10 +48,11 @@ import Data.Maybe (fromMaybe, maybeToList)
48import System.FilePath (replaceExtension, takeExtension, addExtension)
48import System.FilePath (replaceExtension, takeExtension, addExtension)
49import Data.List (intercalate)
49import Data.List (intercalate)
50import qualified Data.Map as M
50import qualified Data.Map as M
51−import Text.Pandoc.Highlighting (fromListingsLanguage)
51+import Text.Pandoc.Highlighting (fromListingsLanguage, languagesByExtension)
52import Text.Pandoc.ImageSize (numUnit, showFl)
52import Text.Pandoc.ImageSize (numUnit, showFl)
53import Control.Monad.Except (throwError)
53import Control.Monad.Except (throwError)
54−import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, warningWithPos )
54+import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, warningWithPos,
56-- | Parse LaTeX from string and return 'Pandoc' document.
57-- | Parse LaTeX from string and return 'Pandoc' document.
57readLaTeX :: PandocMonad m
58readLaTeX :: PandocMonad m
@@ -357,6 +358,8 @@ blockCommands = M.fromList $
357 addMeta "bibliography" . splitBibs))
358 addMeta "bibliography" . splitBibs))
358 , ("addbibresource", mempty <$ (skipopts *> braced >>=
359 , ("addbibresource", mempty <$ (skipopts *> braced >>=
359 addMeta "bibliography" . splitBibs))
360 addMeta "bibliography" . splitBibs))
362+ , ("lstinputlisting", inputListing)
360 ] ++ map ignoreBlocks
363 ] ++ map ignoreBlocks
361 -- these commands will be ignored unless --parse-raw is specified,
364 -- these commands will be ignored unless --parse-raw is specified,
362 -- in which case they will appear as raw latex blocks
365 -- in which case they will appear as raw latex blocks
@@ -959,6 +962,34 @@ include = do
959 dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
962 dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
960 mconcat <$> mapM (insertIncludedFile blocks dirs) fs'
963 mconcat <$> mapM (insertIncludedFile blocks dirs) fs'
965+inputListing :: PandocMonad m => LP m Blocks
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
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
982+parseListingsOptions :: [(String, String)] -> Attr
983+parseListingsOptions options =
984+ let kvs = [ (if k == "firstnumber"
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)
964keyval :: PandocMonad m => LP m (String, String)
995keyval :: PandocMonad m => LP m (String, String)
@@ -1037,15 +1068,7 @@ environments = M.fromList
1037 , ("verbatim", codeBlock <$> verbEnv "verbatim")
1068 , ("verbatim", codeBlock <$> verbEnv "verbatim")
1038 , ("Verbatim", fancyverbEnv "Verbatim")
1069 , ("Verbatim", fancyverbEnv "Verbatim")
1039 , ("BVerbatim", fancyverbEnv "BVerbatim")
1070 , ("BVerbatim", fancyverbEnv "BVerbatim")
1040− , ("lstlisting", do options <- option [] keyvals
1071+ , ("lstlisting", do attr <- parseListingsOptions <$> option [] keyvals
1041− let kvs = [ (if k == "firstnumber"
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)
1049 codeBlockWith attr <$> verbEnv "lstlisting")
1072 codeBlockWith attr <$> verbEnv "lstlisting")
1050 , ("minted", do options <- option [] keyvals
1073 , ("minted", do options <- option [] keyvals
1051 lang <- grouped (many1 $ satisfy (/='}'))
1074 lang <- grouped (many1 $ satisfy (/='}'))