changeset 883:f12751259f66

Add a Markdown extension to only allow https based <img> tags. This is not yet "turned on" in the site's markup system.
author Brian Neal <bgneal@gmail.com>
date Tue, 03 Feb 2015 19:51:12 -0600
parents 9a3019f2c7dc
children 3d635fd53ef0
files core/mdexts/ssl_images.py core/tests/test_mdexts.py
diffstat 2 files changed, 55 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/mdexts/ssl_images.py	Tue Feb 03 19:51:12 2015 -0600
@@ -0,0 +1,28 @@
+"""
+A python-markdown extension to turn <img> tags with http: source attributes into
+<a> tags.
+"""
+from urlparse import urlparse
+
+import markdown
+
+
+class SslImagesTreeprocessor(markdown.treeprocessors.Treeprocessor):
+
+    def run(self, root):
+        for node in root.iter('img'):
+            src = node.get('src')
+            if src:
+                url = urlparse(src)
+                if url.scheme == 'http':
+                    node.clear()
+                    node.tag = 'a'
+                    node.text = 'Click for image'
+                    node.set('href', url.geturl())
+
+
+class SslImagesExtension(markdown.Extension):
+
+    def extendMarkdown(self, md, md_globals):
+        tree_proc = SslImagesTreeprocessor()
+        md.treeprocessors.add('ssl_images', tree_proc, '>inline')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tests/test_mdexts.py	Tue Feb 03 19:51:12 2015 -0600
@@ -0,0 +1,27 @@
+"""Testing our custom Markdown extensions."""
+
+import unittest
+
+import markdown
+
+from core.mdexts.ssl_images import SslImagesExtension
+
+
+class SslImagesExtTestCase(unittest.TestCase):
+    """Tests for the SslImagesExtension."""
+
+    def setUp(self):
+        self.md = markdown.Markdown(extensions=[SslImagesExtension()])
+
+    def test_simple(self):
+        self.assertEqual(self.md.convert(''), '')
+        self.assertEqual(self.md.convert('1'), '<p>1</p>')
+
+    def test_no_change(self):
+        self.assertEqual(self.md.convert('![image](https://example.com/1.jpg)'),
+                         u'<p><img alt="image" src="https://example.com/1.jpg" /></p>')
+
+    def test_change(self):
+        text = u'![image](http://example.com/1.jpg)'
+        html = u'<p><a href="http://example.com/1.jpg">Click for image</a></p>'
+        self.assertEqual(self.md.convert(text), html)