summaryrefslogtreecommitdiff
path: root/src/Text
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2017-07-23 20:46:37 +0200
committerJohn MacFarlane <jgm@berkeley.edu>2017-07-24 00:02:55 +0200
commitbe14e2b5013a442989a338c13baa4d16881f849e (patch)
treed16aa0966d6bc5db893e8c403f260954bf5d6cab /src/Text
parentd453b3319a14ec592438762f3946cd961d893639 (diff)
LaTeX reader: some improvements in macro parsing.
Fixed applyMacros so that it operates on the whole string, not just the first token! Don't remove macro definitions from the output, even if Ext_latex_macros is set, so that macros will be applied. Since they're only applied to math in Markdown, removing the macros can have bad effects. Even for math macros, keeping them should be harmless.
Diffstat (limited to 'src/Text')
-rw-r--r--src/Text/Pandoc/Readers/LaTeX.hs38
1 files changed, 19 insertions, 19 deletions
diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs
index 183eb89a6..cc567d5bd 100644
--- a/src/Text/Pandoc/Readers/LaTeX.hs
+++ b/src/Text/Pandoc/Readers/LaTeX.hs
@@ -200,12 +200,6 @@ withVerbatimMode parser = do
updateState $ \st -> st{ sVerbatimMode = False }
return result
-rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
- => ParserT String s m String
-rawLaTeXBlock = do
- lookAhead (try (char '\\' >> letter))
- rawLaTeXParser (environment <|> macroDef <|> blockCommand)
-
rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
=> LP m a -> ParserT String s m String
rawLaTeXParser parser = do
@@ -218,7 +212,7 @@ rawLaTeXParser parser = do
case res of
Left _ -> mzero
Right (raw, st) -> do
- updateState (updateMacros (const $ sMacros st))
+ updateState (updateMacros ((sMacros st) <>))
takeP (T.length (untokenize raw))
macro :: (PandocMonad m, HasMacros s, HasReaderOptions s)
@@ -227,21 +221,26 @@ macro = do
guardEnabled Ext_latex_macros
lookAhead (char '\\' *> oneOfStrings ["new", "renew", "provide"] *>
oneOfStrings ["command", "environment"])
- mempty <$ rawLaTeXParser macroDef
- -- since we're applying macros, we remove the defns
+ rawBlock "latex" <$> rawLaTeXParser macroDef
applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
=> String -> ParserT String s m String
-applyMacros s = do
- (guardEnabled Ext_latex_macros >>
- do let retokenize = doMacros 0 *> (toksToString <$> getInput)
+applyMacros s = (guardDisabled Ext_latex_macros >> return s) <|>
+ do let retokenize = doMacros 0 *>
+ (toksToString <$> many (satisfyTok (const True)))
pstate <- getState
let lstate = def{ sOptions = extractReaderOptions pstate
, sMacros = extractMacros pstate }
res <- runParserT retokenize lstate "math" (tokenize (T.pack s))
case res of
Left e -> fail (show e)
- Right s' -> return s') <|> return s
+ Right s' -> return s'
+
+rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
+ => ParserT String s m String
+rawLaTeXBlock = do
+ lookAhead (try (char '\\' >> letter))
+ rawLaTeXParser (environment <|> macroDef <|> blockCommand)
rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
=> ParserT String s m String
@@ -1503,17 +1502,18 @@ authors = try $ do
macroDef :: PandocMonad m => LP m Blocks
macroDef = do
- guardEnabled Ext_latex_macros
mempty <$ ((commandDef <|> environmentDef) <* doMacros 0)
where commandDef = do
(name, macro') <- newcommand
- updateState $ \s -> s{ sMacros = M.insert name macro' (sMacros s) }
+ guardDisabled Ext_latex_macros <|>
+ updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) })
environmentDef = do
(name, macro1, macro2) <- newenvironment
- updateState $ \s -> s{ sMacros =
- M.insert name macro1 (sMacros s) }
- updateState $ \s -> s{ sMacros =
- M.insert ("end" <> name) macro2 (sMacros s) }
+ guardDisabled Ext_latex_macros <|>
+ do updateState $ \s -> s{ sMacros =
+ M.insert name macro1 (sMacros s) }
+ updateState $ \s -> s{ sMacros =
+ M.insert ("end" <> name) macro2 (sMacros s) }
-- @\newenvironment{envname}[n-args][default]{begin}{end}@
-- is equivalent to
-- @\newcommand{\envname}[n-args][default]{begin}@