summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Trauner <philip.trauner@arztpraxis.io>2019-02-07 20:59:04 +0100
committerWaylan Limberg <waylan.limberg@icloud.com>2019-02-07 14:59:04 -0500
commit12864d276855231c1d72f0da8efd8dace20a9062 (patch)
treee326d0040df666ff3655d16218cf4a8a6ca18202
parent505cc0978c9a53b906cceec9aeebc0e2a5da74fc (diff)
downloadpython-markdown-12864d276855231c1d72f0da8efd8dace20a9062.tar.gz
Handle overlapping raw HTML matches (#770)
Recursively run substitution to handle overlapping matches. Fixes #458.
-rw-r--r--docs/change_log/release-3.1.md1
-rw-r--r--markdown/postprocessors.py11
-rw-r--r--tests/test_syntax/extensions/test_fenced_code.py53
3 files changed, 62 insertions, 3 deletions
diff --git a/docs/change_log/release-3.1.md b/docs/change_log/release-3.1.md
index c5f0433..55dde79 100644
--- a/docs/change_log/release-3.1.md
+++ b/docs/change_log/release-3.1.md
@@ -31,6 +31,7 @@ The following new features have been included in the release:
The following bug fixes are included in the 3.1 release:
+* Overlapping raw HTML matches no longer leave placeholders behind (#458).
* Emphasis patterns now recognize newline characters as whitespace (#783).
* Version format had been updated to be PEP 440 compliant (#736).
* Block level elements are defined per instance, not as class attributes
diff --git a/markdown/postprocessors.py b/markdown/postprocessors.py
index cecb4ad..5cfb4e6 100644
--- a/markdown/postprocessors.py
+++ b/markdown/postprocessors.py
@@ -81,9 +81,14 @@ class RawHtmlPostprocessor(Postprocessor):
if replacements:
pattern = re.compile("|".join(re.escape(k) for k in replacements))
- text = pattern.sub(lambda m: replacements[m.group(0)], text)
-
- return text
+ processed_text = pattern.sub(lambda m: replacements[m.group(0)], text)
+ else:
+ return text
+
+ if processed_text == text:
+ return processed_text
+ else:
+ return self.run(processed_text)
def isblocklevel(self, html):
m = re.match(r'^\<\/?([^ >]+)', html)
diff --git a/tests/test_syntax/extensions/test_fenced_code.py b/tests/test_syntax/extensions/test_fenced_code.py
new file mode 100644
index 0000000..5f1d736
--- /dev/null
+++ b/tests/test_syntax/extensions/test_fenced_code.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+"""
+Python Markdown
+
+A Python implementation of John Gruber's Markdown.
+
+Documentation: https://python-markdown.github.io/
+GitHub: https://github.com/Python-Markdown/markdown/
+PyPI: https://pypi.org/project/Markdown/
+
+Started by Manfred Stienstra (http://www.dwerg.net/).
+Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org).
+Currently maintained by Waylan Limberg (https://github.com/waylan),
+Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser).
+
+Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later)
+Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
+Copyright 2004 Manfred Stienstra (the original version)
+
+License: BSD (see LICENSE.md for details).
+"""
+
+from __future__ import unicode_literals
+from markdown.test_tools import TestCase
+
+
+class TestFencedCode(TestCase):
+
+ # TODO: Move the rest of the fenced code tests here.
+
+ def test_fenced_code_in_raw_html(self):
+ self.assertMarkdownRenders(
+ self.dedent(
+ """
+ <details>
+ ```
+ Begone placeholders!
+ ```
+ </details>
+ """
+ ),
+ self.dedent(
+ """
+ <details>
+
+ <pre><code>Begone placeholders!
+ </code></pre>
+
+ </details>
+ """
+ ),
+ extensions=['fenced_code']
+ )