diff options
-rw-r--r-- | docs/reference.md | 4 | ||||
-rw-r--r-- | markdown/core.py | 2 | ||||
-rw-r--r-- | markdown/extensions/legacy_attrs.py | 49 | ||||
-rw-r--r-- | markdown/inlinepatterns.py | 22 | ||||
-rw-r--r-- | markdown/treeprocessors.py | 19 | ||||
-rwxr-xr-x | setup.py | 1 | ||||
-rw-r--r-- | tests/misc/attributes-image-ref.html | 1 | ||||
-rw-r--r-- | tests/misc/attributes-image-ref.txt | 4 | ||||
-rw-r--r-- | tests/misc/attributes2.html | 6 | ||||
-rw-r--r-- | tests/misc/attributes2.txt | 10 | ||||
-rw-r--r-- | tests/misc/bidi.html | 4 | ||||
-rw-r--r-- | tests/misc/bidi.txt | 4 | ||||
-rw-r--r-- | tests/misc/multi-test.html | 2 | ||||
-rw-r--r-- | tests/misc/multi-test.txt | 6 | ||||
-rw-r--r-- | tests/misc/uche.html | 2 | ||||
-rw-r--r-- | tests/misc/uche.txt | 3 | ||||
-rw-r--r-- | tests/test_legacy.py | 2 | ||||
-rw-r--r-- | tests/test_syntax/extensions/test_legacy_attrs.py | 48 |
18 files changed, 107 insertions, 82 deletions
diff --git a/docs/reference.md b/docs/reference.md index 936d389..25c2058 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -181,10 +181,6 @@ __tab_length__{: #tab_length }: : Length of tabs in the source. Default: 4 -__enable_attributes__{: #enable_attributes}: - -: Enable the conversion of attributes. Defaults to `True`. - __smart_emphasis__{: #smart_emphasis }: : Treat `_connected_words_` intelligently Default: True diff --git a/markdown/core.py b/markdown/core.py index f4111e4..0fcf71d 100644 --- a/markdown/core.py +++ b/markdown/core.py @@ -27,7 +27,6 @@ class Markdown(object): option_defaults = { 'tab_length': 4, - 'enable_attributes': True, 'smart_emphasis': True, 'lazy_ol': True, } @@ -53,7 +52,6 @@ class Markdown(object): * "xhtml": Outputs XHTML style tags. Default. * "html": Outputs HTML style tags. * tab_length: Length of tabs in the source. Default: 4 - * enable_attributes: Enable the conversion of attributes. Default: True * smart_emphasis: Treat `_connected_words_` intelligently Default: True * lazy_ol: Ignore number of first item of ordered lists. Default: True diff --git a/markdown/extensions/legacy_attrs.py b/markdown/extensions/legacy_attrs.py new file mode 100644 index 0000000..280be07 --- /dev/null +++ b/markdown/extensions/legacy_attrs.py @@ -0,0 +1,49 @@ +""" +Legacy Attributes Extension +=========================== + +An extension to Python Markdown which implements legacy attributes. + +Prior to Python-Markdown version 3.0, the Markdown class had an `enable_attributes` +keyword which was on by default and provided for attributes to be defined for elements +using the format `{@key=value}`. This extension is provided as a replacement for +backward compatability. New documents should be authored using attr_lists. However, +numerious documents exist which have been using the old attribute format for many +years. This extension can be used to continue to render those documents correctly. +""" + +import re +from markdown.treeprocessors import Treeprocessor, isString +from markdown.extensions import Extension + + +ATTR_RE = re.compile("\{@([^\}]*)=([^\}]*)}") # {@id=123} + + +class LegacyAttrs(Treeprocessor): + def run(self, doc): + """Find and set values of attributes ({@key=value}). """ + for el in doc.iter(): + alt = el.get('alt', None) + if alt is not None: + el.set('alt', self.handleAttributes(el, alt)) + if el.text and isString(el.text): + el.text = self.handleAttributes(el, el.text) + if el.tail and isString(el.tail): + el.tail = self.handleAttributes(el, el.tail) + + def handleAttributes(self, el, txt): + """ Set attributes and return text without definitions. """ + def attributeCallback(match): + el.set(match.group(1), match.group(2).replace('\n', ' ')) + return ATTR_RE.sub(attributeCallback, txt) + + +class LegacyAttrExtension(Extension): + def extendMarkdown(self, md, md_globals): + la = LegacyAttrs(md) + md.treeprocessors.add('legacyattrs', la, '>inline') + + +def makeExtension(**kwargs): # pragma: no cover + return LegacyAttrExtension(**kwargs) diff --git a/markdown/inlinepatterns.py b/markdown/inlinepatterns.py index 18da73b..d67ef1f 100644 --- a/markdown/inlinepatterns.py +++ b/markdown/inlinepatterns.py @@ -154,17 +154,6 @@ def dequote(string): return string -ATTR_RE = re.compile(r"\{@([^\}]*)=([^\}]*)}") # {@id=123} - - -def handleAttributes(text, parent): - """Set values of an element based on attribute definitions ({@id=123}).""" - def attributeCallback(match): - parent.set(match.group(1), match.group(2).replace('\n', ' ')) - return '' - return ATTR_RE.sub(attributeCallback, text) - - """ The pattern classes ----------------------------------------------------------------------------- @@ -601,12 +590,7 @@ class ImageInlineProcessor(LinkInlineProcessor): if title is not None: el.set("title", title) - if self.markdown.enable_attributes: - truealt = handleAttributes(text, el) - else: - truealt = text - - el.set('alt', self.unescape(truealt)) + el.set('alt', self.unescape(text)) return el, m.start(0), index @@ -676,10 +660,6 @@ class ImageReferenceInlineProcessor(ReferenceInlineProcessor): el.set("src", href) if title: el.set("title", title) - - if self.markdown.enable_attributes: - text = handleAttributes(text, el) - el.set("alt", self.unescape(text)) return el diff --git a/markdown/treeprocessors.py b/markdown/treeprocessors.py index 7c37ae7..df5e748 100644 --- a/markdown/treeprocessors.py +++ b/markdown/treeprocessors.py @@ -366,26 +366,9 @@ class InlineProcessor(Treeprocessor): stack.append((child, self.ancestors[:])) for element, lst in insertQueue: - if self.markdown.enable_attributes: - if element.text and isString(element.text): - element.text = inlinepatterns.handleAttributes( - element.text, element - ) - i = 0 - for obj in lst: + for i, obj in enumerate(lst): newChild = obj[0] - if self.markdown.enable_attributes: - # Processing attributes - if newChild.tail and isString(newChild.tail): - newChild.tail = inlinepatterns.handleAttributes( - newChild.tail, element - ) - if newChild.text and isString(newChild.text): - newChild.text = inlinepatterns.handleAttributes( - newChild.text, newChild - ) element.insert(i, newChild) - i += 1 return tree @@ -78,6 +78,7 @@ setup( 'tables = markdown.extensions.tables:TableExtension', 'toc = markdown.extensions.toc:TocExtension', 'wikilinks = markdown.extensions.wikilinks:WikiLinkExtension', + 'legacy_attrs = markdown.extensions.legacy_attrs:LegacyAttrExtension', ] }, classifiers=[ diff --git a/tests/misc/attributes-image-ref.html b/tests/misc/attributes-image-ref.html deleted file mode 100644 index 6974420..0000000 --- a/tests/misc/attributes-image-ref.html +++ /dev/null @@ -1 +0,0 @@ -<p><img alt="img" id="foo" src="http://example.com/i.jpg" /></p>
\ No newline at end of file diff --git a/tests/misc/attributes-image-ref.txt b/tests/misc/attributes-image-ref.txt deleted file mode 100644 index a216971..0000000 --- a/tests/misc/attributes-image-ref.txt +++ /dev/null @@ -1,4 +0,0 @@ -![img{@id=foo}][img] - - [img]: http://example.com/i.jpg - diff --git a/tests/misc/attributes2.html b/tests/misc/attributes2.html deleted file mode 100644 index b78fee0..0000000 --- a/tests/misc/attributes2.html +++ /dev/null @@ -1,6 +0,0 @@ -<p id="TABLE.OF.CONTENTS"></p> -<ul> -<li id="TABLEOFCONTENTS"></li> -</ul> -<p id="TABLEOFCONTENTS">Or in the middle of the text </p> -<p id="tableofcontents"></p>
\ No newline at end of file diff --git a/tests/misc/attributes2.txt b/tests/misc/attributes2.txt deleted file mode 100644 index d635cb2..0000000 --- a/tests/misc/attributes2.txt +++ /dev/null @@ -1,10 +0,0 @@ -{@id=TABLE.OF.CONTENTS} - - -* {@id=TABLEOFCONTENTS} - - -Or in the middle of the text {@id=TABLEOFCONTENTS} - -{@id=tableofcontents} - diff --git a/tests/misc/bidi.html b/tests/misc/bidi.html index ffe04dc..3cc0444 100644 --- a/tests/misc/bidi.html +++ b/tests/misc/bidi.html @@ -1,7 +1,7 @@ <p><strong>Python</strong>(パイソン)は、<a href="http://en.wikipedia.org/wiki/Guido_van_Rossum">Guido van Rossum</a> によって作られたオープンソースのオブジェクト指向スクリプト言語。<a href="http://ja.wikipedia.org/wiki/Perl">Perl</a>とともに欧米で広く普及している。イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。 (Pythonには、爬虫類のニシキヘビの意味があり、Python言語のマスコットやアイコンとして使われることがある。)</p> <p>|||||||||||||||||||||||||||||THIS SHOULD BE LTR|||||||||||||||||||||||||</p> -<p dir="rtl">|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| </p> -<p dir="ltr">(<strong>بايثون</strong> لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح </p> +<p>|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| </p> +<p>(<strong>بايثون</strong> لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح </p> <p>پایتون زبان برنامهنویسی تفسیری و سطح بالا ، شیگرا و یک زبان برنامهنویسی تفسیری سمت سرور قدرتمند است که توسط گیدو ون روسوم در سال ۱۹۹۰ ساخته شد. این زبان در ویژگیها شبیه پرل، روبی، اسکیم، اسمالتاک و تیسیال است و از مدیریت خودکار حافظه استفاده میکند</p> <p>Python,是一种面向对象的、直譯式的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。</p> <p>ބްލޫ ވޭލްގެ ދޫ މަތީގައި އެއްފަހަރާ 50 މީހުންނަށް ތިބެވިދާނެވެ. ބޮޑު މަހުގެ ދުލަކީ އެހާމެ ބޮޑު އެއްޗެކެވެ.</p> diff --git a/tests/misc/bidi.txt b/tests/misc/bidi.txt index f11ff1c..7e6dbea 100644 --- a/tests/misc/bidi.txt +++ b/tests/misc/bidi.txt @@ -2,10 +2,10 @@ |||||||||||||||||||||||||||||THIS SHOULD BE LTR||||||||||||||||||||||||| -|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| {@dir=rtl} +|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| -(**بايثون** لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير {@dir=ltr} بالإضافة إلى أنها مجانية و مفتوح +(**بايثون** لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح diff --git a/tests/misc/multi-test.html b/tests/misc/multi-test.html index 2c8fe9e..9fe9648 100644 --- a/tests/misc/multi-test.html +++ b/tests/misc/multi-test.html @@ -1,5 +1,3 @@ -<h1 id="inthebeginning">Header </h1> -<p>Now, let's try something <em class="special">inline</em>, to see if it works</p> <p>Blah blah blah <a href="http://www.slashdot.org">http://www.slashdot.org</a></p> <ul> <li>Basic list</li> diff --git a/tests/misc/multi-test.txt b/tests/misc/multi-test.txt index c4ab1c1..feaac31 100644 --- a/tests/misc/multi-test.txt +++ b/tests/misc/multi-test.txt @@ -1,9 +1,3 @@ - -# Header {@id=inthebeginning} - -Now, let's try something *inline{@class=special}*, to see if it works - - Blah blah blah <http://www.slashdot.org> * Basic list diff --git a/tests/misc/uche.html b/tests/misc/uche.html index e62329d..9134e95 100644 --- a/tests/misc/uche.html +++ b/tests/misc/uche.html @@ -1,3 +1,3 @@ <p><img alt="asif" src="http://fourthought.com/images/ftlogo.png" title="Fourthought logo" /></p> -<p><a href="http://fourthought.com/"><img alt="" src="http://fourthought.com/images/ftlogo.png" style="float: left; margin: 10px; border: none;" title="Fourthought logo" /></a></p> +<p><a href="http://fourthought.com/"><img alt="Alt text" src="http://fourthought.com/images/ftlogo.png" title="Fourthought logo" /></a></p> <p><a href="http://link.com/"><img alt="text" src="x" /></a></p>
\ No newline at end of file diff --git a/tests/misc/uche.txt b/tests/misc/uche.txt index a3dda1a..625d2ae 100644 --- a/tests/misc/uche.txt +++ b/tests/misc/uche.txt @@ -1,7 +1,6 @@ ![asif](http://fourthought.com/images/ftlogo.png "Fourthought logo") -[![{@style=float: left; margin: 10px; border: -none;}](http://fourthought.com/images/ftlogo.png "Fourthought +[![Alt text](http://fourthought.com/images/ftlogo.png "Fourthought logo")](http://fourthought.com/) [![text](x)](http://link.com/) diff --git a/tests/test_legacy.py b/tests/test_legacy.py index 7fca02a..26d08de 100644 --- a/tests/test_legacy.py +++ b/tests/test_legacy.py @@ -90,7 +90,7 @@ class TestPl2004(LegacyTestCase): location = os.path.join(parent_test_dir, 'pl/Tests_2004') normalize = True input_ext = '.text' - exclude = ['Yuri_Footnotes'] + exclude = ['Yuri_Footnotes', 'Yuri_Attributes'] class TestPl2007(LegacyTestCase): diff --git a/tests/test_syntax/extensions/test_legacy_attrs.py b/tests/test_syntax/extensions/test_legacy_attrs.py new file mode 100644 index 0000000..506fce8 --- /dev/null +++ b/tests/test_syntax/extensions/test_legacy_attrs.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +from markdown.test_tools import TestCase + + +class TestLegacyAtrributes(TestCase): + + maxDiff = None + + def testLegacyAttrs(self): + self.assertMarkdownRenders( + self.dedent(""" + # Header {@id=inthebeginning} + + Now, let's try something *inline{@class=special}*, to see if it works + + @id=TABLE.OF.CONTENTS} + + + * {@id=TABLEOFCONTENTS} + + + Or in the middle of the text {@id=TABLEOFCONTENTS} + + {@id=tableofcontents} + + [![{@style=float: left; margin: 10px; border: + none;}](http://fourthought.com/images/ftlogo.png "Fourthought + logo")](http://fourthought.com/) + + ![img{@id=foo}][img] + + [img]: http://example.com/i.jpg + """), + self.dedent(""" + <h1 id="inthebeginning">Header </h1> + <p>Now, let's try something <em class="special">inline</em>, to see if it works</p> + <p>@id=TABLE.OF.CONTENTS}</p> + <ul> + <li id="TABLEOFCONTENTS"></li> + </ul> + <p id="TABLEOFCONTENTS">Or in the middle of the text </p> + <p id="tableofcontents"></p> + <p><a href="http://fourthought.com/"><img alt="" src="http://fourthought.com/images/ftlogo.png" style="float: left; margin: 10px; border: none;" title="Fourthought logo" /></a></p> + <p><img alt="img" id="foo" src="http://example.com/i.jpg" /></p> + """), # noqa: E501 + extensions=['legacy_attrs'] + ) |