@@ -133,7 +133,7 @@ readMan opts txt = do
133 -> [ManToken] -- ^ input
133 -> [ManToken] -- ^ input
134 -> m (Either PandocError a)
134 -> m (Either PandocError a)
135 readWithMTokens parser state input =
135 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
138 mapLeft :: (a -> c) -> Either a b -> Either c b
138 mapLeft :: (a -> c) -> Either a b -> Either c b
139 mapLeft f (Left x) = Left $ f x
139 mapLeft f (Left x) = Left $ f x
@@ -148,8 +148,8 @@ lexMan = many (lexMacro <|> lexLine <|> lexEmptyLine)
149parseMan :: PandocMonad m => ManParser m Pandoc
149parseMan :: PandocMonad m => ManParser m Pandoc
150parseMan = do
150parseMan = do
151− let parsers = [parseTitle, parsePara, parseSkippedContent
151+ let parsers = [ parseBulletList, parseTitle, parsePara, parseSkippedContent
152− , parseCodeBlock, parseHeader, parseSkipMacro]
152+ , parseCodeBlock, parseHeader, parseSkipMacro]
153 blocks <- many $ choice parsers
153 blocks <- many $ choice parsers
154 parserst <- getState
154 parserst <- getState
155 return $ Pandoc (stateMeta parserst) (filter (not . isNull) blocks)
155 return $ Pandoc (stateMeta parserst) (filter (not . isNull) blocks)
@@ -159,6 +159,7 @@ parseMan = do
159 isNull Null = True
159 isNull Null = True
160 isNull _ = False
160 isNull _ = False
162+-- TODO escape characters in arguments
162lexMacro :: PandocMonad m => ManLexer m ManToken
163lexMacro :: PandocMonad m => ManLexer m ManToken
163lexMacro = do
164lexMacro = do
164 char '.' <|> char '\''
165 char '.' <|> char '\''
@@ -180,6 +181,7 @@ lexMacro = do
180 x | x `elem` ["BI", "IB"] -> MStr joinedArgs ItalicBold
181 x | x `elem` ["BI", "IB"] -> MStr joinedArgs ItalicBold
181 x | x `elem` ["I", "IR", "RI"] -> MStr joinedArgs Italic
182 x | x `elem` ["I", "IR", "RI"] -> MStr joinedArgs Italic
182 "SH" -> MHeader 2 joinedArgs
183 "SH" -> MHeader 2 joinedArgs
184+ "SS" -> MHeader 3 joinedArgs
183 x | x `elem` [ "P", "PP", "LP", "sp"] -> MEmptyLine
185 x | x `elem` [ "P", "PP", "LP", "sp"] -> MEmptyLine
184 _ -> MUnknownMacro macroName args
186 _ -> MUnknownMacro macroName args
185 return tok
187 return tok
@@ -410,7 +412,7 @@ parsePara = do
410 -- assuming man pages are generated from Linux-like repository
412 -- assuming man pages are generated from Linux-like repository
411 linkParser :: Parsec String () [Inline]
413 linkParser :: Parsec String () [Inline]
412 linkParser = do
414 linkParser = do
413− mpage <- many1 alphaNum
415+ mpage <- many1 (alphaNum <|> char '_')
416 mansect <- digit
418 mansect <- digit
@@ -445,6 +447,20 @@ parseHeader = do
445 (MHeader lvl s) <- mheader
447 (MHeader lvl s) <- mheader
446 return $ Header lvl nullAttr [Str s]
448 return $ Header lvl nullAttr [Str s]
450+parseBulletList :: PandocMonad m => ManParser m Block
453+ return $ BulletList $ map (:[]) bls
457+ block :: PandocMonad m => ManParser m Block
461+ many $ mmacro KTabEnd
448-- In case of weird man file it will be parsed succesfully
464-- In case of weird man file it will be parsed succesfully
449parseSkipMacro :: PandocMonad m => ManParser m Block
465parseSkipMacro :: PandocMonad m => ManParser m Block
450parseSkipMacro = mmacroAny >> return Null
466parseSkipMacro = mmacroAny >> return Null