git.iko.soy/typeable/pandoc
on master help sign in
Man reader: handle shift in list style.

Closes #4987.

commit62566c81821e8e886b29417ac42483b5b3e54128 authorJohn MacFarlane <jgm@berkeley.edu> dateSat 20 Oct 2018, 09:30 (8 years ago) parentfaa35bb
2 files changed+43−33
src/Text/Pandoc/Readers/Man.hs+33−27 test/Tests/Readers/Man.hs+10−6
src/Text/Pandoc/Readers/Man.hs+33−27
@@ -34,7 +34,7 @@ Conversion of man to 'Pandoc' document.
3434module Text.Pandoc.Readers.Man (readMan) where
3535
3636import Prelude
37−import Control.Monad (liftM, void, mzero)
37+import Control.Monad (liftM, void, mzero, guard)
3838import Control.Monad.Except (throwError)
3939import Data.Char (isHexDigit, chr)
4040import Data.Default (Default)
@@ -506,35 +506,41 @@ parseHeader = do
506506 let lvl = if name == "SH" then 1 else 2
507507 return $ header lvl contents
508508
509−type ListBuilder = [Blocks] -> Blocks
509+data ListType = Ordered ListAttributes
510+ | Bullet
511+
512+listTypeMatches :: Maybe ListType -> ListType -> Bool
513+listTypeMatches Nothing _ = True
514+listTypeMatches (Just Bullet) Bullet = True
515+listTypeMatches (Just (Ordered (_,x,y))) (Ordered (_,x',y'))
516+ = x == x' && y == y'
517+listTypeMatches (Just _) _ = False
518+
519+listItem :: PandocMonad m => Maybe ListType -> ManParser m (ListType, Blocks)
520+listItem mbListType = try $ do
521+ (MMacro _ args) <- mmacro "IP"
522+ case args of
523+ [] -> mzero
524+ ((cs,_):_) -> do
525+ let cs' = if not ('.' `elem` cs || ')' `elem` cs) then cs ++ "." else cs
526+ let lt = case Parsec.runParser anyOrderedListMarker defaultParserState
527+ "list marker" cs' of
528+ Right (start, listtype, listdelim)
529+ | cs == cs' -> Ordered (start, listtype, listdelim)
530+ | otherwise -> Ordered (start, listtype, DefaultDelim)
531+ Left _ -> Bullet
532+ guard $ listTypeMatches mbListType lt
533+ inls <- parseInlines
534+ continuations <- mconcat <$> many continuation
535+ return $ (lt, para inls <> continuations)
510536
511537parseList :: PandocMonad m => ManParser m Blocks
512538parseList = try $ do
513− xx <- many1 items
514− let bls = map snd xx
515− let bldr = fst $ head xx
516− return $ bldr bls
517−
518− where
519−
520− listKind :: [RoffStr] -> ListBuilder
521− listKind ((cs, _):_:[]) =
522− let cs' = if not ('.' `elem` cs || ')' `elem` cs) then cs ++ "." else cs
523− in case Parsec.runParser anyOrderedListMarker defaultParserState
524− "list marker" cs' of
525− Right (start, listtype, listdelim)
526− | cs == cs' -> orderedListWith (start, listtype, listdelim)
527− | otherwise -> orderedListWith (start, listtype, DefaultDelim)
528− Left _ -> bulletList
529− listKind _ = bulletList
530−
531− items :: PandocMonad m => ManParser m (ListBuilder, Blocks)
532− items = do
533− (MMacro _ args) <- mmacro "IP"
534− let lbuilder = listKind args
535− inls <- parseInlines
536− continuations <- mconcat <$> many continuation
537− return $ (lbuilder, para inls <> continuations)
539+ (lt, x) <- listItem Nothing
540+ xs <- map snd <$> many (listItem (Just lt))
541+ return $ case lt of
542+ Bullet -> bulletList (x:xs)
543+ Ordered lattr -> orderedListWith lattr (x:xs)
538544
539545continuation :: PandocMonad m => ManParser m Blocks
540546continuation = do
test/Tests/Readers/Man.hs+10−6
@@ -74,17 +74,21 @@ tests = [
7474 ],
7575 testGroup "Lists" [
7676 "bullet" =:
77− ".IP\nfirst\n.IP\nsecond"
77+ ".IP \"\\[bu]\"\nfirst\n.IP \"\\[bu]\"\nsecond"
7878 =?> bulletList [para $ str "first", para $ str "second"]
7979 , "ordered" =:
80− ".IP 1 a\nfirst\n.IP 2 a\nsecond"
81− =?> orderedListWith (1,Decimal,DefaultDelim) [para $ str "first", para $ str "second"]
80+ ".IP 2 a\nfirst\n.IP 3 a\nsecond"
81+ =?> orderedListWith (2,Decimal,DefaultDelim) [para $ str "first", para $ str "second"]
8282 , "upper" =:
83− ".IP A a\nfirst\n.IP B a\nsecond"
84− =?> orderedListWith (1,UpperAlpha,DefaultDelim) [para $ str "first", para $ str "second"]
83+ ".IP A) a\nfirst\n.IP B) a\nsecond"
84+ =?> orderedListWith (1,UpperAlpha,OneParen) [para $ str "first", para $ str "second"]
8585 , "nested" =:
86− ".IP\nfirst\n.RS\n.IP\n1a\n.IP\n1b\n.RE"
86+ ".IP \"\\[bu]\"\nfirst\n.RS\n.IP \"\\[bu]\"\n1a\n.IP \"\\[bu]\"\n1b\n.RE"
8787 =?> bulletList [(para $ str "first") <> (bulletList [para $ str "1a", para $ str "1b"])]
88+ , "change in list style" =:
89+ ".IP \\[bu]\nfirst\n.IP 1\nsecond"
90+ =?> bulletList [para (str "first")] <>
91+ orderedListWith (1,Decimal,DefaultDelim) [para (str "second")]
8892 ],
8993 testGroup "CodeBlocks" [
9094 "cb1"=: