Markdown writer: Ensure the code fence is long enough.

Previously too few backticks were used when the code block
contained an indented line of backticks.  (Ditto tildes.)

Cloess #5519.
This commit is contained in:
John MacFarlane
2019-05-22 15:21:15 -07:00
parent c17ace8c09
commit aef71894ce
2 changed files with 24 additions and 11 deletions
+10 -11
View File
@@ -23,7 +23,8 @@ import Control.Monad.State.Strict
import Data.Char (isPunctuation, isSpace, isAlphaNum)
import Data.Default
import qualified Data.HashMap.Strict as H
import Data.List (find, group, intersperse, sortBy, stripPrefix, transpose)
import Data.List (find, group, intersperse, sortBy, stripPrefix, transpose,
isPrefixOf)
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
import Data.Monoid (Any (..))
@@ -544,16 +545,14 @@ blockToMarkdown' opts (CodeBlock attribs str) = return $
| isEnabled Ext_fenced_code_blocks opts ->
tildes <> attrs <> cr <> text str <> cr <> tildes <> blankline
_ -> nest (writerTabStop opts) (text str) <> blankline
where tildes = text $ case [ln | ln <- lines str, all (=='~') ln] of
[] -> "~~~~"
xs -> case maximum $ map length xs of
n | n < 3 -> "~~~~"
| otherwise -> replicate (n+1) '~'
backticks = text $ case [ln | ln <- lines str, all (=='`') ln] of
[] -> "```"
xs -> case maximum $ map length xs of
n | n < 3 -> "```"
| otherwise -> replicate (n+1) '`'
where endline c = text $ case [length ln
| ln <- map trim (lines str)
, [c,c,c] `isPrefixOf` ln
, all (== c) ln] of
[] -> replicate 3 c
xs -> replicate (maximum xs + 1) c
backticks = endline '`'
tildes = endline '~'
attrs = if isEnabled Ext_fenced_code_attributes opts
then nowrap $ " " <> attrsToMarkdown attribs
else case attribs of
+14
View File
@@ -0,0 +1,14 @@
~~~
% pandoc -t markdown
``````{.attr}
```
code
```
``````
^D
```` {.attr}
```
code
```
````
~~~