git.iko.soy/typeable/pandoc
on master help sign in
Man reader: primitive conditional support.

We skip conditionals in general, except .ie n which is used commonly in man pages to test for nroff. For these we evaluate the 'if' portion. Closes #4996.

commit55315ed0d82a3aad965fc681e4c5eeab01f054a8 authorJohn MacFarlane <jgm@berkeley.edu> dateTue 23 Oct 2018, 10:34 (8 years ago) parent81d2372
1 file changed+37−6
src/Text/Pandoc/Readers/Man.hs+37−6
src/Text/Pandoc/Readers/Man.hs+37−6
@@ -36,7 +36,7 @@ Conversion of man to 'Pandoc' document.
3636module Text.Pandoc.Readers.Man (readMan) where
3737
3838import Prelude
39−import Control.Monad (liftM, void, mzero, guard)
39+import Control.Monad (liftM, void, mzero, guard, when)
4040import Control.Monad.Except (throwError)
4141import Text.Pandoc.Class
4242 (getResourcePath, readFileFromDirs, PandocMonad(..), report)
@@ -46,7 +46,7 @@ import Data.Maybe (catMaybes)
4646import qualified Data.Map as M
4747import Data.Set (Set)
4848import qualified Data.Set as S
49−import Data.List (intersperse, intercalate)
49+import Data.List (intersperse, intercalate, isSuffixOf)
5050import qualified Data.Text as T
5151import Text.Pandoc.Builder as B
5252import Text.Pandoc.Error (PandocError (PandocParsecError))
@@ -294,11 +294,13 @@ lexMacro = do
294294 char '.' <|> char '\''
295295 many spacetab
296296 macroName <- many (satisfy (not . isSpace))
297− if macroName == "nop"
298− then return mempty
299− else do
300− args <- lexArgs
297+ case macroName of
298+ "nop" -> return mempty
299+ "ie" -> lexConditional
300+ "el" -> skipConditional
301301
302+ _ -> do
303+ args <- lexArgs
302304 case macroName of
303305 "" -> return mempty
304306 "\\\"" -> return mempty
@@ -311,6 +313,35 @@ lexMacro = do
311313 "so" -> lexIncludeFile args
312314 _ -> resolveMacro macroName args pos
313315
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
320+lexConditional = do
321+ skipMany spacetab
322+ parseNCond <|> skipConditional
323+
324+-- n means nroff mode
325+parseNCond :: PandocMonad m => ManLexer m ManTokens
326+parseNCond = do
327+ char '\n'
328+ many1 spacetab
329+ lexGroup <|> manToken
330+
331+lexGroup :: PandocMonad m => ManLexer m ManTokens
332+lexGroup = do
333+ groupstart
334+ mconcat <$> manyTill manToken groupend
335+ where
336+ groupstart = try $ string "\\{\\" >> newline
337+ groupend = try $ string "\\}" >> eofline
338+
339+skipConditional :: PandocMonad m => ManLexer m ManTokens
340+skipConditional = do
341+ rest <- anyLine
342+ when ("\\{\\" `isSuffixOf` rest) $
343+ void $ manyTill anyChar (try (string "\\}"))
344+ return mempty
314345
315346lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
316347lexIncludeFile args = do