Skip to content

Commit

Permalink
Fix double escaping of block code (Python-Markdown#727)
Browse files Browse the repository at this point in the history
  • Loading branch information
facelessuser authored and waylan committed Oct 7, 2018
1 parent 6323ba6 commit 2b064ff
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 1 deletion.
9 changes: 8 additions & 1 deletion markdown/extensions/codehilite.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,20 @@ def _parseHeader(self):
class HiliteTreeprocessor(Treeprocessor):
""" Hilight source code in code blocks. """

def code_unescape(self, text):
"""Unescape code."""
text = text.replace("&", "&")
text = text.replace("&lt;", "<")
text = text.replace("&gt;", ">")
return text

def run(self, root):
""" Find code blocks and store in htmlStash. """
blocks = root.iter('pre')
for block in blocks:
if len(block) == 1 and block[0].tag == 'code':
code = CodeHilite(
block[0].text,
self.code_unescape(block[0].text),
linenums=self.config['linenums'],
guess_lang=self.config['guess_lang'],
css_class=self.config['css_class'],
Expand Down
92 changes: 92 additions & 0 deletions tests/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,49 @@ def testUsePygmentsFalse(self):
'</code></pre>'
)

def testDoubleEscape(self):
""" Test entity escape logic in indented code blocks. """

text = '\t:::html\n\t<span>This&amp;That</span>'
md = markdown.Markdown(
extensions=[markdown.extensions.codehilite.CodeHiliteExtension()]
)
if self.has_pygments:
self.assertEqual(
md.convert(text),
'<div class="codehilite"><pre>'
'<span></span>'
'<span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>'
'This<span class="ni">&amp;amp;</span>That'
'<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>'
'\n</pre></div>'
)
else:
self.assertEqual(
md.convert(text),
'<pre class="codehilite"><code class="language-html">'
'&lt;span&gt;This&amp;amp;That&lt;/span&gt;'
'</code></pre>'
)

def testHighlightAmps(self):
""" Test amp conversion logic. """

text = '\t:::text\n\t&\n\t&amp;\n\t&amp;amp;'
md = markdown.Markdown(
extensions=[markdown.extensions.codehilite.CodeHiliteExtension()]
)
if self.has_pygments:
self.assertEqual(
md.convert(text),
'<div class="codehilite"><pre><span></span>&amp;\n&amp;amp;\n&amp;amp;amp;\n</pre></div>'
)
else:
self.assertEqual(
md.convert(text),
'<pre class="codehilite"><code class="language-text">&amp;\n&amp;amp;\n&amp;amp;amp;</code></pre>'
)


class TestFencedCode(TestCaseWithAssertStartsWith):
""" Test fenced_code extension. """
Expand Down Expand Up @@ -406,6 +449,55 @@ def testFencedLanguageAndPygmentsDisabled(self):
)
self.assertTrue('<code class="language-python">' in md.convert(text))

def testFencedLanguageDoubleEscape(self):
""" Test entity escape logic in fences. """

text = '```html\n<span>This&amp;That</span>\n```'
md = markdown.Markdown(
extensions=[
markdown.extensions.codehilite.CodeHiliteExtension(),
'fenced_code'
]
)
if self.has_pygments:
self.assertEqual(
md.convert(text),
'<div class="codehilite"><pre>'
'<span></span>'
'<span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>'
'This<span class="ni">&amp;amp;</span>That'
'<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>'
'\n</pre></div>'
)
else:
self.assertEqual(
md.convert(text),
'<pre class="codehilite"><code class="language-html">'
'&lt;span&gt;This&amp;amp;That&lt;/span&gt;'
'</code></pre>'
)

def testFencedAmps(self):
""" Test amp conversion. """

text = '```text\n&\n&amp;\n&amp;amp;\n```'
md = markdown.Markdown(
extensions=[
markdown.extensions.codehilite.CodeHiliteExtension(),
'fenced_code'
]
)
if self.has_pygments:
self.assertEqual(
md.convert(text),
'<div class="codehilite"><pre><span></span>&amp;\n&amp;amp;\n&amp;amp;amp;\n</pre></div>'
)
else:
self.assertEqual(
md.convert(text),
'<pre class="codehilite"><code class="language-text">&amp;\n&amp;amp;\n&amp;amp;amp;</code></pre>'
)


class TestMetaData(unittest.TestCase):
""" Test MetaData extension. """
Expand Down

0 comments on commit 2b064ff

Please sign in to comment.