diff options
-rw-r--r-- | src/Text/Pandoc/Readers/Man.hs | 60 | ||||
-rw-r--r-- | test/Tests/Readers/Man.hs | 16 |
2 files changed, 43 insertions, 33 deletions
diff --git a/src/Text/Pandoc/Readers/Man.hs b/src/Text/Pandoc/Readers/Man.hs index 458a9bfce..7e5288aa1 100644 --- a/src/Text/Pandoc/Readers/Man.hs +++ b/src/Text/Pandoc/Readers/Man.hs @@ -34,7 +34,7 @@ Conversion of man to 'Pandoc' document. module Text.Pandoc.Readers.Man (readMan) where import Prelude -import Control.Monad (liftM, void, mzero) +import Control.Monad (liftM, void, mzero, guard) import Control.Monad.Except (throwError) import Data.Char (isHexDigit, chr) import Data.Default (Default) @@ -506,35 +506,41 @@ parseHeader = do let lvl = if name == "SH" then 1 else 2 return $ header lvl contents -type ListBuilder = [Blocks] -> Blocks +data ListType = Ordered ListAttributes + | Bullet + +listTypeMatches :: Maybe ListType -> ListType -> Bool +listTypeMatches Nothing _ = True +listTypeMatches (Just Bullet) Bullet = True +listTypeMatches (Just (Ordered (_,x,y))) (Ordered (_,x',y')) + = x == x' && y == y' +listTypeMatches (Just _) _ = False + +listItem :: PandocMonad m => Maybe ListType -> ManParser m (ListType, Blocks) +listItem mbListType = try $ do + (MMacro _ args) <- mmacro "IP" + case args of + [] -> mzero + ((cs,_):_) -> do + let cs' = if not ('.' `elem` cs || ')' `elem` cs) then cs ++ "." else cs + let lt = case Parsec.runParser anyOrderedListMarker defaultParserState + "list marker" cs' of + Right (start, listtype, listdelim) + | cs == cs' -> Ordered (start, listtype, listdelim) + | otherwise -> Ordered (start, listtype, DefaultDelim) + Left _ -> Bullet + guard $ listTypeMatches mbListType lt + inls <- parseInlines + continuations <- mconcat <$> many continuation + return $ (lt, para inls <> continuations) parseList :: PandocMonad m => ManParser m Blocks parseList = try $ do - xx <- many1 items - let bls = map snd xx - let bldr = fst $ head xx - return $ bldr bls - - where - - listKind :: [RoffStr] -> ListBuilder - listKind ((cs, _):_:[]) = - let cs' = if not ('.' `elem` cs || ')' `elem` cs) then cs ++ "." else cs - in case Parsec.runParser anyOrderedListMarker defaultParserState - "list marker" cs' of - Right (start, listtype, listdelim) - | cs == cs' -> orderedListWith (start, listtype, listdelim) - | otherwise -> orderedListWith (start, listtype, DefaultDelim) - Left _ -> bulletList - listKind _ = bulletList - - items :: PandocMonad m => ManParser m (ListBuilder, Blocks) - items = do - (MMacro _ args) <- mmacro "IP" - let lbuilder = listKind args - inls <- parseInlines - continuations <- mconcat <$> many continuation - return $ (lbuilder, para inls <> continuations) + (lt, x) <- listItem Nothing + xs <- map snd <$> many (listItem (Just lt)) + return $ case lt of + Bullet -> bulletList (x:xs) + Ordered lattr -> orderedListWith lattr (x:xs) continuation :: PandocMonad m => ManParser m Blocks continuation = do diff --git a/test/Tests/Readers/Man.hs b/test/Tests/Readers/Man.hs index 902ed71cc..5368ce542 100644 --- a/test/Tests/Readers/Man.hs +++ b/test/Tests/Readers/Man.hs @@ -74,17 +74,21 @@ tests = [ ], testGroup "Lists" [ "bullet" =: - ".IP\nfirst\n.IP\nsecond" + ".IP \"\\[bu]\"\nfirst\n.IP \"\\[bu]\"\nsecond" =?> bulletList [para $ str "first", para $ str "second"] , "ordered" =: - ".IP 1 a\nfirst\n.IP 2 a\nsecond" - =?> orderedListWith (1,Decimal,DefaultDelim) [para $ str "first", para $ str "second"] + ".IP 2 a\nfirst\n.IP 3 a\nsecond" + =?> orderedListWith (2,Decimal,DefaultDelim) [para $ str "first", para $ str "second"] , "upper" =: - ".IP A a\nfirst\n.IP B a\nsecond" - =?> orderedListWith (1,UpperAlpha,DefaultDelim) [para $ str "first", para $ str "second"] + ".IP A) a\nfirst\n.IP B) a\nsecond" + =?> orderedListWith (1,UpperAlpha,OneParen) [para $ str "first", para $ str "second"] , "nested" =: - ".IP\nfirst\n.RS\n.IP\n1a\n.IP\n1b\n.RE" + ".IP \"\\[bu]\"\nfirst\n.RS\n.IP \"\\[bu]\"\n1a\n.IP \"\\[bu]\"\n1b\n.RE" =?> bulletList [(para $ str "first") <> (bulletList [para $ str "1a", para $ str "1b"])] + , "change in list style" =: + ".IP \\[bu]\nfirst\n.IP 1\nsecond" + =?> bulletList [para (str "first")] <> + orderedListWith (1,Decimal,DefaultDelim) [para (str "second")] ], testGroup "CodeBlocks" [ "cb1"=: |