git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: be more forgiving in key/value option parsing.

We now allow arbitrary LaTeX values. This helps with #4761. The `\maxwidth` is still not propagated to the latex destination, but at least we don't choke on parsing.

commit339a9e1b8b2aa34aab847d114a65d2d759bd25ed authorJohn MacFarlane <jgm@berkeley.edu> dateSun 15 Jul 2018, 12:53 (8 years ago) parent582b4af
1 file changed+39−16
src/Text/Pandoc/Readers/LaTeX.hs+39−16
src/Text/Pandoc/Readers/LaTeX.hs+39−16
@@ -501,13 +501,17 @@ setpos spos (Tok _ tt txt) = Tok spos tt txt
501501
502502anyControlSeq :: PandocMonad m => LP m Tok
503503anyControlSeq = satisfyTok isCtrlSeq
504− where isCtrlSeq (Tok _ (CtrlSeq _) _) = True
505− isCtrlSeq _ = False
504+
505+isCtrlSeq :: Tok -> Bool
506+isCtrlSeq (Tok _ (CtrlSeq _) _) = True
507+isCtrlSeq _ = False
506508
507509anySymbol :: PandocMonad m => LP m Tok
508−anySymbol = satisfyTok isSym
509− where isSym (Tok _ Symbol _) = True
510− isSym _ = False
510+anySymbol = satisfyTok isSymbolTok
511+
512+isSymbolTok :: Tok -> Bool
513+isSymbolTok (Tok _ Symbol _) = True
514+isSymbolTok _ = False
511515
512516spaces :: PandocMonad m => LP m ()
513517spaces = skipMany (satisfyTok (tokTypeIn [Comment, Spaces, Newline]))
@@ -542,8 +546,10 @@ sp = whitespace <|> endline
542546
543547whitespace :: PandocMonad m => LP m ()
544548whitespace = () <$ satisfyTok isSpaceTok
545− where isSpaceTok (Tok _ Spaces _) = True
546− isSpaceTok _ = False
549+
550+isSpaceTok :: Tok -> Bool
551+isSpaceTok (Tok _ Spaces _) = True
552+isSpaceTok _ = False
547553
548554newlineTok :: PandocMonad m => LP m ()
549555newlineTok = () <$ satisfyTok isNewlineTok
@@ -554,8 +560,10 @@ isNewlineTok _ = False
554560
555561comment :: PandocMonad m => LP m ()
556562comment = () <$ satisfyTok isCommentTok
557− where isCommentTok (Tok _ Comment _) = True
558− isCommentTok _ = False
563+
564+isCommentTok :: Tok -> Bool
565+isCommentTok (Tok _ Comment _) = True
566+isCommentTok _ = False
559567
560568anyTok :: PandocMonad m => LP m Tok
561569anyTok = satisfyTok (const True)
@@ -819,18 +827,25 @@ dolstinline = do
819827keyval :: PandocMonad m => LP m (String, String)
820828keyval = try $ do
821829 Tok _ Word key <- satisfyTok isWordTok
822− let isSpecSym (Tok _ Symbol t) = t /= "]" && t /= ","
823− isSpecSym _ = False
824830 optional sp
825− val <- option [] $ do
831+ val <- option mempty $ do
826832 symbol '='
827833 optional sp
828− braced <|> many1 (satisfyTok isWordTok <|> satisfyTok isSpecSym
829− <|> anyControlSeq)
830− optional sp
834+ (untokenize <$> braced) <|>
835+ (mconcat <$> many1 (
836+ (untokenize . snd <$> withRaw braced)
837+ <|>
838+ (untokenize <$> (many1
839+ (satisfyTok
840+ (\t -> case t of
841+ Tok _ Symbol "]" -> False
842+ Tok _ Symbol "," -> False
843+ Tok _ Symbol "{" -> False
844+ Tok _ Symbol "}" -> False
845+ _ -> True))))))
831846 optional (symbol ',')
832847 optional sp
833− return (T.unpack key, T.unpack . untokenize $ val)
848+ return (T.unpack key, T.unpack $ T.strip val)
834849
835850keyvals :: PandocMonad m => LP m [(String, String)]
836851keyvals = try $ symbol '[' >> manyTill keyval (symbol ']')
@@ -1644,8 +1659,16 @@ inlineCommands = M.union inlineLanguageCommands $ M.fromList
16441659 , ("foreignlanguage", foreignlanguage)
16451660 -- include
16461661 , ("input", include "input")
1662+ -- plain tex stuff that should just be passed through as raw tex
1663+ , ("ifdim", ifdim)
16471664 ]
16481665
1666+ifdim :: PandocMonad m => LP m Inlines
1667+ifdim = do
1668+ contents <- manyTill anyTok (controlSeq "fi")
1669+ return $ rawInline "latex" $ T.unpack $
1670+ "\\ifdim" <> untokenize contents <> "\\fi"
1671+
16491672makeUppercase :: Inlines -> Inlines
16501673makeUppercase = fromList . walk (alterStr (map toUpper)) . toList
16511674