aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWaylan Limberg <waylan@gmail.com>2011-06-02 02:32:33 -0400
committerWaylan Limberg <waylan@gmail.com>2011-06-02 02:32:33 -0400
commit0426d274b534c7f600cd76ef4b77f4b0c62a4c93 (patch)
tree641bf1a6c39fcd8dc6e97b6cf2a93ea7c43d57a6
parent7f9106965c28a1780164736e33c8244a8cc1c44b (diff)
downloadmarkdown-0426d274b534c7f600cd76ef4b77f4b0c62a4c93.tar.gz
markdown-0426d274b534c7f600cd76ef4b77f4b0c62a4c93.tar.bz2
markdown-0426d274b534c7f600cd76ef4b77f4b0c62a4c93.zip
Partial fix of issue #14. hrefs (and titles) are now unescaped, but it uppears that we are loosing escaped backslashes (both in the href and in the link label in the example given in issue 14.
-rw-r--r--markdown/inlinepatterns.py33
-rw-r--r--markdown/treeprocessors.py3
-rw-r--r--markdown/util.py1
3 files changed, 25 insertions, 12 deletions
diff --git a/markdown/inlinepatterns.py b/markdown/inlinepatterns.py
index 1398b80..4f45638 100644
--- a/markdown/inlinepatterns.py
+++ b/markdown/inlinepatterns.py
@@ -184,6 +184,19 @@ class Pattern:
""" Return class name, to define pattern type """
return self.__class__.__name__
+ def unescape(self, text):
+ """ Return unescaped text given text with an inline placeholder. """
+ try:
+ stash = self.markdown.treeprocessors['inline'].stashed_nodes
+ except KeyError:
+ return text
+ def get_stash(m):
+ id = m.group(1)
+ if id in stash:
+ return stash.get(id)
+ return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text)
+
+
BasePattern = Pattern # for backward compatibility
class SimpleTextPattern(Pattern):
@@ -262,12 +275,12 @@ class LinkPattern(Pattern):
if href:
if href[0] == "<":
href = href[1:-1]
- el.set("href", self.sanitize_url(href.strip()))
+ el.set("href", self.sanitize_url(self.unescape(href.strip())))
else:
el.set("href", "")
if title:
- title = dequote(title) #.replace('"', "&quot;")
+ title = dequote(self.unescape(title))
el.set("title", title)
return el
@@ -312,11 +325,11 @@ class ImagePattern(LinkPattern):
src = src_parts[0]
if src[0] == "<" and src[-1] == ">":
src = src[1:-1]
- el.set('src', self.sanitize_url(src))
+ el.set('src', self.sanitize_url(self.unescape(src)))
else:
el.set('src', "")
if len(src_parts) > 1:
- el.set('title', dequote(" ".join(src_parts[1:])))
+ el.set('title', dequote(self.unescape(" ".join(src_parts[1:]))))
if self.markdown.enable_attributes:
truealt = handleAttributes(m.group(2), el)
@@ -353,9 +366,9 @@ class ReferencePattern(LinkPattern):
def makeTag(self, href, title, text):
el = util.etree.Element('a')
- el.set('href', self.sanitize_url(href))
+ el.set('href', self.sanitize_url(self.unescape(href)))
if title:
- el.set('title', title)
+ el.set('title', self.unescape(title))
el.text = text
return el
@@ -365,9 +378,9 @@ class ImageReferencePattern(ReferencePattern):
""" Match to a stored reference and return img element. """
def makeTag(self, href, title, text):
el = util.etree.Element("img")
- el.set("src", self.sanitize_url(href))
+ el.set("src", self.sanitize_url(self.unescape(href)))
if title:
- el.set("title", title)
+ el.set("title", self.unescape(title))
el.set("alt", text)
return el
@@ -376,7 +389,7 @@ class AutolinkPattern(Pattern):
""" Return a link Element given an autolink (`<http://example/com>`). """
def handleMatch(self, m):
el = util.etree.Element("a")
- el.set('href', m.group(2))
+ el.set('href', self.unescape(m.group(2)))
el.text = util.AtomicString(m.group(2))
return el
@@ -386,7 +399,7 @@ class AutomailPattern(Pattern):
"""
def handleMatch(self, m):
el = util.etree.Element('a')
- email = m.group(2)
+ email = self.unescape(m.group(2))
if email.startswith("mailto:"):
email = email[len("mailto:"):]
diff --git a/markdown/treeprocessors.py b/markdown/treeprocessors.py
index d2af0dc..4ce8166 100644
--- a/markdown/treeprocessors.py
+++ b/markdown/treeprocessors.py
@@ -56,8 +56,7 @@ class InlineProcessor(Treeprocessor):
self.__placeholder_suffix = util.ETX
self.__placeholder_length = 4 + len(self.__placeholder_prefix) \
+ len(self.__placeholder_suffix)
- self.__placeholder_re = \
- re.compile(util.INLINE_PLACEHOLDER % r'([0-9]{4})')
+ self.__placeholder_re = util.INLINE_PLACEHOLDER_RE
self.markdown = md
def __makePlaceholder(self, type):
diff --git a/markdown/util.py b/markdown/util.py
index 1b55de4..c1bf658 100644
--- a/markdown/util.py
+++ b/markdown/util.py
@@ -26,6 +26,7 @@ STX = u'\u0002' # Use STX ("Start of text") for start-of-placeholder
ETX = u'\u0003' # Use ETX ("End of text") for end-of-placeholder
INLINE_PLACEHOLDER_PREFIX = STX+"klzzwxh:"
INLINE_PLACEHOLDER = INLINE_PLACEHOLDER_PREFIX + "%s" + ETX
+INLINE_PLACEHOLDER_RE = re.compile(INLINE_PLACEHOLDER % r'([0-9]{4})')
AMP_SUBSTITUTE = STX+"amp"+ETX
"""