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. --- markdown/core.py | 2 -- markdown/extensions/legacy_attrs.py | 49 +++++++++++++++++++++++++++++++++++++ markdown/inlinepatterns.py | 22 +---------------- markdown/treeprocessors.py | 19 +------------- 4 files changed, 51 insertions(+), 41 deletions(-) create mode 100644 markdown/extensions/legacy_attrs.py (limited to 'markdown') 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 -- cgit v1.2.3