Skip to content

Commit a24c58b

Browse files
committedFeb 25, 2020
Fixed multiple ticks/tildes inside code blocks.
1 parent cae7098 commit a24c58b

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed
 

‎src/commonmark-rules.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,25 @@ rules.fencedCodeBlock = {
111111
replacement: function (content, node, options) {
112112
var className = node.firstChild.className || ''
113113
var language = (className.match(/language-(\S+)/) || [null, ''])[1]
114+
var code = node.firstChild.textContent
115+
116+
var fenceChar = options.fence === '~~~' ? '~' : '`'
117+
var fenceSize = 3
118+
var fenceInCodeRegex = new RegExp('^' + fenceChar + '{3,}', 'gm')
119+
120+
var match
121+
while ((match = fenceInCodeRegex.exec(code))) {
122+
if (match[ 0 ].length >= fenceSize) {
123+
fenceSize = match[ 0 ].length + 1
124+
}
125+
}
126+
127+
var fence = fenceChar.repeat(fenceSize)
114128

115129
return (
116-
'\n\n' + options.fence + language + '\n' +
117-
node.firstChild.textContent +
118-
'\n' + options.fence + '\n\n'
130+
'\n\n' + fence + language + '\n' +
131+
code.replace(/^\n|\n$/g, '') +
132+
'\n' + fence + '\n\n'
119133
)
120134
}
121135
}

‎test/index.html

+45
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,51 @@ <h2>This is a header.</h2>
902902
<pre class="expected">Foo Bar</pre>
903903
</div>
904904

905+
<div class="case" data-name="triple tildes inside code" data-options='{"codeBlockStyle": "fenced", "fence": "~~~"}'>
906+
<div class="input">
907+
<pre><code>
908+
~~~
909+
Code
910+
~~~
911+
</code></pre>
912+
</div>
913+
<pre class="expected">~~~~
914+
~~~
915+
Code
916+
~~~
917+
~~~~</pre>
918+
</div>
919+
920+
<div class="case" data-name="triple ticks inside code" data-options='{"codeBlockStyle": "fenced", "fence": "```"}'>
921+
<div class="input">
922+
<pre><code>
923+
```
924+
Code
925+
```
926+
</code></pre>
927+
</div>
928+
<pre class="expected">````
929+
```
930+
Code
931+
```
932+
````</pre>
933+
</div>
934+
935+
<div class="case" data-name="four ticks inside code" data-options='{"codeBlockStyle": "fenced", "fence": "```"}'>
936+
<div class="input">
937+
<pre><code>
938+
````
939+
Code
940+
````
941+
</code></pre>
942+
</div>
943+
<pre class="expected">`````
944+
````
945+
Code
946+
````
947+
`````</pre>
948+
</div>
949+
905950
<!-- /TEST CASES -->
906951

907952
<script src="turndown-test.browser.js"></script>

0 commit comments

Comments
 (0)
Please sign in to comment.