git.iko.soy/typeable/pandoc
on master help sign in
Man reader: primitive conditional support.
55315edJohn MacFarlane
src/Text/Pandoc/Readers/Man.hs+37−6
@@ -36,7 +36,7 @@ Conversion of man to 'Pandoc' document.
36module Text.Pandoc.Readers.Man (readMan) where
36module Text.Pandoc.Readers.Man (readMan) where
37
37
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
301
301
302+ _ -> do
303+ args <- lexArgs
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
313
315
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
314
345
315lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
346lexIncludeFile :: PandocMonad m => [Arg] -> ManLexer m ManTokens
316lexIncludeFile args = do
347lexIncludeFile args = do