evorepo/main/storage.py

37 lines
1.4 KiB
Python
Raw Normal View History

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