git.iko.soy/typeable/pandoc
on master help sign in
Man reader: handle shift in list style.
62566c8John MacFarlane
src/Text/Pandoc/Readers/Man.hs+33−27
@@ -34,7 +34,7 @@ Conversion of man to 'Pandoc' document.
34module Text.Pandoc.Readers.Man (readMan) where
34module Text.Pandoc.Readers.Man (readMan) where
35
35
36import Prelude
36import Prelude
37−import Control.Monad (liftM, void, mzero)
37+import Control.Monad (liftM, void, mzero, guard)
38import Control.Monad.Except (throwError)
38import Control.Monad.Except (throwError)
39import Data.Char (isHexDigit, chr)
39import Data.Char (isHexDigit, chr)
40import Data.Default (Default)
40import Data.Default (Default)
@@ -506,35 +506,41 @@ parseHeader = do
506 let lvl = if name == "SH" then 1 else 2
506 let lvl = if name == "SH" then 1 else 2
507 return $ header lvl contents
507 return $ header lvl contents
508
508
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)
510
536
511parseList :: PandocMonad m => ManParser m Blocks
537parseList :: PandocMonad m => ManParser m Blocks
512parseList = try $ do
538parseList = try $ do
513− xx <- many1 items
539+ (lt, x) <- listItem Nothing
514− let bls = map snd xx
540+ xs <- map snd <$> many (listItem (Just lt))
515− let bldr = fst $ head xx
541+ return $ case lt of
516− return $ bldr bls
542+ Bullet -> bulletList (x:xs)
517−
543+ Ordered lattr -> orderedListWith lattr (x:xs)
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)
538
544
539continuation :: PandocMonad m => ManParser m Blocks
545continuation :: PandocMonad m => ManParser m Blocks
540continuation = do
546continuation = do
test/Tests/Readers/Man.hs+10−6
@@ -74,17 +74,21 @@ tests = [
74 ],
74 ],
75 testGroup "Lists" [
75 testGroup "Lists" [
76 "bullet" =:
76 "bullet" =:
77− ".IP\nfirst\n.IP\nsecond"
77+ ".IP \"\\[bu]\"\nfirst\n.IP \"\\[bu]\"\nsecond"
78 =?> bulletList [para $ str "first", para $ str "second"]
78 =?> bulletList [para $ str "first", para $ str "second"]
79 , "ordered" =:
79 , "ordered" =:
80− ".IP 1 a\nfirst\n.IP 2 a\nsecond"
80+ ".IP 2 a\nfirst\n.IP 3 a\nsecond"
81− =?> orderedListWith (1,Decimal,DefaultDelim) [para $ str "first", para $ str "second"]
81+ =?> orderedListWith (2,Decimal,DefaultDelim) [para $ str "first", para $ str "second"]
82 , "upper" =:
82 , "upper" =:
83− ".IP A a\nfirst\n.IP B a\nsecond"
83+ ".IP A) a\nfirst\n.IP B) a\nsecond"
84− =?> orderedListWith (1,UpperAlpha,DefaultDelim) [para $ str "first", para $ str "second"]
84+ =?> orderedListWith (1,UpperAlpha,OneParen) [para $ str "first", para $ str "second"]
85 , "nested" =:
85 , "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"
87 =?> bulletList [(para $ str "first") <> (bulletList [para $ str "1a", para $ str "1b"])]
87 =?> 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")]
88 ],
92 ],
89 testGroup "CodeBlocks" [
93 testGroup "CodeBlocks" [
90 "cb1"=:
94 "cb1"=: