git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Improved citation parsing.

This fixes a run-time error that occured with `\citet{}` (empty list of keys). It also ensures that empty keys don't get produced.

commit75ea0c4d0dd9133db8754ff640b9d3b316170e64 authorJohn MacFarlane <fiddlosopher@gmail.com> dateMon 21 Oct 2013, 09:33 (13 years ago) parent71f5af6
1 file changed+13−6
src/Text/Pandoc/Readers/LaTeX.hs+13−6
src/Text/Pandoc/Readers/LaTeX.hs+13−6
@@ -43,7 +43,7 @@ import qualified Text.Pandoc.UTF8 as UTF8
4343import Data.Char ( chr, ord )
4444import Control.Monad
4545import Text.Pandoc.Builder
46−import Data.Char (isLetter)
46+import Data.Char (isLetter, isAlphaNum)
4747import Control.Applicative
4848import Data.Monoid
4949import Data.Maybe (fromMaybe)
@@ -1065,6 +1065,7 @@ simpleCiteArgs = try $ do
10651065 first <- optionMaybe $ toList <$> opt
10661066 second <- optionMaybe $ toList <$> opt
10671067 char '{'
1068+ optional sp
10681069 keys <- manyTill citationLabel (char '}')
10691070 let (pre, suf) = case (first , second ) of
10701071 (Just s , Nothing) -> (mempty, s )
@@ -1080,18 +1081,24 @@ simpleCiteArgs = try $ do
10801081 return $ addPrefix pre $ addSuffix suf $ map conv keys
10811082
10821083citationLabel :: LP String
1083−citationLabel = trim <$>
1084− (many1 (satisfy $ \c -> c /=',' && c /='}') <* optional (char ',') <* optional sp)
1084+citationLabel = optional sp *>
1085+ (many1 (satisfy isBibtexKeyChar)
1086+ <* optional sp
1087+ <* optional (char ',')
1088+ <* optional sp)
1089+ where isBibtexKeyChar c = isAlphaNum c || c `elem` ".:;?!`'()/*@_+=-[]*"
10851090
10861091cites :: CitationMode -> Bool -> LP [Citation]
10871092cites mode multi = try $ do
10881093 cits <- if multi
10891094 then many1 simpleCiteArgs
10901095 else count 1 simpleCiteArgs
1091− let (c:cs) = concat cits
1096+ let cs = concat cits
10921097 return $ case mode of
1093− AuthorInText -> c {citationMode = mode} : cs
1094− _ -> map (\a -> a {citationMode = mode}) (c:cs)
1098+ AuthorInText -> case cs of
1099+ (c:rest) -> c {citationMode = mode} : rest
1100+ [] -> []
1101+ _ -> map (\a -> a {citationMode = mode}) cs
10951102
10961103citation :: String -> CitationMode -> Bool -> LP Inlines
10971104citation name mode multi = do