git.iko.soy/typeable/pandoc
on master help sign in
T.P.R.LaTeX.Parsing: moved more functions.
commit8f5cd946dbbce7e356df237390b5094f7b6da1e7 authorJohn MacFarlane <jgm@berkeley.edu> dateSun 14 Oct 2018, 22:50 (8 years ago) parent22f81f7
1 file changed+64−57
src/Text/Pandoc/Readers/LaTeX/Parsing.hs+64−57
src/Text/Pandoc/Readers/LaTeX/Parsing.hs+64−57
@@ -398,63 +398,70 @@ doMacros n = do
398398 Tok spos (CtrlSeq name) _ : ts
399399 -> handleMacros spos name ts
400400 _ -> return ()
401− where combineTok (Tok spos (CtrlSeq name) x) (Tok _ Word w : ts)
402− | T.all isLetterOrAt w =
403− Tok spos (CtrlSeq (name <> w)) (x1 <> w <> x2) : ts
404− where (x1, x2) = T.break isSpaceOrTab x
405− combineTok t ts = t:ts
406− matchTok (Tok _ toktype txt) =
407− satisfyTok (\(Tok _ toktype' txt') ->
408− toktype == toktype' &&
409− txt == txt')
410− matchPattern toks = try $ mapM_ matchTok toks
411− getargs argmap [] = return argmap
412− getargs argmap (Pattern toks : rest) = try $ do
413− matchPattern toks
414− getargs argmap rest
415− getargs argmap (ArgNum i : Pattern toks : rest) =
416− try $ do
417− x <- mconcat <$> manyTill
418− (braced <|> ((:[]) <$> anyTok))
419− (matchPattern toks)
420− getargs (M.insert i x argmap) rest
421− getargs argmap (ArgNum i : rest) = do
422− x <- try $ spaces >> bracedOrToken
423− getargs (M.insert i x argmap) rest
424− handleMacros spos name ts = do
425− macros <- sMacros <$> getState
426− case M.lookup name macros of
427− Nothing -> return ()
428− Just (Macro expansionPoint argspecs optarg newtoks) -> do
429− setInput ts
430− args <- case optarg of
431− Nothing -> getargs M.empty argspecs
432− Just o -> do
433− x <- option o bracketedToks
434− getargs (M.singleton 1 x) argspecs
435− -- first boolean param is true if we're tokenizing
436− -- an argument (in which case we don't want to
437− -- expand #1 etc.)
438− let addTok False (Tok _ (Arg i) _) acc =
439− case M.lookup i args of
440− Nothing -> mzero
441− Just xs -> foldr (addTok True) acc xs
442− -- see #4007
443− addTok _ (Tok _ (CtrlSeq x) txt)
444− acc@(Tok _ Word _ : _)
445− | not (T.null txt)
446− , isLetter (T.last txt) =
447− Tok spos (CtrlSeq x) (txt <> " ") : acc
448− addTok _ t acc = setpos spos t : acc
449− ts' <- getInput
450− setInput $ foldr (addTok False) ts' newtoks
451−
452− case expansionPoint of
453− ExpandWhenUsed ->
454− if n > 20 -- detect macro expansion loops
455− then throwError $ PandocMacroLoop (T.unpack name)
456− else doMacros (n + 1)
457− ExpandWhenDefined -> return ()
401+
402+ where
403+ combineTok (Tok spos (CtrlSeq name) x) (Tok _ Word w : ts)
404+ | T.all isLetterOrAt w =
405+ Tok spos (CtrlSeq (name <> w)) (x1 <> w <> x2) : ts
406+ where (x1, x2) = T.break isSpaceOrTab x
407+ combineTok t ts = t:ts
408+
409+ matchTok (Tok _ toktype txt) =
410+ satisfyTok (\(Tok _ toktype' txt') ->
411+ toktype == toktype' &&
412+ txt == txt')
413+
414+ matchPattern toks = try $ mapM_ matchTok toks
415+
416+ getargs argmap [] = return argmap
417+ getargs argmap (Pattern toks : rest) = try $ do
418+ matchPattern toks
419+ getargs argmap rest
420+ getargs argmap (ArgNum i : Pattern toks : rest) =
421+ try $ do
422+ x <- mconcat <$> manyTill
423+ (braced <|> ((:[]) <$> anyTok))
424+ (matchPattern toks)
425+ getargs (M.insert i x argmap) rest
426+ getargs argmap (ArgNum i : rest) = do
427+ x <- try $ spaces >> bracedOrToken
428+ getargs (M.insert i x argmap) rest
429+
430+ addTok False args spos (Tok _ (Arg i) _) acc =
431+ case M.lookup i args of
432+ Nothing -> mzero
433+ Just xs -> foldr (addTok True args spos) acc xs
434+ -- see #4007
435+ addTok _ _ spos (Tok _ (CtrlSeq x) txt)
436+ acc@(Tok _ Word _ : _)
437+ | not (T.null txt)
438+ , isLetter (T.last txt) =
439+ Tok spos (CtrlSeq x) (txt <> " ") : acc
440+ addTok _ _ spos t acc = setpos spos t : acc
441+
442+ handleMacros spos name ts = do
443+ macros <- sMacros <$> getState
444+ case M.lookup name macros of
445+ Nothing -> return ()
446+ Just (Macro expansionPoint argspecs optarg newtoks) -> do
447+ setInput ts
448+ args <- case optarg of
449+ Nothing -> getargs M.empty argspecs
450+ Just o -> do
451+ x <- option o bracketedToks
452+ getargs (M.singleton 1 x) argspecs
453+ -- first boolean param is true if we're tokenizing
454+ -- an argument (in which case we don't want to
455+ -- expand #1 etc.)
456+ ts' <- getInput
457+ setInput $ foldr (addTok False args spos) ts' newtoks
458+
459+ case expansionPoint of
460+ ExpandWhenUsed ->
461+ if n > 20 -- detect macro expansion loops
462+ then throwError $ PandocMacroLoop (T.unpack name)
463+ else doMacros (n + 1)
464+ ExpandWhenDefined -> return ()
458465
459466
460467setpos :: SourcePos -> Tok -> Tok