summaryrefslogtreecommitdiff
path: root/compressor/filters/jsmin/__init__.py
blob: 872bcf7c35fea23362b3105ddc46188be93aa7b2 (plain)
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
from django.core.exceptions import ImproperlyConfigured

from compressor.filters import FilterBase, CallbackOutputFilter


class rJSMinFilter(CallbackOutputFilter):
    callback = "rjsmin.jsmin"
    dependencies = ["rjsmin"]
    kwargs = {"keep_bang_comments": True}


# This is for backwards compatibility
JSMinFilter = rJSMinFilter


class CalmjsFilter(FilterBase):
    def __init__(self, *args, **kwargs):
        try:
            self._parser = kwargs.pop("parser")
        except KeyError:
            self._parser = None
        try:
            self._unparser = kwargs.pop("unparser")
        except KeyError:
            self._unparser = None
        super().__init__(*args, **kwargs)
        try:
            import calmjs.parse
        except ImportError:
            raise ImproperlyConfigured(
                "The module calmjs.parse couldn't be imported. "
                "Make sure it is correctly installed."
            )
        if self._parser is None:
            self._parser = calmjs.parse.es5
        if self._unparser is None:
            self._unparser = calmjs.parse.unparsers.es5.minify_printer(obfuscate=True)

    def output(self, **kwargs):
        program = self._parser(self.content)
        minified = "".join(part.text for part in self._unparser(program))
        assert isinstance(minified, str)
        return minified