@@ -36,7 +36,7 @@ Conversion of man to 'Pandoc' document.
36module Text.Pandoc.Readers.Man (readMan) where
36module Text.Pandoc.Readers.Man (readMan) where
38import Prelude
38import Prelude
39−import Control.Monad (liftM, void, mzero, guard)
39+import Control.Monad (liftM, void, mzero, guard, when)
40import Control.Monad.Except (throwError)
40import Control.Monad.Except (throwError)
41import Text.Pandoc.Class
41import Text.Pandoc.Class
42 (getResourcePath, readFileFromDirs, PandocMonad(..), report)
42 (getResourcePath, readFileFromDirs, PandocMonad(..), report)
@@ -46,7 +46,7 @@ import Data.Maybe (catMaybes)
46import qualified Data.Map as M
46import qualified Data.Map as M
47import Data.Set (Set)
47import Data.Set (Set)
48import qualified Data.Set as S
48import qualified Data.Set as S
49−import Data.List (intersperse, intercalate)
49+import Data.List (intersperse, intercalate, isSuffixOf)
50import qualified Data.Text as T
50import qualified Data.Text as T
51import Text.Pandoc.Builder as B
51import Text.Pandoc.Builder as B
52import Text.Pandoc.Error (PandocError (PandocParsecError))
52import Text.Pandoc.Error (PandocError (PandocParsecError))
@@ -294,11 +294,13 @@ lexMacro = do
294 char '.' <|> char '\''
294 char '.' <|> char '\''
295 many spacetab
295 many spacetab
296 macroName <- many (satisfy (not . isSpace))
296 macroName <- many (satisfy (not . isSpace))
297− if macroName == "nop"
297+ case macroName of
298− then return mempty
298+ "nop" -> return mempty
299− else do
299+ "ie" -> lexConditional
300− args <- lexArgs
300+ "el" -> skipConditional
302 case macroName of
304 case macroName of
303 "" -> return mempty
305 "" -> return mempty
304 "\\\"" -> return mempty
306 "\\\"" -> return mempty
@@ -311,6 +313,35 @@ lexMacro = do
311 "so" -> lexIncludeFile args
313 "so" -> lexIncludeFile args
312 _ -> resolveMacro macroName args pos
314 _ -> resolveMacro macroName args pos
316+-- We don't fully handle the conditional. But we do
317+-- include everything under '.ie n', which occurs commonly
318+-- in man pages. We always skip the '.el' part.
319+lexConditional :: PandocMonad m => ManLexer m ManTokens
322+ parseNCond <|> skipConditional
324+-- n means nroff mode
325+parseNCond :: PandocMonad m => ManLexer m ManTokens
329+ lexGroup <|> manToken
331+lexGroup :: PandocMonad m => ManLexer m ManTokens
334+ mconcat <$> manyTill manToken groupend
336+ groupstart = try $ string "\\{\\" >> newline
337+ groupend = try $ string "\\}" >> eofline
339+skipConditional :: PandocMonad m => ManLexer m ManTokens
342+ when ("\\{\\" `isSuffixOf` rest) $
343+ void $ manyTill anyChar (try (string "\\}"))
315lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
346lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
316lexIncludeFile args = do
347lexIncludeFile args = do