diff options
author | Isaac Muse <faceless.shop@gmail.com> | 2018-10-07 17:23:02 -0600 |
---|---|---|
committer | Waylan Limberg <waylan.limberg@icloud.com> | 2018-10-07 19:23:02 -0400 |
commit | 2b064ffc2c34eb9bb20bff58a78433cd04d4b8ad (patch) | |
tree | c58ca7ac9596af88de48a132acc2891aed7052ce | |
parent | 6323ba6c98cadc19c0a7eebe9b09279b738dc109 (diff) | |
download | python-markdown-2b064ffc2c34eb9bb20bff58a78433cd04d4b8ad.tar.gz |
Fix double escaping of block code (#727)
Fixes #725
-rw-r--r-- | markdown/extensions/codehilite.py | 9 | ||||
-rw-r--r-- | tests/test_extensions.py | 92 |
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("&", "&") + text = text.replace("<", "<") + text = text.replace(">", ">") + 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&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"><</span><span class="nt">span</span><span class="p">></span>' + 'This<span class="ni">&amp;</span>That' + '<span class="p"></</span><span class="nt">span</span><span class="p">></span>' + '\n</pre></div>' + ) + else: + self.assertEqual( + md.convert(text), + '<pre class="codehilite"><code class="language-html">' + '<span>This&amp;That</span>' + '</code></pre>' + ) + + def testHighlightAmps(self): + """ Test amp conversion logic. """ + + text = '\t:::text\n\t&\n\t&\n\t&amp;' + md = markdown.Markdown( + extensions=[markdown.extensions.codehilite.CodeHiliteExtension()] + ) + if self.has_pygments: + self.assertEqual( + md.convert(text), + '<div class="codehilite"><pre><span></span>&\n&amp;\n&amp;amp;\n</pre></div>' + ) + else: + self.assertEqual( + md.convert(text), + '<pre class="codehilite"><code class="language-text">&\n&amp;\n&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&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"><</span><span class="nt">span</span><span class="p">></span>' + 'This<span class="ni">&amp;</span>That' + '<span class="p"></</span><span class="nt">span</span><span class="p">></span>' + '\n</pre></div>' + ) + else: + self.assertEqual( + md.convert(text), + '<pre class="codehilite"><code class="language-html">' + '<span>This&amp;That</span>' + '</code></pre>' + ) + + def testFencedAmps(self): + """ Test amp conversion. """ + + text = '```text\n&\n&\n&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>&\n&amp;\n&amp;amp;\n</pre></div>' + ) + else: + self.assertEqual( + md.convert(text), + '<pre class="codehilite"><code class="language-text">&\n&amp;\n&amp;amp;</code></pre>' + ) + class TestMetaData(unittest.TestCase): """ Test MetaData extension. """ |