aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/reference.md4
-rw-r--r--markdown/core.py2
-rw-r--r--markdown/extensions/legacy_attrs.py49
-rw-r--r--markdown/inlinepatterns.py22
-rw-r--r--markdown/treeprocessors.py19
-rwxr-xr-xsetup.py1
-rw-r--r--tests/misc/attributes-image-ref.html1
-rw-r--r--tests/misc/attributes-image-ref.txt4
-rw-r--r--tests/misc/attributes2.html6
-rw-r--r--tests/misc/attributes2.txt10
-rw-r--r--tests/misc/bidi.html4
-rw-r--r--tests/misc/bidi.txt4
-rw-r--r--tests/misc/multi-test.html2
-rw-r--r--tests/misc/multi-test.txt6
-rw-r--r--tests/misc/uche.html2
-rw-r--r--tests/misc/uche.txt3
-rw-r--r--tests/test_legacy.py2
-rw-r--r--tests/test_syntax/extensions/test_legacy_attrs.py48
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
diff --git a/setup.py b/setup.py
index 73c7ab3..fc9ef0b 100755
--- a/setup.py
+++ b/setup.py
@@ -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']
+ )