From ee54678185234f01d3de6a6334f30c9bb3417783 Mon Sep 17 00:00:00 2001 From: Waylan Limberg Date: Sun, 29 Mar 2015 23:00:30 -0400 Subject: Moved enable_attributes keyword to extension: legacy_attrs. If you have existing documents that use the legacy attributes format, then you should enable the legacy_attrs extension for those documents. Everyone is encouraged to use the attr_list extension going forward. Closes #643. Work adapted from 0005d7a of the md3 branch. --- docs/reference.md | 4 -- markdown/core.py | 2 - markdown/extensions/legacy_attrs.py | 49 +++++++++++++++++++++++ markdown/inlinepatterns.py | 22 +--------- markdown/treeprocessors.py | 19 +-------- setup.py | 1 + tests/misc/attributes-image-ref.html | 1 - tests/misc/attributes-image-ref.txt | 4 -- tests/misc/attributes2.html | 6 --- tests/misc/attributes2.txt | 10 ----- tests/misc/bidi.html | 4 +- tests/misc/bidi.txt | 4 +- tests/misc/multi-test.html | 2 - tests/misc/multi-test.txt | 6 --- tests/misc/uche.html | 2 +- tests/misc/uche.txt | 3 +- tests/test_legacy.py | 2 +- tests/test_syntax/extensions/test_legacy_attrs.py | 48 ++++++++++++++++++++++ 18 files changed, 107 insertions(+), 82 deletions(-) create mode 100644 markdown/extensions/legacy_attrs.py delete mode 100644 tests/misc/attributes-image-ref.html delete mode 100644 tests/misc/attributes-image-ref.txt delete mode 100644 tests/misc/attributes2.html delete mode 100644 tests/misc/attributes2.txt create mode 100644 tests/test_syntax/extensions/test_legacy_attrs.py 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 @@ -

img

\ 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 @@ -

- -

Or in the middle of the text

-

\ 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 @@

Python(パイソン)は、Guido van Rossum によって作られたオープンソースのオブジェクト指向スクリプト言語。Perlとともに欧米で広く普及している。イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。 (Pythonには、爬虫類のニシキヘビの意味があり、Python言語のマスコットやアイコンとして使われることがある。)

|||||||||||||||||||||||||||||THIS SHOULD BE LTR|||||||||||||||||||||||||

-

|||||||||||||||||||||||||||||THIS SHOULD BE RTL|||||||||||||||||||||||||

-

(بايثون لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح

+

|||||||||||||||||||||||||||||THIS SHOULD BE RTL|||||||||||||||||||||||||

+

(بايثون لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح

پایتون زبان برنامه‌نویسی تفسیری و سطح بالا ، شی‌گرا و یک زبان برنامه‌نویسی تفسیری سمت سرور قدرتمند است که توسط گیدو ون روسوم در سال ۱۹۹۰ ساخته شد. این زبان در ویژگی‌ها شبیه پرل، روبی، اسکیم، اسمال‌تاک و تی‌سی‌ال است و از مدیریت خودکار حافظه استفاده می‌کند

Python,是一种面向对象的、直譯式的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。

ބްލޫ ވޭލްގެ ދޫ މަތީގައި އެއްފަހަރާ 50 މީހުންނަށް ތިބެވިދާނެވެ. ބޮޑު މަހުގެ ދުލަކީ އެހާމެ ބޮޑު އެއްޗެކެވެ.

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 @@ -

Header

-

Now, let's try something inline, to see if it works

Blah blah blah http://www.slashdot.org