@@ -149,12 +149,12 @@ readMan opts txt = do
149149--
150150
151151lexMan :: PandocMonad m => ManLexer m [ManToken]
152−lexMan = many (lexMacro <|> lexLine <|> lexEmptyLine)
152+lexMan = many (lexComment <|> lexMacro <|> lexLine <|> lexEmptyLine)
153153
154154parseMan :: PandocMonad m => ManParser m Pandoc
155155parseMan = do
156156 let parsers = [ try parseList, parseTitle, parsePara, parseSkippedContent
157− , parseCodeBlock, parseHeader, parseSkipMacro]
157+ , try parseCodeBlock, parseHeader, parseSkipMacro]
158158 blocks <- many $ choice parsers
159159 parserst <- getState
160160 return $ Pandoc (stateMeta parserst) (filter (not . isNull) blocks)
@@ -174,7 +174,7 @@ spacetab = char ' ' <|> char '\t'
174174escapeLexer :: PandocMonad m => ManLexer m EscapeThing
175175escapeLexer = do
176176 char '\\'
177− choice [escChar, escFont]
177+ choice [escChar, escFont, escUnknown]
178178 where
179179
180180 escChar :: PandocMonad m => ManLexer m EscapeThing
@@ -182,7 +182,7 @@ escapeLexer = do
182182 let skipSeqs = ["%", "{", "}", "&", "\n", ":", "\"", "0", "c"]
183183 subsSeqs = [ ("-", '-'), (" ", ' '), ("\\", '\\'), ("[lq]", '“'), ("[rq]", '”')
184184 , ("[em]", '—'), ("[en]", '–'), ("*(lq", '«'), ("*(rq", '»')
185− , ("t", '\t'), ("e", '\\') ]
185+ , ("t", '\t'), ("e", '\\'), ("`", '`') ]
186186 substitute :: PandocMonad m => (String,Char) -> ManLexer m EscapeThing
187187 substitute (from,to) = try $ string from >> return (EChar to)
188188 skip :: PandocMonad m => String -> ManLexer m EscapeThing
@@ -201,6 +201,7 @@ escapeLexer = do
201201 , try (char '[' >> letterFont >>= \f -> char ']' >> return f)
202202 , try $ string "[BI]" >> return ItalicBold
203203 , char '[' >> many letter >> char ']' >> return Regular
204+ , digit >> return Regular
204205 ]
205206 modifyState (\r -> r {fontKind = font})
206207 return $ EFont font
@@ -214,11 +215,27 @@ escapeLexer = do
214215 , (char 'P' <|> char 'R') >> return Regular
215216 ]
216217
218+ escUnknown :: PandocMonad m => ManLexer m EscapeThing
219+ escUnknown = do
220+ c <- anyChar
221+ pos <- getPosition
222+ logOutput $ SkippedContent ("Unknown escape seq \\" ++ [c]) pos
223+ return ENothing
224+
217225currentFont :: PandocMonad m => ManLexer m FontKind
218226currentFont = do
219227 RoffState {fontKind = fk} <- getState
220228 return fk
221229
230+-- separate function from lexMacro since real man files sometimes do not follow the rules
231+lexComment :: PandocMonad m => ManLexer m ManToken
232+lexComment = do
233+ try $ string ".\\\""
234+ many space
235+ body <- many $ noneOf "\n"
236+ char '\n'
237+ return $ MComment body
238+
222239lexMacro :: PandocMonad m => ManLexer m ManToken
223240lexMacro = do
224241 char '.' <|> char '\''
@@ -249,7 +266,7 @@ lexMacro = do
249266
250267 where
251268
252− -- TODO rework args
269+ -- TODO better would be [[RoffStr]], since one arg may have different fonts
253270 lexArgs :: PandocMonad m => ManLexer m [RoffStr]
254271 lexArgs = do
255272 args <- many oneArg
@@ -261,21 +278,24 @@ lexMacro = do
261278 oneArg :: PandocMonad m => ManLexer m RoffStr
262279 oneArg = do
263280 many1 spacetab
264− quotedArg <|> plainArg
281+ many $ try $ string "\\\n"
282+ try quotedArg <|> plainArg -- try, because there are some erroneous files, e.g. linux/bpf.2
265283
266284 plainArg :: PandocMonad m => ManLexer m RoffStr
267285 plainArg = do
286+ indents <- many spacetab
268287 arg <- many1 $ escChar <|> (Just <$> noneOf " \t\n")
269288 f <- currentFont
270− return (catMaybes arg, f)
289+ return (indents ++ catMaybes arg, f)
271290
272291 quotedArg :: PandocMonad m => ManLexer m RoffStr
273292 quotedArg = do
274293 char '"'
275− val <- catMaybes <$> many quotedChar
294+ val <- many quotedChar
276295 char '"'
296+ val2 <- many $ escChar <|> (Just <$> noneOf " \t\n")
277297 f <- currentFont
278− return (val, f)
298+ return (catMaybes $ val ++ val2, f)
279299
280300 quotedChar :: PandocMonad m => ManLexer m (Maybe Char)
281301 quotedChar = escChar <|> (Just <$> noneOf "\"\n") <|> (Just <$> try (string "\"\"" >> return '"'))