1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
from __future__ import absolute_import
import os
from pathlib import PurePath
from io import StringIO
from django.conf import settings
from django.contrib.staticfiles.storage import staticfiles_storage
from scss import Compiler, config
from scss.extension.compass import CompassExtension
from scss.source import SourceFile
from .extension.django import DjangoExtension
from .utils import find_all_files, get_file_and_storage
# TODO: It's really gross to modify this global settings variable.
# This is where PyScss is supposed to find the image files for making sprites.
config.STATIC_ROOT = find_all_files
config.STATIC_URL = staticfiles_storage.url('scss/')
# This is where PyScss places the sprite files.
config.ASSETS_ROOT = os.path.join(settings.STATIC_ROOT, 'scss', 'assets')
# PyScss expects a trailing slash.
config.ASSETS_URL = staticfiles_storage.url('scss/assets/')
class DjangoScssCompiler(Compiler):
def __init__(self, **kwargs):
kwargs.setdefault('extensions', (DjangoExtension, CompassExtension))
if not os.path.exists(config.ASSETS_ROOT):
os.makedirs(config.ASSETS_ROOT)
super(DjangoScssCompiler, self).__init__(**kwargs)
def compile(self, *paths):
compilation = self.make_compilation()
for path in paths:
path = PurePath(path)
if path.is_absolute():
path = path.relative_to('/')
filename, storage = get_file_and_storage(str(path))
with storage.open(filename) as f:
source = SourceFile.from_file(f, origin=path.parent, relpath=PurePath(path.name))
compilation.add_source(source)
return self.call_and_catch_errors(compilation.run)
def compile_string(self, string, filename=None):
compilation = self.make_compilation()
if filename is not None:
f = StringIO(string)
filename = PurePath(filename)
source = SourceFile.from_file(f, origin=filename.parent, relpath=PurePath(filename.name))
else:
source = SourceFile.from_string(string)
compilation.add_source(source)
return self.call_and_catch_errors(compilation.run)
|