From 3692e371a75483398b6844cb289b09f311b4c2c1 Mon Sep 17 00:00:00 2001
From: John MacFarlane <fiddlosopher@gmail.com>
Date: Mon, 4 Mar 2013 09:50:11 -0800
Subject: [PATCH] LaTeX reader:  Read optional attributes in lstlisting
 environment.

We convert these to pandoc standard names, e.g. "numberLines"
for "numbers=left", "startFrom=100" from "firstnumber=100".

Still need to add code to convert the language names.
---
 src/Text/Pandoc/Readers/LaTeX.hs | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs
index da21b67ea..887b17068 100644
--- a/src/Text/Pandoc/Readers/LaTeX.hs
+++ b/src/Text/Pandoc/Readers/LaTeX.hs
@@ -768,6 +768,20 @@ verbCmd = do
   rest <- getInput
   return (r, rest)
 
+keyval :: LP (String, String)
+keyval = try $ do
+  key <- many1 alphaNum
+  char '='
+  val <- many1 alphaNum
+  skipMany spaceChar
+  optional (char ',')
+  skipMany spaceChar
+  return (key, val)
+
+
+keyvals :: LP [(String, String)]
+keyvals = try $ char '[' *> manyTill keyval (char ']')
+
 verbatimEnv :: LP (String, String)
 verbatimEnv = do
   (_,r) <- withRaw $ do
@@ -804,7 +818,14 @@ environments = M.fromList
         verbEnv "code"))
   , ("verbatim", codeBlock <$> (verbEnv "verbatim"))
   , ("Verbatim", codeBlock <$> (verbEnv "Verbatim"))
-  , ("lstlisting", codeBlock <$> (verbEnv "lstlisting"))
+  , ("lstlisting", do options <- option [] keyvals
+                      let classes = [ "numberLines" |
+                                      lookup "numbers" options == Just "left" ]
+                      let kvs = [ (if k == "firstnumber"
+                                      then "startFrom"
+                                      else k, v) | (k,v) <- options ]
+                      let attr = ("",classes,kvs)
+                      codeBlockWith attr <$> (verbEnv "lstlisting"))
   , ("minted", liftA2 (\l c -> codeBlockWith ("",[l],[]) c)
             (grouped (many1 $ satisfy (/= '}'))) (verbEnv "minted"))
   , ("obeylines", parseFromString