summaryrefslogtreecommitdiff
path: root/compressor/css.py
diff options
context:
space:
mode:
authorJannis Leidel <jannis@leidel.info>2010-06-07 11:08:28 +0200
committerJannis Leidel <jannis@leidel.info>2010-06-07 15:01:36 +0200
commit1298e2d573aeba1ce5d165465e91fa54133511a8 (patch)
treef2295f873143530e513a622323406de81458062a /compressor/css.py
parenta54a07da92582982192c269f1c7c69175fde458f (diff)
downloaddjango-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.py57
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)