Minor refactoring on default filter.

This commit is contained in:
Jannis Leidel
2011-05-13 13:19:46 +02:00
parent 4147f53922
commit 131d53ed6f
2 changed files with 23 additions and 22 deletions

View File

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

View File

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