aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2018-10-23 10:34:56 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2018-10-23 10:35:35 -0700
commit55315ed0d82a3aad965fc681e4c5eeab01f054a8 (patch)
tree6c6b9f202e16df809b73d8f775df03f02c82842a
parent81d2372f572485a5fadde78c75e0a08d55a80c7f (diff)
downloadpandoc-55315ed0d82a3aad965fc681e4c5eeab01f054a8.tar.gz
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.
-rw-r--r--src/Text/Pandoc/Readers/Man.hs43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/Text/Pandoc/Readers/Man.hs b/src/Text/Pandoc/Readers/Man.hs
index cb19bc7c8..73a7dcd72 100644
--- a/src/Text/Pandoc/Readers/Man.hs
+++ b/src/Text/Pandoc/Readers/Man.hs
@@ -36,7 +36,7 @@ Conversion of man to 'Pandoc' document.
module Text.Pandoc.Readers.Man (readMan) where
import Prelude
-import Control.Monad (liftM, void, mzero, guard)
+import Control.Monad (liftM, void, mzero, guard, when)
import Control.Monad.Except (throwError)
import Text.Pandoc.Class
(getResourcePath, readFileFromDirs, PandocMonad(..), report)
@@ -46,7 +46,7 @@ import Data.Maybe (catMaybes)
import qualified Data.Map as M
import Data.Set (Set)
import qualified Data.Set as S
-import Data.List (intersperse, intercalate)
+import Data.List (intersperse, intercalate, isSuffixOf)
import qualified Data.Text as T
import Text.Pandoc.Builder as B
import Text.Pandoc.Error (PandocError (PandocParsecError))
@@ -294,11 +294,13 @@ lexMacro = do
char '.' <|> char '\''
many spacetab
macroName <- many (satisfy (not . isSpace))
- if macroName == "nop"
- then return mempty
- else do
- args <- lexArgs
+ case macroName of
+ "nop" -> return mempty
+ "ie" -> lexConditional
+ "el" -> skipConditional
+ _ -> do
+ args <- lexArgs
case macroName of
"" -> return mempty
"\\\"" -> return mempty
@@ -311,6 +313,35 @@ lexMacro = do
"so" -> lexIncludeFile args
_ -> resolveMacro macroName args pos
+-- We don't fully handle the conditional. But we do
+-- include everything under '.ie n', which occurs commonly
+-- in man pages. We always skip the '.el' part.
+lexConditional :: PandocMonad m => ManLexer m ManTokens
+lexConditional = do
+ skipMany spacetab
+ parseNCond <|> skipConditional
+
+-- n means nroff mode
+parseNCond :: PandocMonad m => ManLexer m ManTokens
+parseNCond = do
+ char '\n'
+ many1 spacetab
+ lexGroup <|> manToken
+
+lexGroup :: PandocMonad m => ManLexer m ManTokens
+lexGroup = do
+ groupstart
+ mconcat <$> manyTill manToken groupend
+ where
+ groupstart = try $ string "\\{\\" >> newline
+ groupend = try $ string "\\}" >> eofline
+
+skipConditional :: PandocMonad m => ManLexer m ManTokens
+skipConditional = do
+ rest <- anyLine
+ when ("\\{\\" `isSuffixOf` rest) $
+ void $ manyTill anyChar (try (string "\\}"))
+ return mempty
lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
lexIncludeFile args = do