aboutsummaryrefslogtreecommitdiffstats
path: root/markdown
diff options
context:
space:
mode:
authorWaylan Limberg <waylan.limberg@icloud.com>2015-03-29 23:00:30 -0400
committerWaylan Limberg <waylan.limberg@icloud.com>2018-07-24 11:40:13 -0400
commitee54678185234f01d3de6a6334f30c9bb3417783 (patch)
treed72e6bde812a59b6615b1b33ef878263ed6f5cc7 /markdown
parent727adc8a053402d3e9a38424ff67bde697674156 (diff)
downloadmarkdown-ee54678185234f01d3de6a6334f30c9bb3417783.tar.gz
markdown-ee54678185234f01d3de6a6334f30c9bb3417783.tar.bz2
markdown-ee54678185234f01d3de6a6334f30c9bb3417783.zip
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.
Diffstat (limited to 'markdown')
-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
4 files changed, 51 insertions, 41 deletions
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