diff options
author | John MacFarlane <jgm@berkeley.edu> | 2017-10-23 21:40:45 -0700 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2017-10-23 22:45:28 -0700 |
commit | fda0c0119f415c6df95b20730650388c0471241d (patch) | |
tree | 2d198546bef025e27a641892f12cdb72c712fc72 /src/Text | |
parent | 896803b0d5d1f5d680d125eb75913025fa734190 (diff) | |
download | pandoc-fda0c0119f415c6df95b20730650388c0471241d.tar.gz |
Implemented fenced Divs.
+ Added Ext_fenced_divs to Extensions (default for pandoc Markdown).
+ Document fenced_divs extension in manual.
+ Implemented fenced code divs in Markdown reader.
+ Added test.
Closes #168.
Diffstat (limited to 'src/Text')
-rw-r--r-- | src/Text/Pandoc/Extensions.hs | 2 | ||||
-rw-r--r-- | src/Text/Pandoc/Parsing.hs | 2 | ||||
-rw-r--r-- | src/Text/Pandoc/Readers/Markdown.hs | 28 |
3 files changed, 32 insertions, 0 deletions
diff --git a/src/Text/Pandoc/Extensions.hs b/src/Text/Pandoc/Extensions.hs index 5d3a4cb29..8c8b405be 100644 --- a/src/Text/Pandoc/Extensions.hs +++ b/src/Text/Pandoc/Extensions.hs @@ -107,6 +107,7 @@ data Extension = | Ext_raw_attribute -- ^ Allow explicit raw blocks/inlines | Ext_markdown_in_html_blocks -- ^ Interpret as markdown inside HTML blocks | Ext_native_divs -- ^ Use Div blocks for contents of <div> tags + | Ext_fenced_divs -- ^ Allow fenced div syntax ::: | Ext_native_spans -- ^ Use Span inlines for contents of <span> | Ext_bracketed_spans -- ^ Bracketed spans with attributes | Ext_markdown_attribute -- ^ Interpret text inside HTML as markdown @@ -183,6 +184,7 @@ pandocExtensions = extensionsFromList , Ext_raw_attribute , Ext_markdown_in_html_blocks , Ext_native_divs + , Ext_fenced_divs , Ext_native_spans , Ext_bracketed_spans , Ext_escaped_line_breaks diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs index 2543f11f0..73498788d 100644 --- a/src/Text/Pandoc/Parsing.hs +++ b/src/Text/Pandoc/Parsing.hs @@ -1069,6 +1069,7 @@ data ParserState = ParserState -- roles), 3) Additional classes (rest of Attr is unused)). stateCaption :: Maybe Inlines, -- ^ Caption in current environment stateInHtmlBlock :: Maybe String, -- ^ Tag type of HTML block being parsed + stateFencedDivLevel :: Int, -- ^ Depth of fenced div stateContainers :: [String], -- ^ parent include files stateLogMessages :: [LogMessage], -- ^ log messages stateMarkdownAttribute :: Bool -- ^ True if in markdown=1 context @@ -1185,6 +1186,7 @@ defaultParserState = stateRstCustomRoles = M.empty, stateCaption = Nothing, stateInHtmlBlock = Nothing, + stateFencedDivLevel = 0, stateContainers = [], stateLogMessages = [], stateMarkdownAttribute = False diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 61c07ed12..221c834e8 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -499,6 +499,7 @@ block = do , header , lhsCodeBlock , divHtml + , divFenced , htmlBlock , table , codeBlockIndented @@ -1686,6 +1687,9 @@ endline = try $ do guardEnabled Ext_blank_before_header <|> (notFollowedBy . char =<< atxChar) -- atx header guardDisabled Ext_backtick_code_blocks <|> notFollowedBy (() <$ (lookAhead (char '`') >> codeBlockFenced)) + guardDisabled Ext_fenced_divs <|> + do divLevel <- stateFencedDivLevel <$> getState + guard (divLevel < 1) <|> notFollowedBy fenceEnd notFollowedByHtmlCloser (eof >> return mempty) <|> (guardEnabled Ext_hard_line_breaks >> return (return B.linebreak)) @@ -1930,6 +1934,30 @@ divHtml = try $ do else -- avoid backtracing return $ return (B.rawBlock "html" (rawtag <> bls)) <> contents +divFenced :: PandocMonad m => MarkdownParser m (F Blocks) +divFenced = try $ do + guardEnabled Ext_fenced_divs + nonindentSpaces + string ":::" + skipMany (char ':') + skipMany spaceChar + attribs <- attributes <|> ((\x -> ("",[x],[])) <$> many1 nonspaceChar) + skipMany spaceChar + skipMany (char ':') + blankline + updateState $ \st -> st{ stateFencedDivLevel = stateFencedDivLevel st + 1 } + bs <- mconcat <$> manyTill block fenceEnd + updateState $ \st -> st{ stateFencedDivLevel = stateFencedDivLevel st - 1 } + return $ B.divWith attribs <$> bs + +fenceEnd :: PandocMonad m => MarkdownParser m () +fenceEnd = try $ do + nonindentSpaces + string ":::" + skipMany (char ':') + blanklines + return () + rawHtmlInline :: PandocMonad m => MarkdownParser m (F Inlines) rawHtmlInline = do guardEnabled Ext_raw_html |