From 0b8c0f670575e4a2d96c3618d42300c9f6d9938d Mon Sep 17 00:00:00 2001 From: Johannes Linke Date: Thu, 16 Feb 2017 16:44:09 +0100 Subject: [PATCH] Make CssAbsoluteFilter not touch quotes --- compressor/filters/css_default.py | 7 ++++--- compressor/tests/test_filters.py | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/compressor/filters/css_default.py b/compressor/filters/css_default.py index 27159cd..9621481 100644 --- a/compressor/filters/css_default.py +++ b/compressor/filters/css_default.py @@ -6,7 +6,8 @@ from compressor.cache import get_hashed_mtime, get_hashed_content from compressor.conf import settings from compressor.filters import FilterBase, FilterError -URL_PATTERN = re.compile(r'url\( *(([\'"]?).+?\2) *\)') +URL_PATTERN = re.compile(r'url\( *([\'"]?)(.+?)\1 *\)') +# URL_PATTERN = re.compile(r'url\(([^\)]+)\)') SRC_PATTERN = re.compile(r'src=([\'"])(.+?)\1') SCHEMES = ('http://', 'https://', '/') @@ -86,7 +87,7 @@ class CssAbsoluteFilter(FilterBase): url = matchobj.group(group) url = url.strip() - wrap = '"' if url[0] == '"' else "'" + wrap = matchobj.group(1) url = url.strip('\'"') if url.startswith(('#', 'data:')): @@ -100,7 +101,7 @@ class CssAbsoluteFilter(FilterBase): return template % (wrap, self.add_suffix(full_url), wrap) def url_converter(self, matchobj): - return self._converter(matchobj, 1, "url(%s%s%s)") + return self._converter(matchobj, 2, "url(%s%s%s)") def src_converter(self, matchobj): return self._converter(matchobj, 2, "src=%s%s%s") diff --git a/compressor/tests/test_filters.py b/compressor/tests/test_filters.py index c6437ad..5e0cb7a 100644 --- a/compressor/tests/test_filters.py +++ b/compressor/tests/test_filters.py @@ -310,16 +310,16 @@ class CssAbsolutizingTestCase(TestCase): css1 = """\ p { background: url('%(compress_url)simg/python.png?%(hash)s'); } -p { background: url('%(compress_url)simg/python.png?%(hash)s'); } -p { background: url('%(compress_url)simg/python.png?%(hash)s'); } +p { background: url(%(compress_url)simg/python.png?%(hash)s); } +p { background: url(%(compress_url)simg/python.png?%(hash)s); } p { background: url('%(compress_url)simg/python.png?%(hash)s'); } p { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%(compress_url)simg/python.png?%(hash)s'); } """ % dict(compress_url=settings.COMPRESS_URL, hash=hash_python_png) css2 = """\ p { background: url('%(compress_url)simg/add.png?%(hash)s'); } -p { background: url('%(compress_url)simg/add.png?%(hash)s'); } -p { background: url('%(compress_url)simg/add.png?%(hash)s'); } +p { background: url(%(compress_url)simg/add.png?%(hash)s); } +p { background: url(%(compress_url)simg/add.png?%(hash)s); } p { background: url('%(compress_url)simg/add.png?%(hash)s'); } p { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%(compress_url)simg/add.png?%(hash)s'); } """ % dict(compress_url=settings.COMPRESS_URL, hash=hash_add_png) @@ -359,6 +359,14 @@ p { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%(compress_u filter = CssAbsoluteFilter(css, filename="doesntmatter") self.assertEqual(css, filter.input(filename="doesntmatter", basename="doesntmatter")) + def test_does_not_change_quotes_in_src(self): + filename = os.path.join(settings.COMPRESS_ROOT, 'css/url/test.css') + hash_add_png = self.hashing_func(os.path.join(settings.COMPRESS_ROOT, 'img/add.png')) + css = """p { filter: Alpha(src="/img/add.png%(hash)s") }""" + filter = CssAbsoluteFilter(css % dict(hash="")) + expected = css % dict(hash='?' + hash_add_png) + self.assertEqual(expected, filter.input(filename=filename, basename='css/url/test.css')) + @override_settings(COMPRESS_URL='http://static.example.com/') class CssAbsolutizingTestCaseWithDifferentURL(CssAbsolutizingTestCase):