summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Ronacher <armin.ronacher@active-4.com>2016-01-13 22:33:52 +0100
committerArmin Ronacher <armin.ronacher@active-4.com>2016-01-13 22:33:52 +0100
commitd2bb5bdc882d091f2b9a2b819b61aba17cc461b7 (patch)
treedfc2c2791706d9f807976e5a4ccb68aabf01a495
parent8c7ec9bb440593cb1d302f7ca84d157be8eb785c (diff)
parent810bae60461fd7c00c853b91c8e03dce3103b020 (diff)
downloadmarkupsafe-d2bb5bdc882d091f2b9a2b819b61aba17cc461b7.tar.gz
Merge pull request #20 from bukzor/idempotent-escape
idempotent unescape
-rw-r--r--markupsafe/__init__.py5
-rw-r--r--markupsafe/tests.py14
2 files changed, 16 insertions, 3 deletions
diff --git a/markupsafe/__init__.py b/markupsafe/__init__.py
index af896e8..ae4a118 100644
--- a/markupsafe/__init__.py
+++ b/markupsafe/__init__.py
@@ -20,7 +20,7 @@ __all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent']
_striptags_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
-_entity_re = re.compile(r'&([^;]+);')
+_entity_re = re.compile(r'&([^& ;]+);')
class Markup(text_type):
@@ -143,7 +143,8 @@ class Markup(text_type):
return unichr(int(name[1:]))
except ValueError:
pass
- return u''
+ # Don't modify unexpected input.
+ return m.group()
return _entity_re.sub(handle_match, text_type(self))
def striptags(self):
diff --git a/markupsafe/tests.py b/markupsafe/tests.py
index e740cb3..62fb57d 100644
--- a/markupsafe/tests.py
+++ b/markupsafe/tests.py
@@ -61,10 +61,22 @@ class MarkupTestCase(unittest.TestCase):
}, Markup(u'<em>&lt;foo&gt;:&lt;bar&gt;</em>'))
def test_escaping(self):
- # escaping and unescaping
+ # escaping
assert escape('"<>&\'') == '&#34;&lt;&gt;&amp;&#39;'
assert Markup("<em>Foo &amp; Bar</em>").striptags() == "Foo & Bar"
+
+ def test_unescape(self):
assert Markup("&lt;test&gt;").unescape() == "<test>"
+ assert "jack & tavi are cooler than mike & russ" == \
+ Markup("jack & tavi are cooler than mike &amp; russ").unescape(), \
+ Markup("jack & tavi are cooler than mike &amp; russ").unescape()
+
+ # Test that unescape is idempotent
+ original = '&foo&#x3b;'
+ once = Markup(original).unescape()
+ twice = Markup(once).unescape()
+ expected = "&foo;"
+ assert expected == once == twice, (once, twice)
def test_formatting(self):
for actual, expected in (