git.iko.soy/typeable/pandoc
on master help sign in
Man reader: fix source position output with --verbose.

We now encode SourcePos in the MMacro token. Closes #5001.

commit785fad7091667a0f021e08d0761d767a91efb89b authorJohn MacFarlane <jgm@berkeley.edu> dateMon 22 Oct 2018, 10:51 (8 years ago) parent8f97c8e
1 file changed+23−23
src/Text/Pandoc/Readers/Man.hs+23−23
src/Text/Pandoc/Readers/Man.hs+23−23
@@ -81,7 +81,7 @@ type Arg = [LinePart]
8181-- TODO parse tables (see man tbl)
8282data ManToken = MLine [LinePart]
8383 | MEmptyLine
84− | MMacro MacroKind [Arg]
84+ | MMacro MacroKind [Arg] SourcePos
8585 deriving Show
8686
8787newtype ManTokens = ManTokens { unManTokens :: Seq.Seq ManToken }
@@ -263,6 +263,7 @@ lexComment = do
263263
264264lexMacro :: PandocMonad m => ManLexer m ManTokens
265265lexMacro = do
266+ pos <- getPosition
266267 char '.' <|> char '\''
267268 many spacetab
268269 macroName <- many (letter <|> oneOf ['\\', '"', '&', '.'])
@@ -277,7 +278,7 @@ lexMacro = do
277278 "ds1" -> lexStringDef args
278279 "sp" -> return $ singleTok MEmptyLine
279280 "so" -> lexIncludeFile args
280− _ -> resolveMacro macroName args
281+ _ -> resolveMacro macroName args pos
281282
282283
283284lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
@@ -295,11 +296,11 @@ lexIncludeFile args = do
295296 [] -> return mempty
296297
297298resolveMacro :: PandocMonad m
298− => String -> [Arg] -> ManLexer m ManTokens
299−resolveMacro macroName args = do
299+ => String -> [Arg] -> SourcePos -> ManLexer m ManTokens
300+resolveMacro macroName args pos = do
300301 macros <- customMacros <$> getState
301302 case M.lookup macroName macros of
302− Nothing -> return $ singleTok $ MMacro macroName args
303+ Nothing -> return $ singleTok $ MMacro macroName args pos
303304 Just ts -> do
304305 let fillLP (RoffStr (x,y)) zs = RoffStr (x,y) : zs
305306 fillLP (MacroArg i) zs =
@@ -386,29 +387,29 @@ lexArgs = do
386387
387388escStar :: PandocMonad m => ManLexer m [LinePart]
388389escStar = try $ do
390+ pos <- getPosition
389391 char '\\'
390392 char '*'
391393 c <- anyChar
392394 case c of
393395 '(' -> do
394396 cs <- count 2 anyChar
395− resolveString cs
397+ resolveString cs pos
396398 '[' -> do
397399 cs <- many (noneOf "\t\n\r ]")
398400 char ']'
399− resolveString cs
401+ resolveString cs pos
400402 'S' -> return mempty -- switch back to default font size
401− _ -> resolveString [c]
403+ _ -> resolveString [c] pos
402404
403405 where
404406
405407 -- strings and macros share namespace
406− resolveString stringname = do
407− ManTokens ts <- resolveMacro stringname []
408+ resolveString stringname pos = do
409+ ManTokens ts <- resolveMacro stringname [] pos
408410 case Foldable.toList ts of
409411 [MLine xs] -> return xs
410412 _ -> do
411− pos <- getPosition
412413 report $ SkippedContent ("unknown string " ++ stringname) pos
413414 return mempty
414415
@@ -514,13 +515,13 @@ memptyLine = msatisfy isMEmptyLine where
514515
515516mmacro :: PandocMonad m => MacroKind -> ManParser m ManToken
516517mmacro mk = msatisfy isMMacro where
517− isMMacro (MMacro mk' _) | mk == mk' = True
518− | otherwise = False
518+ isMMacro (MMacro mk' _ _) | mk == mk' = True
519+ | otherwise = False
519520 isMMacro _ = False
520521
521522mmacroAny :: PandocMonad m => ManParser m ManToken
522523mmacroAny = msatisfy isMMacro where
523− isMMacro (MMacro _ _) = True
524+ isMMacro (MMacro _ _ _) = True
524525 isMMacro _ = False
525526
526527--
@@ -529,7 +530,7 @@ mmacroAny = msatisfy isMMacro where
529530
530531parseTitle :: PandocMonad m => ManParser m Blocks
531532parseTitle = do
532− (MMacro _ args) <- mmacro "TH"
533+ (MMacro _ args _) <- mmacro "TH"
533534 let adjustMeta =
534535 case args of
535536 (x:y:z:_) -> setMeta "title" (linePartsToInlines x) .
@@ -589,7 +590,7 @@ parseInline = try $ do
589590 tok <- mtoken
590591 case tok of
591592 MLine lparts -> return $ linePartsToInlines lparts
592− MMacro mname args ->
593+ MMacro mname args _pos ->
593594 case mname of
594595 "UR" -> parseLink args
595596 "MT" -> parseEmailLink args
@@ -642,8 +643,8 @@ lineInl = do
642643
643644bareIP :: PandocMonad m => ManParser m ManToken
644645bareIP = msatisfy isBareIP where
645− isBareIP (MMacro "IP" []) = True
646− isBareIP _ = False
646+ isBareIP (MMacro "IP" [] _) = True
647+ isBareIP _ = False
647648
648649parseCodeBlock :: PandocMonad m => ManParser m Blocks
649650parseCodeBlock = try $ do
@@ -664,7 +665,7 @@ parseCodeBlock = try $ do
664665
665666parseHeader :: PandocMonad m => ManParser m Blocks
666667parseHeader = do
667− MMacro name args <- mmacro "SH" <|> mmacro "SS"
668+ MMacro name args _ <- mmacro "SH" <|> mmacro "SS"
668669 contents <- if null args
669670 then do
670671 lineInl
@@ -689,7 +690,7 @@ listTypeMatches (Just _) _ = False
689690
690691listItem :: PandocMonad m => Maybe ListType -> ManParser m (ListType, Blocks)
691692listItem mbListType = try $ do
692− (MMacro _ args) <- mmacro "IP"
693+ (MMacro _ args _) <- mmacro "IP"
693694 case args of
694695 (arg1 : _) -> do
695696 let cs = linePartsToString arg1
@@ -725,7 +726,7 @@ continuation = (do
725726definitionListItem :: PandocMonad m
726727 => ManParser m (Inlines, [Blocks])
727728definitionListItem = try $ do
728− (MMacro _ _) <- mmacro "TP" -- args specify indent level, can ignore
729+ mmacro "TP" -- args specify indent level, can ignore
729730 term <- parseInline
730731 inls <- parseInlines
731732 continuations <- mconcat <$> many continuation
@@ -754,10 +755,9 @@ parseEmailLink args = do
754755
755756skipUnkownMacro :: PandocMonad m => ManParser m Blocks
756757skipUnkownMacro = do
757− pos <- getPosition
758758 tok <- mmacroAny
759759 case tok of
760− MMacro mkind _ -> do
760+ MMacro mkind _ pos -> do
761761 report $ SkippedContent ('.':mkind) pos
762762 return mempty
763763 _ -> fail "the impossible happened"