diff options
author | Jannis Leidel <jannis@leidel.info> | 2010-06-07 11:08:28 +0200 |
---|---|---|
committer | Jannis Leidel <jannis@leidel.info> | 2010-06-07 15:01:36 +0200 |
commit | 1298e2d573aeba1ce5d165465e91fa54133511a8 (patch) | |
tree | f2295f873143530e513a622323406de81458062a /compressor/css.py | |
parent | a54a07da92582982192c269f1c7c69175fde458f (diff) | |
download | django-compressor-1298e2d573aeba1ce5d165465e91fa54133511a8.tar.gz |
Refactored the compressor code a little (split in separate modules). Also abstracted the file parsing and added a BeautifulSoupParser and a LxmlParser, while the former is the default.
Diffstat (limited to 'compressor/css.py')
-rw-r--r-- | compressor/css.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/compressor/css.py b/compressor/css.py new file mode 100644 index 0000000..1f57140 --- /dev/null +++ b/compressor/css.py @@ -0,0 +1,57 @@ +from django.conf import settings as django_settings + +from compressor.conf import settings +from compressor.base import Compressor, UncompressableFileError + +class CssCompressor(Compressor): + + def __init__(self, content, output_prefix="css"): + self.extension = ".css" + self.template_name = "compressor/css.html" + self.template_name_inline = "compressor/css_inline.html" + self.filters = ['compressor.filters.css_default.CssAbsoluteFilter'] + self.filters.extend(settings.COMPRESS_CSS_FILTERS) + self.type = 'css' + super(CssCompressor, self).__init__(content, output_prefix) + + def split_contents(self): + if self.split_content: + return self.split_content + self.media_nodes = [] + for elem in self.parser.css_elems(): + data = None + elem_name = self.parser.elem_name(elem) + elem_attribs = self.parser.elem_attribs(elem) + if elem_name == 'link' and elem_attribs['rel'] == 'stylesheet': + try: + content = self.parser.elem_content(elem) + data = ('file', self.get_filename(elem_attribs['href']), elem) + except UncompressableFileError: + if django_settings.DEBUG: + raise + elif elem_name == 'style': + data = ('hunk', self.parser.elem_content(elem), elem) + if data: + self.split_content.append(data) + media = elem_attribs.get('media', None) + # Append to the previous node if it had the same media type, + # otherwise create a new node. + if self.media_nodes and self.media_nodes[-1][0] == media: + self.media_nodes[-1][1].split_content.append(data) + else: + node = CssCompressor(content='') + node.split_content.append(data) + self.media_nodes.append((media, node)) + return self.split_content + + def output(self): + self.split_contents() + if not hasattr(self, 'media_nodes'): + return super(CssCompressor, self).output() + if not settings.COMPRESS: + return self.content + ret = [] + for media, subnode in self.media_nodes: + subnode.extra_context = {'media': media} + ret.append(subnode.output()) + return ''.join(ret) |