@@ -133,7 +133,7 @@ readMan opts txt = do
133133 -> [ManToken] -- ^ input
134134 -> m (Either PandocError a)
135135 readWithMTokens parser state input =
136− mapLeft (PandocParsecError . concat $ show <$> input) `liftM` runParserT parser state "source" input
136+ mapLeft (PandocParsecError . (intercalate "\n") $ show <$> input) `liftM` runParserT parser state "source" input
137137
138138 mapLeft :: (a -> c) -> Either a b -> Either c b
139139 mapLeft f (Left x) = Left $ f x
@@ -148,8 +148,8 @@ lexMan = many (lexMacro <|> lexLine <|> lexEmptyLine)
148148
149149parseMan :: PandocMonad m => ManParser m Pandoc
150150parseMan = do
151− let parsers = [parseTitle, parsePara, parseSkippedContent
152− , parseCodeBlock, parseHeader, parseSkipMacro]
151+ let parsers = [ parseBulletList, parseTitle, parsePara, parseSkippedContent
152+ , parseCodeBlock, parseHeader, parseSkipMacro]
153153 blocks <- many $ choice parsers
154154 parserst <- getState
155155 return $ Pandoc (stateMeta parserst) (filter (not . isNull) blocks)
@@ -159,6 +159,7 @@ parseMan = do
159159 isNull Null = True
160160 isNull _ = False
161161
162+-- TODO escape characters in arguments
162163lexMacro :: PandocMonad m => ManLexer m ManToken
163164lexMacro = do
164165 char '.' <|> char '\''
@@ -180,6 +181,7 @@ lexMacro = do
180181 x | x `elem` ["BI", "IB"] -> MStr joinedArgs ItalicBold
181182 x | x `elem` ["I", "IR", "RI"] -> MStr joinedArgs Italic
182183 "SH" -> MHeader 2 joinedArgs
184+ "SS" -> MHeader 3 joinedArgs
183185 x | x `elem` [ "P", "PP", "LP", "sp"] -> MEmptyLine
184186 _ -> MUnknownMacro macroName args
185187 return tok
@@ -410,7 +412,7 @@ parsePara = do
410412 -- assuming man pages are generated from Linux-like repository
411413 linkParser :: Parsec String () [Inline]
412414 linkParser = do
413− mpage <- many1 alphaNum
415+ mpage <- many1 (alphaNum <|> char '_')
414416 space
415417 char '('
416418 mansect <- digit
@@ -445,6 +447,20 @@ parseHeader = do
445447 (MHeader lvl s) <- mheader
446448 return $ Header lvl nullAttr [Str s]
447449
450+parseBulletList :: PandocMonad m => ManParser m Block
451+parseBulletList = do
452+ bls <- many1 block
453+ return $ BulletList $ map (:[]) bls
454+
455+ where
456+
457+ block :: PandocMonad m => ManParser m Block
458+ block = do
459+ mmacro KTab
460+ pars <- parsePara
461+ many $ mmacro KTabEnd
462+ return pars
463+
448464-- In case of weird man file it will be parsed succesfully
449465parseSkipMacro :: PandocMonad m => ManParser m Block
450466parseSkipMacro = mmacroAny >> return Null