@@ -81,7 +81,7 @@ type Arg = [LinePart]
81-- TODO parse tables (see man tbl)
81-- TODO parse tables (see man tbl)
82data ManToken = MLine [LinePart]
82data ManToken = MLine [LinePart]
83 | MEmptyLine
83 | MEmptyLine
84− | MMacro MacroKind [Arg]
84+ | MMacro MacroKind [Arg] SourcePos
85 deriving Show
85 deriving Show
87newtype ManTokens = ManTokens { unManTokens :: Seq.Seq ManToken }
87newtype ManTokens = ManTokens { unManTokens :: Seq.Seq ManToken }
@@ -263,6 +263,7 @@ lexComment = do
264lexMacro :: PandocMonad m => ManLexer m ManTokens
264lexMacro :: PandocMonad m => ManLexer m ManTokens
265lexMacro = do
265lexMacro = do
266 char '.' <|> char '\''
267 char '.' <|> char '\''
267 many spacetab
268 many spacetab
268 macroName <- many (letter <|> oneOf ['\\', '"', '&', '.'])
269 macroName <- many (letter <|> oneOf ['\\', '"', '&', '.'])
@@ -277,7 +278,7 @@ lexMacro = do
277 "ds1" -> lexStringDef args
278 "ds1" -> lexStringDef args
278 "sp" -> return $ singleTok MEmptyLine
279 "sp" -> return $ singleTok MEmptyLine
279 "so" -> lexIncludeFile args
280 "so" -> lexIncludeFile args
280− _ -> resolveMacro macroName args
281+ _ -> resolveMacro macroName args pos
283lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
284lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
@@ -295,11 +296,11 @@ lexIncludeFile args = do
295 [] -> return mempty
296 [] -> return mempty
297resolveMacro :: PandocMonad m
298resolveMacro :: PandocMonad m
298− => String -> [Arg] -> ManLexer m ManTokens
299+ => String -> [Arg] -> SourcePos -> ManLexer m ManTokens
299−resolveMacro macroName args = do
300+resolveMacro macroName args pos = do
300 macros <- customMacros <$> getState
301 macros <- customMacros <$> getState
301 case M.lookup macroName macros of
302 case M.lookup macroName macros of
302− Nothing -> return $ singleTok $ MMacro macroName args
303+ Nothing -> return $ singleTok $ MMacro macroName args pos
303 Just ts -> do
304 Just ts -> do
304 let fillLP (RoffStr (x,y)) zs = RoffStr (x,y) : zs
305 let fillLP (RoffStr (x,y)) zs = RoffStr (x,y) : zs
305 fillLP (MacroArg i) zs =
306 fillLP (MacroArg i) zs =
@@ -386,29 +387,29 @@ lexArgs = do
387escStar :: PandocMonad m => ManLexer m [LinePart]
388escStar :: PandocMonad m => ManLexer m [LinePart]
388escStar = try $ do
389escStar = try $ do
389 char '\\'
391 char '\\'
391 c <- anyChar
393 c <- anyChar
392 case c of
394 case c of
393 '(' -> do
395 '(' -> do
394 cs <- count 2 anyChar
396 cs <- count 2 anyChar
395− resolveString cs
397+ resolveString cs pos
396 '[' -> do
398 '[' -> do
397 cs <- many (noneOf "\t\n\r ]")
399 cs <- many (noneOf "\t\n\r ]")
399− resolveString cs
401+ resolveString cs pos
400 'S' -> return mempty -- switch back to default font size
402 'S' -> return mempty -- switch back to default font size
401− _ -> resolveString [c]
403+ _ -> resolveString [c] pos
405 -- strings and macros share namespace
407 -- strings and macros share namespace
406− resolveString stringname = do
408+ resolveString stringname pos = do
407− ManTokens ts <- resolveMacro stringname []
409+ ManTokens ts <- resolveMacro stringname [] pos
408 case Foldable.toList ts of
410 case Foldable.toList ts of
409 [MLine xs] -> return xs
411 [MLine xs] -> return xs
412 report $ SkippedContent ("unknown string " ++ stringname) pos
413 report $ SkippedContent ("unknown string " ++ stringname) pos
413 return mempty
414 return mempty
@@ -514,13 +515,13 @@ memptyLine = msatisfy isMEmptyLine where
515mmacro :: PandocMonad m => MacroKind -> ManParser m ManToken
516mmacro :: PandocMonad m => MacroKind -> ManParser m ManToken
516mmacro mk = msatisfy isMMacro where
517mmacro mk = msatisfy isMMacro where
517− isMMacro (MMacro mk' _) | mk == mk' = True
518+ isMMacro (MMacro mk' _ _) | mk == mk' = True
518− | otherwise = False
519+ | otherwise = False
519 isMMacro _ = False
520 isMMacro _ = False
521mmacroAny :: PandocMonad m => ManParser m ManToken
522mmacroAny :: PandocMonad m => ManParser m ManToken
522mmacroAny = msatisfy isMMacro where
523mmacroAny = msatisfy isMMacro where
523− isMMacro (MMacro _ _) = True
524+ isMMacro (MMacro _ _ _) = True
524 isMMacro _ = False
525 isMMacro _ = False
@@ -529,7 +530,7 @@ mmacroAny = msatisfy isMMacro where
530parseTitle :: PandocMonad m => ManParser m Blocks
531parseTitle :: PandocMonad m => ManParser m Blocks
531parseTitle = do
532parseTitle = do
532− (MMacro _ args) <- mmacro "TH"
533+ (MMacro _ args _) <- mmacro "TH"
533 let adjustMeta =
534 let adjustMeta =
534 case args of
535 case args of
535 (x:y:z:_) -> setMeta "title" (linePartsToInlines x) .
536 (x:y:z:_) -> setMeta "title" (linePartsToInlines x) .
@@ -589,7 +590,7 @@ parseInline = try $ do
589 tok <- mtoken
590 tok <- mtoken
590 case tok of
591 case tok of
591 MLine lparts -> return $ linePartsToInlines lparts
592 MLine lparts -> return $ linePartsToInlines lparts
592− MMacro mname args ->
593+ MMacro mname args _pos ->
593 case mname of
594 case mname of
594 "UR" -> parseLink args
595 "UR" -> parseLink args
595 "MT" -> parseEmailLink args
596 "MT" -> parseEmailLink args
@@ -642,8 +643,8 @@ lineInl = do
643bareIP :: PandocMonad m => ManParser m ManToken
644bareIP :: PandocMonad m => ManParser m ManToken
644bareIP = msatisfy isBareIP where
645bareIP = msatisfy isBareIP where
645− isBareIP (MMacro "IP" []) = True
646+ isBareIP (MMacro "IP" [] _) = True
646− isBareIP _ = False
647+ isBareIP _ = False
648parseCodeBlock :: PandocMonad m => ManParser m Blocks
649parseCodeBlock :: PandocMonad m => ManParser m Blocks
649parseCodeBlock = try $ do
650parseCodeBlock = try $ do
@@ -664,7 +665,7 @@ parseCodeBlock = try $ do
665parseHeader :: PandocMonad m => ManParser m Blocks
666parseHeader :: PandocMonad m => ManParser m Blocks
666parseHeader = do
667parseHeader = do
667− MMacro name args <- mmacro "SH" <|> mmacro "SS"
668+ MMacro name args _ <- mmacro "SH" <|> mmacro "SS"
668 contents <- if null args
669 contents <- if null args
@@ -689,7 +690,7 @@ listTypeMatches (Just _) _ = False
690listItem :: PandocMonad m => Maybe ListType -> ManParser m (ListType, Blocks)
691listItem :: PandocMonad m => Maybe ListType -> ManParser m (ListType, Blocks)
691listItem mbListType = try $ do
692listItem mbListType = try $ do
692− (MMacro _ args) <- mmacro "IP"
693+ (MMacro _ args _) <- mmacro "IP"
693 case args of
694 case args of
694 (arg1 : _) -> do
695 (arg1 : _) -> do
695 let cs = linePartsToString arg1
696 let cs = linePartsToString arg1
@@ -725,7 +726,7 @@ continuation = (do
725definitionListItem :: PandocMonad m
726definitionListItem :: PandocMonad m
726 => ManParser m (Inlines, [Blocks])
727 => ManParser m (Inlines, [Blocks])
727definitionListItem = try $ do
728definitionListItem = try $ do
728− (MMacro _ _) <- mmacro "TP" -- args specify indent level, can ignore
729+ mmacro "TP" -- args specify indent level, can ignore
729 term <- parseInline
730 term <- parseInline
730 inls <- parseInlines
731 inls <- parseInlines
731 continuations <- mconcat <$> many continuation
732 continuations <- mconcat <$> many continuation
@@ -754,10 +755,9 @@ parseEmailLink args = do
755skipUnkownMacro :: PandocMonad m => ManParser m Blocks
756skipUnkownMacro :: PandocMonad m => ManParser m Blocks
756skipUnkownMacro = do
757skipUnkownMacro = do
758 tok <- mmacroAny
758 tok <- mmacroAny
759 case tok of
759 case tok of
760− MMacro mkind _ -> do
760+ MMacro mkind _ pos -> do
761 report $ SkippedContent ('.':mkind) pos
761 report $ SkippedContent ('.':mkind) pos
762 return mempty
762 return mempty
763 _ -> fail "the impossible happened"
763 _ -> fail "the impossible happened"