summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Muse <faceless.shop@gmail.com>2018-10-07 17:23:02 -0600
committerWaylan Limberg <waylan.limberg@icloud.com>2018-10-07 19:23:02 -0400
commit2b064ffc2c34eb9bb20bff58a78433cd04d4b8ad (patch)
treec58ca7ac9596af88de48a132acc2891aed7052ce
parent6323ba6c98cadc19c0a7eebe9b09279b738dc109 (diff)
downloadpython-markdown-2b064ffc2c34eb9bb20bff58a78433cd04d4b8ad.tar.gz
Fix double escaping of block code (#727)
Fixes #725
-rw-r--r--markdown/extensions/codehilite.py9
-rw-r--r--tests/test_extensions.py92
2 files changed, 100 insertions, 1 deletions
diff --git a/markdown/extensions/codehilite.py b/markdown/extensions/codehilite.py
index d204ebf..712618f 100644
--- a/markdown/extensions/codehilite.py
+++ b/markdown/extensions/codehilite.py
@@ -200,13 +200,20 @@ class CodeHilite(object):
class HiliteTreeprocessor(Treeprocessor):
""" Hilight source code in code blocks. """
+ def code_unescape(self, text):
+ """Unescape code."""
+ text = text.replace("&amp;", "&")
+ 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'],
diff --git a/tests/test_extensions.py b/tests/test_extensions.py
index 5489887..86e4f05 100644
--- a/tests/test_extensions.py
+++ b/tests/test_extensions.py
@@ -250,6 +250,49 @@ class TestCodeHilite(TestCaseWithAssertStartsWith):
'</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. """
@@ -406,6 +449,55 @@ line 3
)
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. """