Coding style overhaul for Python files (PEP8 conformant). Removed buggy csstidy pytho...
[redakcja.git] / apps / compress / templatetags / compressed.py
1 import os
2
3 from django import template
4
5 from compress.conf import settings
6 from compress.utils import media_root, media_url, needs_update, filter_css, filter_js, get_output_filename, get_version, get_version_from_file
7
8 register = template.Library()
9
10
11 def render_common(template_name, obj, filename, version):
12     if settings.COMPRESS:
13         filename = get_output_filename(filename, version)
14
15     context = obj.get('extra_context', {})
16     prefix = context.get('prefix', None)
17     if filename.startswith('http://'):
18         context['url'] = filename
19     else:
20         context['url'] = media_url(filename, prefix)
21
22     return template.loader.render_to_string(template_name, context)
23
24
25 def render_css(css, filename, version=None):
26     return render_common(css.get('template_name', 'compress/css.html'), css, filename, version)
27
28
29 def render_js(js, filename, version=None):
30     return render_common(js.get('template_name', 'compress/js.html'), js, filename, version)
31
32
33 class CompressedCSSNode(template.Node):
34
35     def __init__(self, name):
36         self.name = name
37
38     def render(self, context):
39         css_name = template.Variable(self.name).resolve(context)
40
41         try:
42             css = settings.COMPRESS_CSS[css_name]
43         except KeyError:
44             return ''  # fail silently, do not return anything if an invalid group is specified
45
46         if settings.COMPRESS:
47
48             version = None
49
50             if settings.COMPRESS_AUTO:
51                 u, version = needs_update(css['output_filename'],
52                     css['source_filenames'])
53                 if u:
54                     filter_css(css)
55             else:
56                 filename_base, filename = os.path.split(css['output_filename'])
57                 path_name = media_root(filename_base)
58                 version = get_version_from_file(path_name, filename)
59
60             return render_css(css, css['output_filename'], version)
61         else:
62             # output source files
63             r = ''
64             for source_file in css['source_filenames']:
65                 r += render_css(css, source_file)
66
67             return r
68
69
70 class CompressedJSNode(template.Node):
71
72     def __init__(self, name):
73         self.name = name
74
75     def render(self, context):
76         js_name = template.Variable(self.name).resolve(context)
77
78         try:
79             js = settings.COMPRESS_JS[js_name]
80         except KeyError:
81             return ''  # fail silently, do not return anything if an invalid group is specified
82
83         if 'external_urls' in js:
84             r = ''
85             for url in js['external_urls']:
86                 r += render_js(js, url)
87             return r
88
89         if settings.COMPRESS:
90
91             version = None
92
93             if settings.COMPRESS_AUTO:
94                 u, version = needs_update(js['output_filename'],
95                     js['source_filenames'])
96                 if u:
97                     filter_js(js)
98             else:
99                 filename_base, filename = os.path.split(js['output_filename'])
100                 path_name = media_root(filename_base)
101                 version = get_version_from_file(path_name, filename)
102
103             return render_js(js, js['output_filename'], version)
104         else:
105             # output source files
106             r = ''
107             for source_file in js['source_filenames']:
108                 r += render_js(js, source_file)
109             return r
110
111
112 #@register.tag
113 def compressed_css(parser, token):
114     try:
115         tag_name, name = token.split_contents()
116     except ValueError:
117         raise template.TemplateSyntaxError, '%r requires exactly one argument: the name of a group in the COMPRESS_CSS setting' % token.split_contents()[0]
118
119     return CompressedCSSNode(name)
120 compressed_css = register.tag(compressed_css)
121
122
123 #@register.tag
124 def compressed_js(parser, token):
125     try:
126         tag_name, name = token.split_contents()
127     except ValueError:
128         raise template.TemplateSyntaxError, '%r requires exactly one argument: the name of a group in the COMPRESS_JS setting' % token.split_contents()[0]
129
130     return CompressedJSNode(name)
131
132 compressed_js = register.tag(compressed_js)