From 6f3e228bd9cfebd9fb9a9eb6eb1d2b8e5d1eaec1 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Sat, 11 Aug 2012 19:44:23 -0700 Subject: Mardkown reader: Implemented Ext_markdown_attribute. --- src/Text/Pandoc/Options.hs | 1 + src/Text/Pandoc/Readers/Markdown.hs | 37 +++++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) (limited to 'src/Text/Pandoc') diff --git a/src/Text/Pandoc/Options.hs b/src/Text/Pandoc/Options.hs index f7f07a939..6d235e7a8 100644 --- a/src/Text/Pandoc/Options.hs +++ b/src/Text/Pandoc/Options.hs @@ -64,6 +64,7 @@ data Extension = Ext_footnotes | Ext_delimited_code_blocks | Ext_inline_code_attributes | Ext_markdown_in_html_blocks + | Ext_markdown_attribute | Ext_escaped_line_breaks | Ext_autolink_code_spans | Ext_fancy_lists diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 8a1299de6..882fe1f63 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -52,6 +52,7 @@ import Control.Applicative ((<$>), (<*), (*>), (<$)) import Control.Monad import Text.HTML.TagSoup import Text.HTML.TagSoup.Match (tagOpen) +import qualified Data.Set as Set -- | Read markdown from an input string and return a Pandoc document. readMarkdown :: ReaderOptions -- ^ Reader options @@ -720,13 +721,13 @@ htmlBlock' = try $ do strictHtmlBlock :: Parser [Char] ParserState String strictHtmlBlock = htmlInBalanced (not . isInlineTag) -rawVerbatimBlock :: Parser [Char] ParserState String +rawVerbatimBlock :: Parser [Char] ParserState (Tag String, String) rawVerbatimBlock = try $ do - (TagOpen tag _, open) <- htmlTag (tagOpen (\t -> + (TagOpen tag as, open) <- htmlTag (tagOpen (\t -> t == "pre" || t == "style" || t == "script") (const True)) contents <- manyTill anyChar (htmlTag (~== TagClose tag)) - return $ open ++ contents ++ renderTags [TagClose tag] + return (TagOpen tag as, open ++ contents ++ renderTags [TagClose tag]) rawTeXBlock :: Parser [Char] ParserState (F Blocks) rawTeXBlock = do @@ -738,17 +739,25 @@ rawTeXBlock = do rawHtmlBlocks :: Parser [Char] ParserState String rawHtmlBlocks = do - htmlBlocks <- many1 $ do blk <- rawVerbatimBlock <|> - liftM snd (htmlTag isBlockTag) - sps <- do sp1 <- many spaceChar - sp2 <- option "" (blankline >> return "\n") - sp3 <- many spaceChar - sp4 <- option "" blanklines - return $ sp1 ++ sp2 ++ sp3 ++ sp4 - -- note: we want raw html to be able to - -- precede a code block, when separated - -- by a blank line - return $ blk ++ sps + htmlBlocks <- many1 $ try $ do + (t,s) <- rawVerbatimBlock <|> htmlTag isBlockTag + exts <- getOption readerExtensions + -- if open tag, need markdown=1 if + -- markdown_attributes extension is set + when (Ext_markdown_attribute `Set.member` exts + && isTagOpen t) $ guard + $ case t of + TagOpen _ as -> "markdown" `elem` map fst as + _ -> False + sps <- do sp1 <- many spaceChar + sp2 <- option "" (blankline >> return "\n") + sp3 <- many spaceChar + sp4 <- option "" blanklines + return $ sp1 ++ sp2 ++ sp3 ++ sp4 + -- note: we want raw html to be able to + -- precede a code block, when separated + -- by a blank line + return $ s ++ sps let combined = concat htmlBlocks return $ if last combined == '\n' then init combined else combined -- cgit v1.2.3