36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
import cssmin
|
|
import jsmin
|
|
from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
|
|
from django.core.files.base import ContentFile
|
|
from django.utils.encoding import smart_str
|
|
|
|
|
|
class MinifiedStaticFilesStorage(ManifestStaticFilesStorage):
|
|
"""
|
|
A static file system storage backend which minifies the hashed
|
|
copies of the files it saves. It currently knows how to process
|
|
CSS and JS files. Files containing '.min' anywhere in the filename
|
|
are skipped as they are already assumed minified.
|
|
"""
|
|
minifiers = (
|
|
('.css', cssmin.cssmin),
|
|
('.js', jsmin.jsmin),
|
|
)
|
|
|
|
def post_process(self, paths, dry_run=False, **options):
|
|
for original_path, processed_path, processed in super(
|
|
MinifiedStaticFilesStorage, self).post_process(
|
|
paths, dry_run, **options):
|
|
for ext, func in self.minifiers:
|
|
if '.min' in original_path:
|
|
continue
|
|
if original_path.endswith(ext):
|
|
with self._open(processed_path) as processed_file:
|
|
minified = func(processed_file.read().decode('utf-8'))
|
|
minified_file = ContentFile(smart_str(minified))
|
|
self.delete(processed_path)
|
|
self._save(processed_path, minified_file)
|
|
processed = True
|
|
|
|
yield original_path, processed_path, processed
|