Man reader: parse TP as definition lists.

Closes #4981.
This commit is contained in:
John MacFarlane 2018-10-20 10:00:50 -07:00
parent 62566c8182
commit 1b19e79650
3 changed files with 55 additions and 26 deletions

View file

@ -128,6 +128,7 @@ parseMan = do
parseBlock :: PandocMonad m => ManParser m Blocks
parseBlock = choice [ parseList
, parseDefinitionList
, parseTitle
, parsePara
, parseSkippedContent
@ -351,7 +352,9 @@ msatisfy :: (Show t, Stream s m t) => (t -> Bool) -> ParserT s st m t
msatisfy predic = tokenPrim show nextPos testTok
where
testTok t = if predic t then Just t else Nothing
nextPos pos _x _xs = updatePosString (setSourceColumn (setSourceLine pos $ sourceLine pos + 1) 1) ("")
nextPos pos _x _xs = updatePosString
(setSourceColumn
(setSourceLine pos $ sourceLine pos + 1) 1) ("")
mstr :: PandocMonad m => ManParser m ManToken
mstr = msatisfy isMStr where
@ -428,25 +431,23 @@ parseInlines = do
let withspaces = intersperse B.space inls
return $ mconcat withspaces
where
strInl :: PandocMonad m => ManParser m Inlines
strInl = do
(MStr rstr) <- mstr
return $ strToInlines rstr
strInl :: PandocMonad m => ManParser m Inlines
strInl = do
(MStr rstr) <- mstr
return $ strToInlines rstr
lineInl :: PandocMonad m => ManParser m Inlines
lineInl = do
(MLine fragments) <- mline
return $ mconcat $ strToInlines <$> fragments
lineInl :: PandocMonad m => ManParser m Inlines
lineInl = do
(MLine fragments) <- mline
return $ mconcat $ strToInlines <$> fragments
linkInl :: PandocMonad m => ManParser m Inlines
linkInl = do
(MMaybeLink txt) <- mmaybeLink
let inls = case runParser linkParser () "" txt of
Right lnk -> lnk
Left _ -> strong $ text txt
return inls
linkInl :: PandocMonad m => ManParser m Inlines
linkInl = do
(MMaybeLink txt) <- mmaybeLink
let inls = case runParser linkParser () "" txt of
Right lnk -> lnk
Left _ -> strong $ text txt
return inls
where
@ -463,8 +464,8 @@ parseInlines = do
lnkInls = link (manurl mpage [mansect]) mpage (strong $ str mpage)
return $ lnkInls <> strong (str (" ("++[mansect] ++ ")") <> text other)
comment :: PandocMonad m => ManParser m Inlines
comment = mcomment >> return mempty
comment :: PandocMonad m => ManParser m Inlines
comment = mcomment >> return mempty
bareIP :: PandocMonad m => ManParser m ManToken
bareIP = msatisfy isBareIP where
@ -497,12 +498,10 @@ parseHeader = do
MMacro name args <- mmacro "SH" <|> mmacro "SS"
contents <- if null args
then do
MLine ils <- mline
return $ mconcat $ map strToInlines ils
strInl <|> lineInl
else do
return $ mconcat
$ intersperse B.space
$ map strToInlines args
return $
mconcat $ intersperse B.space $ map strToInlines args
let lvl = if name == "SH" then 1 else 2
return $ header lvl contents
@ -549,6 +548,18 @@ continuation = do
mmacro "RE"
return bs
definitionListItem :: PandocMonad m
=> ManParser m (Inlines, [Blocks])
definitionListItem = try $ do
(MMacro _ _) <- mmacro "TP" -- args specify indent level, can ignore
term <- strInl <|> lineInl
inls <- parseInlines
continuations <- mconcat <$> many continuation
return $ (term, [para inls <> continuations])
parseDefinitionList :: PandocMonad m => ManParser m Blocks
parseDefinitionList = definitionList <$> many1 definitionListItem
-- In case of weird man file it will be parsed succesfully
parseSkipMacro :: PandocMonad m => ManParser m Blocks
parseSkipMacro = do

View file

@ -144,7 +144,18 @@ Lower alpha with paren
.RE
.RE
.RE
.SS Ordered
Definition lists
.TP
.B term1
definition 1
.RS
.PP
continued
.RE
.TP
.B term2
definition 2
* * * * *
.SH Special Characters
AT&T has an ampersand in their name.

View file

@ -70,7 +70,14 @@ Pandoc (Meta {unMeta = fromList [("date",MetaString "Oct 17, 2018"),("section",M
[[Para [Str "Decimal",Space,Str "start",Space,Str "with",Space,Str "6"]
,OrderedList (3,LowerAlpha,OneParen)
[[Para [Str "Lower",Space,Str "alpha",Space,Str "with",Space,Str "paren"]]]]]]]]]
,Para [Str "*",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*"]
,Header 2 ("",[],[]) [Str "Ordered"]
,Para [Str "Definition",Space,Str "lists"]
,DefinitionList
[([Strong [Str "term1"]],
[[Para [Str "definition",Space,Str "1"]
,Para [Str "continued"]]])
,([Strong [Str "term2"]],
[[Para [Str "definition",Space,Str "2",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*"]]])]
,Header 1 ("",[],[]) [Str "Special",Space,Str "Characters"]
,Para [Str "AT&T",Space,Str "has",Space,Str "an",Space,Str "ampersand",Space,Str "in",Space,Str "their",Space,Str "name."]
,Para [Str "4",Space,Str "<",Space,Str "5."]