From 075f958c6a96449f071dea2a9bbfaaad98905f33 Mon Sep 17 00:00:00 2001 From: fiddlosopher Date: Sun, 14 Mar 2010 23:23:20 +0000 Subject: Markdown(+lhs) reader: handle "inverse bird tracks" Inverse bird tracks (<) are used for haskell example code that is not part of the literate Haskell program. Resolves Issue #211. git-svn-id: https://pandoc.googlecode.com/svn/trunk@1888 788f1e2b-df1e-0410-8736-df70ead52e1b --- src/Text/Pandoc/Readers/Markdown.hs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index fccde1140..82c761685 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -409,8 +409,10 @@ codeBlockIndented = do lhsCodeBlock :: GenParser Char ParserState Block lhsCodeBlock = do failUnlessLHS - contents <- lhsCodeBlockBird <|> lhsCodeBlockLaTeX - return $ CodeBlock ("",["sourceCode","literate","haskell"],[]) contents + liftM (CodeBlock ("",["sourceCode","literate","haskell"],[])) + (lhsCodeBlockBird <|> lhsCodeBlockLaTeX) + <|> liftM (CodeBlock ("",["sourceCode","haskell"],[])) + lhsCodeBlockInverseBird lhsCodeBlockLaTeX :: GenParser Char ParserState String lhsCodeBlockLaTeX = try $ do @@ -421,10 +423,16 @@ lhsCodeBlockLaTeX = try $ do return $ stripTrailingNewlines contents lhsCodeBlockBird :: GenParser Char ParserState String -lhsCodeBlockBird = try $ do +lhsCodeBlockBird = lhsCodeBlockBirdWith '>' + +lhsCodeBlockInverseBird :: GenParser Char ParserState String +lhsCodeBlockInverseBird = lhsCodeBlockBirdWith '<' + +lhsCodeBlockBirdWith :: Char -> GenParser Char ParserState String +lhsCodeBlockBirdWith c = try $ do pos <- getPosition when (sourceColumn pos /= 1) $ fail "Not in first column" - lns <- many1 birdTrackLine + lns <- many1 $ birdTrackLine c -- if (as is normal) there is always a space after >, drop it let lns' = if all (\ln -> null ln || take 1 ln == " ") lns then map (drop 1) lns @@ -432,9 +440,9 @@ lhsCodeBlockBird = try $ do blanklines return $ intercalate "\n" lns' -birdTrackLine :: GenParser Char st [Char] -birdTrackLine = do - char '>' +birdTrackLine :: Char -> GenParser Char st [Char] +birdTrackLine c = do + char c manyTill anyChar newline -- cgit v1.2.3