git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Refactored inlineCommand.
9daf22fJohn MacFarlane
src/Text/Pandoc/Readers/LaTeX.hs+11−24
@@ -237,19 +237,21 @@ withVerbatimMode parser = do
237 return result
237 return result
238
238
239rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
239rawLaTeXParser :: (PandocMonad m, HasMacros s, HasReaderOptions s)
240− => LP m a -> ParserT String s m String
240+ => LP m a -> ParserT String s m (a, String)
241rawLaTeXParser parser = do
241rawLaTeXParser parser = do
242 inp <- getInput
242 inp <- getInput
243 let toks = tokenize "source" $ T.pack inp
243 let toks = tokenize "source" $ T.pack inp
244 pstate <- getState
244 pstate <- getState
245− let lstate = def{ sOptions = extractReaderOptions pstate }
245+ let lstate = def{ sOptions = extractReaderOptions pstate
246+ , sMacros = extractMacros pstate }
246− res <- lift $ runParserT ((,) <$> try (snd <$> withRaw parser) <*> getState)
247+ let rawparser = (,) <$> withRaw parser <*> getState
247− lstate "source" toks
248+ res <- lift $ runParserT rawparser lstate "chunk" toks
248 case res of
249 case res of
249 Left _ -> mzero
250 Left _ -> mzero
250− Right (raw, st) -> do
251+ Right ((val, raw), st) -> do
251 updateState (updateMacros (sMacros st <>))
252 updateState (updateMacros (sMacros st <>))
252− takeP (T.length (untokenize raw))
253+ rawstring <- takeP (T.length (untokenize raw))
254+ return (val, rawstring)
253
255
254applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
256applyMacros :: (PandocMonad m, HasMacros s, HasReaderOptions s)
255 => String -> ParserT String s m String
257 => String -> ParserT String s m String
@@ -268,33 +270,18 @@ rawLaTeXBlock :: (PandocMonad m, HasMacros s, HasReaderOptions s)
268 => ParserT String s m String
270 => ParserT String s m String
269rawLaTeXBlock = do
271rawLaTeXBlock = do
270 lookAhead (try (char '\\' >> letter))
272 lookAhead (try (char '\\' >> letter))
271− rawLaTeXParser (environment <|> macroDef <|> blockCommand)
273+ snd <$> rawLaTeXParser (environment <|> macroDef <|> blockCommand)
272
274
273rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
275rawLaTeXInline :: (PandocMonad m, HasMacros s, HasReaderOptions s)
274 => ParserT String s m String
276 => ParserT String s m String
275rawLaTeXInline = do
277rawLaTeXInline = do
276 lookAhead (try (char '\\' >> letter) <|> char '$')
278 lookAhead (try (char '\\' >> letter) <|> char '$')
277− rawLaTeXParser (inlineEnvironment <|> inlineCommand')
279+ snd <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand')
278
280
279inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
281inlineCommand :: PandocMonad m => ParserT String ParserState m Inlines
280inlineCommand = do
282inlineCommand = do
281 lookAhead (try (char '\\' >> letter) <|> char '$')
283 lookAhead (try (char '\\' >> letter) <|> char '$')
282− inp <- getInput
283− let toks = tokenize "chunk" $ T.pack inp
284− let rawinline = do
285− (il, raw) <- try $ withRaw (inlineEnvironment <|> inlineCommand')
284+ fst <$> rawLaTeXParser (inlineEnvironment <|> inlineCommand')
286− st <- getState
287− return (il, raw, st)
288− pstate <- getState
289− let lstate = def{ sOptions = extractReaderOptions pstate
290− , sMacros = extractMacros pstate }
291− res <- runParserT rawinline lstate "source" toks
292− case res of
293− Left _ -> mzero
294− Right (il, raw, s) -> do
295− updateState $ updateMacros (const $ sMacros s)
296− takeP (T.length (untokenize raw))
297− return il
298
285
299tokenize :: SourceName -> Text -> [Tok]
286tokenize :: SourceName -> Text -> [Tok]
300tokenize sourcename = totoks (initialPos sourcename)
287tokenize sourcename = totoks (initialPos sourcename)