diff options
author | Isaac Muse <faceless.shop@gmail.com> | 2018-01-17 18:36:34 -0700 |
---|---|---|
committer | Waylan Limberg <waylan.limberg@icloud.com> | 2018-01-17 20:36:34 -0500 |
commit | d18c3d0acab0e7469c3284c897afcb61f9dd1fea (patch) | |
tree | ce123f6ea56e105e1635126c61821d01acc82fb4 /tests | |
parent | de9cc42f2d8bc29d8f16058a6ae65a434caab7d6 (diff) | |
download | markdown-d18c3d0acab0e7469c3284c897afcb61f9dd1fea.tar.gz markdown-d18c3d0acab0e7469c3284c897afcb61f9dd1fea.tar.bz2 markdown-d18c3d0acab0e7469c3284c897afcb61f9dd1fea.zip |
Flexible inline (#629)
Add new InlineProcessor class that handles inline processing much better and allows for more flexibility. This adds new InlineProcessors that no longer utilize unnecessary pretext and posttext captures. New class can accept the buffer that is being worked on and manually process the text without regex and return new replacement bounds. This helps us to handle links in a better way and handle nested brackets and logic that is too much for regular expression. The refactor also allows image links to have links/paths with spaces like links. Ref #551, #613, #590, #161.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/misc/image.html | 5 | ||||
-rw-r--r-- | tests/misc/image.txt | 12 | ||||
-rw-r--r-- | tests/test_apis.py | 10 | ||||
-rw-r--r-- | tests/test_syntax/inline/__init__.py | 0 | ||||
-rw-r--r-- | tests/test_syntax/inline/images.py | 139 | ||||
-rw-r--r-- | tests/test_syntax/inline/links.py | 98 |
6 files changed, 242 insertions, 22 deletions
diff --git a/tests/misc/image.html b/tests/misc/image.html deleted file mode 100644 index 1171e4e..0000000 --- a/tests/misc/image.html +++ /dev/null @@ -1,5 +0,0 @@ -<p><img alt="Poster" src="http://humane_man.jpg" title="The most humane man." /></p> -<p><img alt="Poster" src="http://humane_man.jpg" title="The most humane man." /></p> -<p><img alt="Blank" src="" /></p> -<p>![Fail](http://humane man.jpg "The most humane man.")</p> -<p>![Fail](http://humane man.jpg)</p>
\ No newline at end of file diff --git a/tests/misc/image.txt b/tests/misc/image.txt deleted file mode 100644 index 3fae16a..0000000 --- a/tests/misc/image.txt +++ /dev/null @@ -1,12 +0,0 @@ - -![Poster](http://humane_man.jpg "The most humane man.") - -![Poster][] - -[Poster]:http://humane_man.jpg "The most humane man." - -![Blank]() - -![Fail](http://humane man.jpg "The most humane man.") - -![Fail](http://humane man.jpg) diff --git a/tests/test_apis.py b/tests/test_apis.py index aa43e52..15ecc5b 100644 --- a/tests/test_apis.py +++ b/tests/test_apis.py @@ -753,16 +753,16 @@ class TestEscapeAppend(unittest.TestCase): class TestAncestorExclusion(unittest.TestCase): """ Tests exclusion of tags in ancestor list. """ - class AncestorExample(markdown.inlinepatterns.SimpleTagPattern): + class AncestorExample(markdown.inlinepatterns.SimpleTagInlineProcessor): """ Ancestor Test. """ ANCESTOR_EXCLUDES = ('a',) - def handleMatch(self, m): + def handleMatch(self, m, data): """ Handle match. """ el = markdown.util.etree.Element(self.tag) - el.text = m.group(3) - return el + el.text = m.group(2) + return el, m.start(0), m.end(0) class AncestorExtension(markdown.Extension): @@ -774,7 +774,7 @@ class TestAncestorExclusion(unittest.TestCase): def extendMarkdown(self, md, md_globals): """Modify inline patterns.""" - pattern = r'(\+)([^\+]+)\2' + pattern = r'(\+)([^\+]+)\1' md.inlinePatterns["ancestor-test"] = TestAncestorExclusion.AncestorExample(pattern, 'strong') def setUp(self): diff --git a/tests/test_syntax/inline/__init__.py b/tests/test_syntax/inline/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/test_syntax/inline/__init__.py diff --git a/tests/test_syntax/inline/images.py b/tests/test_syntax/inline/images.py new file mode 100644 index 0000000..9c1dc34 --- /dev/null +++ b/tests/test_syntax/inline/images.py @@ -0,0 +1,139 @@ +from markdown.test_tools import TestCase + + +class TestAdvancedImages(TestCase): + + def test_nested_square_brackets(self): + self.assertMarkdownRenders( + """![Text[[[[[[[]]]]]]][]](http://link.com/image.png) more text""", + """<p><img alt="Text[[[[[[[]]]]]]][]" src="http://link.com/image.png" /> more text</p>""" + ) + + def test_nested_round_brackets(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(((((((()))))))()).png) more text""", + """<p><img alt="Text" src="http://link.com/(((((((()))))))()).png" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles1(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png"title") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles2(self): + self.assertMarkdownRenders( + """![Text](http://link.com/('.png"title") more text""", + """<p><img alt="Text" src="http://link.com/('.png" title="title" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles3(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png"title)") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title)" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles4(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png "title") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles5(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png "title)") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title)" /> more text</p>""" + ) + + def test_mixed_title_quotes1(self): + self.assertMarkdownRenders( + """![Text](http://link.com/'.png"title") more text""", + """<p><img alt="Text" src="http://link.com/'.png" title="title" /> more text</p>""" + ) + + def test_mixed_title_quotes2(self): + self.assertMarkdownRenders( + """![Text](http://link.com/".png'title') more text""", + """<p><img alt="Text" src="http://link.com/".png" title="title" /> more text</p>""" + ) + + def test_mixed_title_quotes3(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces.png'"and quotes" 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces.png" title=""and quotes" 'and title" />""" + """ more text</p>""" + ) + + def test_mixed_title_quotes4(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces'.png"and quotes" 'and title") more text""", + """<p><img alt="Text" src="http://link.com/with spaces'.png" title="and quotes" 'and title" />""" + """ more text</p>""" + ) + + def test_mixed_title_quotes5(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces .png'"and quotes" 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces .png" title=""and quotes"""" + """ 'and title" /> more text</p>""" + ) + + def test_mixed_title_quotes6(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces "and quotes".png 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces "and quotes".png" title="and title" />""" + """ more text</p>""" + ) + + def test_single_quote(self): + self.assertMarkdownRenders( + """![test](link"notitle.png)""", + """<p><img alt="test" src="link"notitle.png" /></p>""" + ) + + def test_angle_with_mixed_title_quotes(self): + self.assertMarkdownRenders( + """![Text](<http://link.com/with spaces '"and quotes".png> 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces '"and quotes".png" title="and title" />""" + """ more text</p>""" + ) + + def test_misc(self): + self.assertMarkdownRenders( + """![Poster](http://humane_man.jpg "The most humane man.")""", + """<p><img alt="Poster" src="http://humane_man.jpg" title="The most humane man." /></p>""" + ) + + def test_misc_ref(self): + self.assertMarkdownRenders( + self.dedent( + """ + ![Poster][] + + [Poster]:http://humane_man.jpg "The most humane man." + """ + ), + self.dedent( + """ + <p><img alt="Poster" src="http://humane_man.jpg" title="The most humane man." /></p> + """ + ) + ) + + def test_misc_blank(self): + self.assertMarkdownRenders( + """![Blank]()""", + """<p><img alt="Blank" src="" /></p>""" + ) + + def test_misc_img_title(self): + self.assertMarkdownRenders( + """![Image](http://humane man.jpg "The most humane man.")""", + """<p><img alt="Image" src="http://humane man.jpg" title="The most humane man." /></p>""" + ) + + def test_misc_img(self): + self.assertMarkdownRenders( + """![Image](http://humane man.jpg)""", + """<p><img alt="Image" src="http://humane man.jpg" /></p>""" + ) diff --git a/tests/test_syntax/inline/links.py b/tests/test_syntax/inline/links.py new file mode 100644 index 0000000..fe58ada --- /dev/null +++ b/tests/test_syntax/inline/links.py @@ -0,0 +1,98 @@ +from markdown.test_tools import TestCase + + +class TestAdvancedLinks(TestCase): + + def test_nested_square_brackets(self): + self.assertMarkdownRenders( + """[Text[[[[[[[]]]]]]][]](http://link.com) more text""", + """<p><a href="http://link.com">Text[[[[[[[]]]]]]][]</a> more text</p>""" + ) + + def test_nested_round_brackets(self): + self.assertMarkdownRenders( + """[Text](http://link.com/(((((((()))))))())) more text""", + """<p><a href="http://link.com/(((((((()))))))())">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles1(self): + self.assertMarkdownRenders( + """[Text](http://link.com/("title") more text""", + """<p><a href="http://link.com/(" title="title">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles2(self): + self.assertMarkdownRenders( + """[Text](http://link.com/('"title") more text""", + """<p><a href="http://link.com/('" title="title">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles3(self): + self.assertMarkdownRenders( + """[Text](http://link.com/("title)") more text""", + """<p><a href="http://link.com/(" title="title)">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles4(self): + self.assertMarkdownRenders( + """[Text](http://link.com/( "title") more text""", + """<p><a href="http://link.com/(" title="title">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles5(self): + self.assertMarkdownRenders( + """[Text](http://link.com/( "title)") more text""", + """<p><a href="http://link.com/(" title="title)">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes1(self): + self.assertMarkdownRenders( + """[Text](http://link.com/'"title") more text""", + """<p><a href="http://link.com/'" title="title">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes2(self): + self.assertMarkdownRenders( + """[Text](http://link.com/"'title') more text""", + """<p><a href="http://link.com/"" title="title">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes3(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces'"and quotes" 'and title') more text""", + """<p><a href="http://link.com/with spaces" title=""and quotes" 'and title">""" + """Text</a> more text</p>""" + ) + + def test_mixed_title_quotes4(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces'"and quotes" 'and title") more text""", + """<p><a href="http://link.com/with spaces'" title="and quotes" 'and title">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes5(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces '"and quotes" 'and title') more text""", + """<p><a href="http://link.com/with spaces" title=""and quotes" 'and title">""" + """Text</a> more text</p>""" + ) + + def test_mixed_title_quotes6(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces "and quotes" 'and title') more text""", + """<p><a href="http://link.com/with spaces "and quotes"" title="and title">""" + """Text</a> more text</p>""" + ) + + def test_single_quote(self): + self.assertMarkdownRenders( + """[test](link"notitle)""", + """<p><a href="link"notitle">test</a></p>""" + ) + + def test_angle_with_mixed_title_quotes(self): + self.assertMarkdownRenders( + """[Text](<http://link.com/with spaces '"and quotes"> 'and title') more text""", + """<p><a href="http://link.com/with spaces '"and quotes"" title="and title">""" + """Text</a> more text</p>""" + ) |