-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathREADME
277 lines (195 loc) · 10 KB
/
README
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
Explanation
===========
This module attempts to integrate the excellent CleverCSS tool with Django in
a way that makes it easy for template designers to work with, and provides
some simple features which can help simplify the job of maintaining and
customising your site's style sheets, especially (but not limited to) the
purposes of franchising
(see http://www.huyng.com/archives/franchising-running-multiple-sites-from-one-django-codebase-2/394/).
Notes
=====
This package requires (and does not include) the installation of CleverCSS,
which does all of the heavy lifting. This package mainly provides:
* A django adminsitration command to regenerate the style sheets (manually);
* A directory watcher to automatically trigger image and style sheet
regeneration when a file has changed (for developer/designer use --
not intenteded for production use!)
* The ability to specify one or more "config.ini" style files for initial
variable population/interpolation, which makes the maintenance of complex
color themes very easy, makes color customisation for franchise-sites much
easier and quicker
Installation
============
On both development and production machines, you should install the tarball
to your site-packages directory. If you're using buildout, you can install the
package automatically from github like this:
[buildout]
find-links = http://github.com/isolationism/django-cleaver/tarball/master#egg=django-cleaver
parts = django-cleaver
eggs = django-cleaver
[django-cleaver]
unzip = true
recipe = zc.recipe.egg
Configuration
=============
Add the project to your INSTALLED_APPS in settings.py:
INSTALLED_APPS = (
# ...
'django_cleaver',
)
To enable the automatic output regeneration feature, you'll also need to add
django-cleaver toward the top of your MIDDLEWARE_CLASSES stack:
MIDDLEWARE_CLASSES = (
# Regenerates CleverCSS output on-demand middleware
'django_cleaver.middleware.RegenerateCleverOutputMiddleware',
# ... Other classes go here
)
N.B. it is completely safe to include this middleware class on production
servers, as you can disable autogeneration using a config file option (see
below).
Now, add the following section to your settings.py file:
----------------------------------- 8< snip -----------------------------------
import os
CLEVERCSS_SOURCE = os.path.join(MEDIA_ROOT, 'clevercss')
CLEVERCSS_CONTEXTFILES = (
os.path.join(CLEVERCSS_SOURCE, 'master.ini'),
)
CLEVERCSS_OUTPUT = os.path.join(MEDIA_ROOT, 'css')
CLEVERCSS_AUTOGENERATE = False # Set this to True on development servers
----------------------------------- 8< snip -----------------------------------
Let's explain the settings a bit:
CLEVERCSS_SOURCE - This is the directory where you'll keep all your CleverCSS
(*.ccss) files. I put mine in project/media/clevercss, but this can be
anywhere you want.
CLEVERCSS_OUTPUT - This is the path where the CleverCSS output will go. This
should probably be your site media directory, unless you have something
special planned. Don't specify the filename here -- just the path where it
will go.
CLEVERCSS_CONTEXTFILES - This is a tuple of full paths to config.ini style
files that will be passed as context to your ccss files. The format of
those files follows in a later section. Context files will be processed
in order of precedence, so a typical pattern is to define some defaults in
the first file, then override the defaults in a following file or files as
you want.
CLEVERCSS_AUTOGENERATE - A boolean value. When true, Cleaver will automatically
generate the CleverCSS files at need. This is very convenient for developers
and designers, but should never be enabled on production sites due to
performance issues and the potential for abuse.
Usage
=====
If you haven't already, create your CLEVERCSS_SOURCE directory now, and the
CLEVERCSS_CONTEXTFILES you defined. You will also need to create at least one
".ccss" file -- it is generally a good idea to match these to your
context filename -- in this example, we'll go with "master.ccss".
Now there are three tasks before you can start developing:
1 - Edit your master.ini file to contain some variable definitions
-------------------------------------------------------------------
Edit your master.ini file and insert the following:
----------------------------------- 8< snip -----------------------------------
[Color Names]
white = #FFF
black = #000
favorite_color = #070
[Color Classes]
page_background = $white
page_foreground = $black
link = $favorite_color
link_visited = $favourite_color.shade(0,-50)
[Fonts]
body_font_family = sans-serif
body_font_size = 90%
----------------------------------- 8< snip -----------------------------------
Use standard "ini" file syntax here. The section titles are required for the
file to be valid, but can be called whatever you want -- they don't affect the
parsing.
I personally like to abstract a color's appearance from its intended use, which
is why I define "base values" in one location and how it will be used in the
style sheet in a different section. Note how I am also interpolating and
modifying $favorite_color to be a desaturated shade of the original color
for visited links. This is a CleverCSS method; look at CleverCSS' utils for
details on available methods on color values.
What you define here is entirely up to you -- anything that you may want to
customize or tweak later. I suggest considering things like colors, images
and sprites (CleverCSS bundles some very handy features for making image
sprites a little less painful to work with), font families and sizes, border
widths, paddings and margins -- you name it. Remember to make use of CleverCSS'
methods to make your life easier, and don't worry about deep variable
interpolation -- CleverCSS has very fast execution times, and doesn't seem to
have any problem doing them.
2 - Create a few CleverCSS component files
------------------------------------------
Create a new file called "_page.ccss". The underscore is significant -- It
instructs CleverCSS not to directly parse this document. The reason for this
will become apparent in step 3 below. Into this file, insert the following:
----------------------------------- 8< snip -----------------------------------
body:
background-color: $page_background
color: $page_foreground
font-family: $body_font_family
font-size: $body_font_size
a:
color: $link
&:visited:
color: $link_visited
----------------------------------- 8< snip -----------------------------------
This is a regular old CleverCSS file, with one exception: All of the context
we defined in that ini file is available here.
Again, as a best practice, I don't want to define any new or even derived colors
in this file -- because I want to be able to customize 100% of the colors by
editing ONLY the config.ini file. While this isn't a strict requirement, it
makes customisation easier.
3 - Edit your master.ccss file to include your CleverCSS component files
-------------------------------------------------------------------------
Now edit your master.ccss file to contain the following:
----------------------------------- 8< snip -----------------------------------
@import url(_body.ccss)
----------------------------------- 8< snip -----------------------------------
That's it. When you create a new component, you'll need to import it here (and
again, remember that order is important for the generated CSS). This layer of
separation makes several things possible:
* You have one master manifest of all the files that go into creating the
completed style sheet
* You can have as many discrete parts in tidy, organized, well-documented
files as you want ...
* ... But they are automatically collapsed down to a single file, based on the
filename of the source file you defined (in this example, the output file name
will be master.css).
* Provides another layer where style sheets can be customized for franchises
beyond what is possible through variable interpolation in the .ini files.
Also, because we have generated a single valid CSS file, it is easy to call
additional commands to perform further processing on the file, such as
compression-obfuscation.
Generating Style Sheets
=======================
To regenerate the style sheets, you have two options:
1 - Enable CLEVERCSS_AUTOGENERATE on your local development server, which will
automatically take care of regeneration for you as required. This typically
happens so fast you won't even notice it happening.
2 - When preparing for deployment on a staging or testing server, you can call
the django management command as follows:
$ python manage.py generate_css
Output compiled CSS file /path/to/media/css/master.css
Franchising
===========
While the details of franchising are beyond the scope of this document, the
process is relatively straightforward:
1 - Create a new settings.py file for your franchise named after your franchise
2 - In your franchise settings file, redefine CLEVERCSS_CONTEXTFILES:
CLEVERCSS_CONTEXTFILES = (
'master.ini',
'my_franchise.ini',
)
3 - Create my_franchise.ini, (re-)defining ONLY values you need to change. You
Don't need to copy master.ini because all those values will already be
defined in step 2 above.
4 - Create my_franchise.ccss, with the first line being:
@import url(master.ccss)
Now, as with step 3, you only need to define things you want to change from
the base properties. Normally you will do this by importing one or more
partials, e.g. ...
@import url(_my_franchise_special_buttons.ccss)
@import url(_my_franchise_other_customisation.ccss)
5 - Include (only) the generated my_franchise.css file in your franchise
templates. Since you probably want to do this automatically without having
to manually define a template, I recommend setting the output filename
as a variable somewhere in the settings file.