diff --git a/compressor/filters/css_default.py b/compressor/filters/css_default.py index cf07fd7..28acfea 100644 --- a/compressor/filters/css_default.py +++ b/compressor/filters/css_default.py @@ -11,8 +11,15 @@ URL_PATTERN = re.compile(r'url\(([^\)]+)\)') class CssAbsoluteFilter(FilterBase): - def input(self, filename=None, basename=None, **kwargs): + + def __init__(self, *args, **kwargs): + super(CssAbsoluteFilter, self).__init__(*args, **kwargs) self.root = settings.COMPRESS_ROOT + self.url = settings.COMPRESS_URL.rstrip('/') + self.url_path = self.url + self.has_scheme = False + + def input(self, filename=None, basename=None, **kwargs): if filename is not None: filename = os.path.normcase(os.path.abspath(filename)) if (not (filename and filename.startswith(self.root)) and @@ -20,20 +27,16 @@ class CssAbsoluteFilter(FilterBase): return self.content self.path = basename.replace(os.sep, '/') self.path = self.path.lstrip('/') - self.url = settings.COMPRESS_URL.rstrip('/') - self.url_path = self.url self.mtime = get_hashed_mtime(filename) - self.has_http = False - if self.url.startswith('http://') or self.url.startswith('https://'): - self.has_http = True + if self.url.startswith(('http://', 'https://')): + self.has_scheme = True parts = self.url.split('/') self.url = '/'.join(parts[2:]) self.url_path = '/%s' % '/'.join(parts[3:]) self.protocol = '%s/' % '/'.join(parts[:2]) self.host = parts[2] - self.directory_name = '/'.join([self.url, os.path.dirname(self.path)]) - output = URL_PATTERN.sub(self.url_converter, self.content) - return output + self.directory_name = '/'.join((self.url, os.path.dirname(self.path))) + return URL_PATTERN.sub(self.url_converter, self.content) def find(self, basename): if settings.DEBUG and basename and staticfiles.finders: @@ -41,7 +44,7 @@ class CssAbsoluteFilter(FilterBase): def guess_filename(self, url): local_path = url - if self.has_http: + if self.has_scheme: # COMPRESS_URL had a protocol, remove it and the hostname from our path. local_path = local_path.replace(self.protocol + self.host, "", 1) # Now, we just need to check if we can find the path from COMPRESS_URL in our url @@ -56,24 +59,19 @@ class CssAbsoluteFilter(FilterBase): mtime = filename and get_hashed_mtime(filename) or self.mtime if mtime is None: return url - if (url.startswith('http://') or - url.startswith('https://') or - url.startswith('/')): + if url.startswith(('http://', 'https://', '/')): if "?" in url: - return "%s&%s" % (url, mtime) - return "%s?%s" % (url, mtime) + url = "%s&%s" % (url, mtime) + else: + url = "%s?%s" % (url, mtime) return url def url_converter(self, matchobj): url = matchobj.group(1) url = url.strip(' \'"') - if (url.startswith('http://') or - url.startswith('https://') or - url.startswith('/') or - url.startswith('data:')): + if url.startswith(('http://', 'https://', '/', 'data:')): return "url('%s')" % self.add_mtime(url) - full_url = '/'.join([str(self.directory_name), url]) - full_url = posixpath.normpath(full_url) - if self.has_http: + full_url = posixpath.normpath('/'.join([self.directory_name, url])) + if self.has_scheme: full_url = "%s%s" % (self.protocol, full_url) return "url('%s')" % self.add_mtime(full_url) diff --git a/compressor/tests/tests.py b/compressor/tests/tests.py index 71e6466..eb0e058 100644 --- a/compressor/tests/tests.py +++ b/compressor/tests/tests.py @@ -219,6 +219,7 @@ class CssAbsolutizingTestCase(TestCase): filter = CssAbsoluteFilter(content) self.assertEqual(output, filter.input(filename=filename, basename='css/url/test.css')) settings.COMPRESS_URL = 'http://media.example.com/' + filter = CssAbsoluteFilter(content) filename = os.path.join(settings.COMPRESS_ROOT, 'css/url/test.css') output = "p { background: url('%simages/image.gif?%s') }" % (settings.COMPRESS_URL, get_hashed_mtime(filename)) self.assertEqual(output, filter.input(filename=filename, basename='css/url/test.css')) @@ -231,6 +232,7 @@ class CssAbsolutizingTestCase(TestCase): filter = CssAbsoluteFilter(content) self.assertEqual(output, filter.input(filename=filename, basename='css/url/test.css')) settings.COMPRESS_URL = 'https://media.example.com/' + filter = CssAbsoluteFilter(content) filename = os.path.join(settings.COMPRESS_ROOT, 'css/url/test.css') output = "p { background: url('%simages/image.gif?%s') }" % (settings.COMPRESS_URL, get_hashed_mtime(filename)) self.assertEqual(output, filter.input(filename=filename, basename='css/url/test.css')) @@ -243,6 +245,7 @@ class CssAbsolutizingTestCase(TestCase): filter = CssAbsoluteFilter(content) self.assertEqual(output, filter.input(filename=filename, basename='css/url/test.css')) settings.COMPRESS_URL = 'https://media.example.com/' + filter = CssAbsoluteFilter(content) output = "p { background: url('%simages/image.gif?%s') }" % (settings.COMPRESS_URL, get_hashed_mtime(filename)) self.assertEqual(output, filter.input(filename=filename, basename='css/url/test.css'))