@@ -768,6 +768,20 @@ verbCmd = do
768768 rest <- getInput
769769 return (r, rest)
770770
771+keyval :: LP (String, String)
772+keyval = try $ do
773+ key <- many1 alphaNum
774+ char '='
775+ val <- many1 alphaNum
776+ skipMany spaceChar
777+ optional (char ',')
778+ skipMany spaceChar
779+ return (key, val)
780+
781+
782+keyvals :: LP [(String, String)]
783+keyvals = try $ char '[' *> manyTill keyval (char ']')
784+
771785verbatimEnv :: LP (String, String)
772786verbatimEnv = do
773787 (_,r) <- withRaw $ do
@@ -804,7 +818,14 @@ environments = M.fromList
804818 verbEnv "code"))
805819 , ("verbatim", codeBlock <$> (verbEnv "verbatim"))
806820 , ("Verbatim", codeBlock <$> (verbEnv "Verbatim"))
807− , ("lstlisting", codeBlock <$> (verbEnv "lstlisting"))
821+ , ("lstlisting", do options <- option [] keyvals
822+ let classes = [ "numberLines" |
823+ lookup "numbers" options == Just "left" ]
824+ let kvs = [ (if k == "firstnumber"
825+ then "startFrom"
826+ else k, v) | (k,v) <- options ]
827+ let attr = ("",classes,kvs)
828+ codeBlockWith attr <$> (verbEnv "lstlisting"))
808829 , ("minted", liftA2 (\l c -> codeBlockWith ("",[l],[]) c)
809830 (grouped (many1 $ satisfy (/= '}'))) (verbEnv "minted"))
810831 , ("obeylines", parseFromString