From 48fb6d947df96e8e1f339b2916740f3e216f8908 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Thu, 23 Jul 2020 17:47:02 -0700 Subject: [PATCH] Add `raw_markdown` extension affecting `ipynb` reader. Specifying `-f ipynb+raw_markdown` will cause Markdown cells to be represented as raw Markdown blocks, instead of being parsed. This is not what you want when going from `ipynb` to other formats, but it may be useful when going from `ipynb` to Markdown or to `ipynb`, to avoid semantically insignificant changes in the contents of the Markdown cells that might otherwise be introduced. Closes #5408. --- MANUAL.txt | 8 ++++++++ src/Text/Pandoc/Extensions.hs | 4 +++- src/Text/Pandoc/Readers/Ipynb.hs | 6 +++++- src/Text/Pandoc/Writers/Markdown.hs | 4 ++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/MANUAL.txt b/MANUAL.txt index 5f110dc5f866..aab56c9d7cde 100644 --- a/MANUAL.txt +++ b/MANUAL.txt @@ -2910,6 +2910,14 @@ input formats In the `muse` input format, this enables Text::Amuse extensions to Emacs Muse markup. +#### Extension: `raw_markdown` #### + +In the `ipynb` input format, this causes Markdown cells +to be included as raw Markdown blocks (allowing lossless +round-tripping) rather than being parsed. Use this only +when you are targetting `ipynb` or a markdown-based +output format. + #### Extension: `citations` {#org-citations} Some aspects of [Pandoc's Markdown citation syntax](#citations) are also accepted diff --git a/src/Text/Pandoc/Extensions.hs b/src/Text/Pandoc/Extensions.hs index 0a33cf39e118..0358c84f1936 100644 --- a/src/Text/Pandoc/Extensions.hs +++ b/src/Text/Pandoc/Extensions.hs @@ -133,6 +133,7 @@ data Extension = | Ext_raw_attribute -- ^ Allow explicit raw blocks/inlines | Ext_raw_html -- ^ Allow raw HTML | Ext_raw_tex -- ^ Allow raw TeX (other than math) + | Ext_raw_markdown -- ^ Parse markdown in ipynb as raw markdown | Ext_shortcut_reference_links -- ^ Shortcut reference links | Ext_simple_tables -- ^ Pandoc-style simple tables | Ext_smart -- ^ "Smart" quotes, apostrophes, ellipses, dashes @@ -442,7 +443,8 @@ getAllExtensions f = universalExtensions <> getAll f getAll "markdown_mmd" = allMarkdownExtensions getAll "markdown_github" = allMarkdownExtensions getAll "markdown" = allMarkdownExtensions - getAll "ipynb" = allMarkdownExtensions + getAll "ipynb" = allMarkdownExtensions <> extensionsFromList + [ Ext_raw_markdown ] getAll "docx" = extensionsFromList [ Ext_empty_paragraphs , Ext_styles diff --git a/src/Text/Pandoc/Readers/Ipynb.hs b/src/Text/Pandoc/Readers/Ipynb.hs index a245bdad3a36..a866e6ec3c48 100644 --- a/src/Text/Pandoc/Readers/Ipynb.hs +++ b/src/Text/Pandoc/Readers/Ipynb.hs @@ -78,7 +78,11 @@ cellToBlocks opts lang c = do mapM_ addAttachment attachments case cellType c of Ipynb.Markdown -> do - Pandoc _ bs <- walk fixImage <$> readMarkdown opts source + bs <- if isEnabled Ext_raw_markdown opts + then return [RawBlock (Format "markdown") source] + else do + Pandoc _ bs <- walk fixImage <$> readMarkdown opts source + return bs return $ B.divWith ("",["cell","markdown"],kvs) $ B.fromList bs Ipynb.Heading lev -> do diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs index 15807123eff2..d0b50a8d62c5 100644 --- a/src/Text/Pandoc/Writers/Markdown.hs +++ b/src/Text/Pandoc/Writers/Markdown.hs @@ -483,10 +483,10 @@ blockToMarkdown' opts b@(RawBlock f str) = do let renderEmpty = mempty <$ report (BlockNotRendered b) case variant of PlainText -> renderEmpty - _ | isEnabled Ext_raw_attribute opts -> rawAttribBlock - | f `elem` ["markdown", "markdown_github", "markdown_phpextra", + _ | f `elem` ["markdown", "markdown_github", "markdown_phpextra", "markdown_mmd", "markdown_strict"] -> return $ literal str <> literal "\n" + | isEnabled Ext_raw_attribute opts -> rawAttribBlock | f `elem` ["html", "html5", "html4"] -> case () of _ | isEnabled Ext_markdown_attribute opts -> return $