Minor refactoring on default filter.
This commit is contained in:
@@ -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)
|
||||
|
@@ -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'))
|
||||
|
||||
|
Reference in New Issue
Block a user