LaTeX reader: Refactored inlineCommand.

This commit is contained in:
John MacFarlane 2017-12-22 16:45:13 -08:00
parent dd217f75e5
commit 9daf22fa61

View file

@ -237,19 +237,21 @@ withVerbatimMode parser = do
return result
rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
=> LP m a -> ParserT String s m String
=> LP m a -> ParserT String s m (a, String)
rawLaTeXParser parser = do
inp <- getInput
let toks = tokenize "source" $ T.pack inp
pstate <- getState
let lstate = def{ sOptions = extractReaderOptions pstate }
res <- lift $ runParserT ((,) <$> try (snd <$> withRaw parser) <*> getState)
lstate "source" toks
let lstate = def{ sOptions = extractReaderOptions pstate
, sMacros = extractMacros pstate }
let rawparser = (,) <$> withRaw parser <*> getState
res <- lift $ runParserT rawparser lstate "chunk" toks
case res of
Left _ -> mzero
Right (raw, st) -> do
Right ((val, raw), st) -> do
updateState (updateMacros (sMacros st <>))
takeP (T.length (untokenize raw))
rawstring <- takeP (T.length (untokenize raw))
return (val, rawstring)
applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
=> String -> ParserT String s m String
@ -268,33 +270,18 @@ rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
=> ParserT String s m String
rawLaTeXBlock = do
lookAhead (try (char '\\' >> letter))
rawLaTeXParser (environment <|> macroDef <|> blockCommand)
snd <$> rawLaTeXParser (environment <|> macroDef <|> blockCommand)
rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
=> ParserT String s m String
rawLaTeXInline = do
lookAhead (try (char '\\' >> letter) <|> char '$')
rawLaTeXParser (inlineEnvironment <|> inlineCommand')
snd <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand')
inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
inlineCommand = do
lookAhead (try (char '\\' >> letter) <|> char '$')
inp <- getInput
let toks = tokenize "chunk" $ T.pack inp
let rawinline = do
(il, raw) <- try $ withRaw (inlineEnvironment <|> inlineCommand')
st <- getState
return (il, raw, st)
pstate <- getState
let lstate = def{ sOptions = extractReaderOptions pstate
, sMacros = extractMacros pstate }
res <- runParserT rawinline lstate "source" toks
case res of
Left _ -> mzero
Right (il, raw, s) -> do
updateState $ updateMacros (const $ sMacros s)
takeP (T.length (untokenize raw))
return il
fst <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand')
tokenize :: SourceName -> Text -> [Tok]
tokenize sourcename = totoks (initialPos sourcename)