Make CssAbsoluteFilter not touch quotes

This commit is contained in:
Johannes Linke
2017-02-16 16:44:09 +01:00
parent ea40e786e1
commit 0b8c0f6705
2 changed files with 16 additions and 7 deletions

View File

@@ -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")

View File

@@ -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):