Sith/core/scss/processor.py

80 lines
2.4 KiB
Python
Raw Normal View History

2017-05-05 12:26:46 +00:00
#!/usr/bin/env python3
2023-04-06 11:08:42 +00:00
# -*- coding:utf-8 -*-
2017-05-05 12:26:46 +00:00
#
2023-04-06 11:08:42 +00:00
# Copyright 2023 © AE UTBM
# ae@utbm.fr / ae.info@utbm.fr
# All contributors are listed in the CONTRIBUTORS file.
2017-05-05 12:26:46 +00:00
#
2023-04-06 11:08:42 +00:00
# This file is part of the website of the UTBM Student Association (AE UTBM),
# https://ae.utbm.fr.
2017-05-05 12:26:46 +00:00
#
2023-04-06 11:08:42 +00:00
# You can find the whole source code at https://github.com/ae-utbm/sith3
2017-05-05 12:26:46 +00:00
#
2023-04-06 11:08:42 +00:00
# LICENSED UNDER THE GNU GENERAL PUBLIC LICENSE VERSION 3 (GPLv3)
# SEE : https://raw.githubusercontent.com/ae-utbm/sith3/master/LICENSE
# OR WITHIN THE LOCAL FILE "LICENSE"
2017-05-05 12:26:46 +00:00
#
2023-04-06 11:08:42 +00:00
# PREVIOUSLY LICENSED UNDER THE MIT LICENSE,
# SEE : https://raw.githubusercontent.com/ae-utbm/sith3/master/LICENSE.old
# OR WITHIN THE LOCAL FILE "LICENSE.old"
2017-05-05 12:26:46 +00:00
#
import os
from urllib.parse import urljoin
2024-06-24 11:07:36 +00:00
import sass
from django.conf import settings
2017-05-05 12:26:46 +00:00
from django.core.files.base import ContentFile
from django.templatetags.static import static
2024-06-24 11:07:36 +00:00
from django.utils.encoding import force_bytes, iri_to_uri
2017-05-08 00:30:13 +00:00
from core.scss.storage import ScssFileStorage, find_file
2017-05-05 12:26:46 +00:00
class ScssProcessor(object):
2017-05-10 08:58:51 +00:00
"""
2020-08-27 13:59:42 +00:00
If DEBUG mode enabled : compile the scss file
Else : give the path of the corresponding css supposed to already be compiled
Don't forget to use compilestatics to compile scss for production
2017-05-10 08:58:51 +00:00
"""
2018-10-04 19:29:19 +00:00
prefix = iri_to_uri(getattr(settings, "STATIC_URL", "/static/"))
2017-05-05 12:26:46 +00:00
storage = ScssFileStorage()
scss_extensions = [".scss"]
def __init__(self, path=None):
self.path = path
def _convert_scss(self):
basename, ext = os.path.splitext(self.path)
css_filename = self.path.replace(".scss", ".css")
url = urljoin(self.prefix, css_filename)
if not settings.DEBUG:
return url
if ext not in self.scss_extensions:
return static(self.path)
# Compilation on the fly
compile_args = {
"filename": find_file(self.path),
"include_paths": settings.SASS_INCLUDE_FOLDERS,
}
if settings.SASS_PRECISION:
2018-10-04 19:29:19 +00:00
compile_args["precision"] = settings.SASS_PRECISION
2017-05-05 12:26:46 +00:00
content = sass.compile(**compile_args)
content = force_bytes(content)
if self.storage.exists(css_filename):
self.storage.delete(css_filename)
self.storage.save(css_filename, ContentFile(content))
return url
def get_converted_scss(self):
if self.path:
return self._convert_scss()
else:
return ""