sinatra-css 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,23 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+ doc
21
+
22
+ ## PROJECT::SPECIFIC
23
+ spec/fixtures/public/system
data/CHANGES ADDED
@@ -0,0 +1,4 @@
1
+
2
+ rel 0.1.0 (2010-03-03)
3
+
4
+ * initial release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 kematzy
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,256 @@
1
+ = Sinatra::CSS
2
+
3
+ A Sinatra Extension that makes working with CSS easy.
4
+
5
+
6
+
7
+ == Installation
8
+
9
+ # Add RubyGems.org (former Gemcutter) to your RubyGems sources
10
+ $ gem sources -a http://rubygems.org
11
+
12
+ $ (sudo)? gem install sinatra-css
13
+
14
+ == Dependencies
15
+
16
+ This Gem depends upon the following:
17
+
18
+ === Runtime:
19
+
20
+ * sinatra ( >= 1.0.a )
21
+ * sinatra-tags[http://github.com/kematzy/sinatra-tags] ( >= 0.1.0 )
22
+ * sinatra-outputbuffer[http://github.com/kematzy/sinatra-outputbuffer] ( >= 0.1.0 )
23
+ * sinatra-basics[http://github.com/kematzy/sinatra-basics] ( >= 0.5.0 )
24
+
25
+ Optionals:
26
+
27
+ * sinatra-settings[http://github.com/kematzy/sinatra-settings] (>= 0.1.1) # to view default settings in a browser display.
28
+ * sinatra-logger[http://github.com/kematzy/sinatra-logger] (>= 0.1.0) # to capture error messages in the log file.
29
+
30
+
31
+ === Development & Tests:
32
+
33
+ * sinatra-tests (>= 0.1.6)
34
+ * rspec (>= 1.3.0 )
35
+ * rack-test (>= 0.5.3)
36
+ * rspec_hpricot_matchers (>= 0.1.0)
37
+
38
+
39
+ == Getting Started
40
+
41
+ To start using Sinatra::CSS, just require and register the extension in your App...
42
+
43
+ require 'sinatra/css'
44
+
45
+ class YourApp < Sinatra::Base
46
+ register(Sinatra::CSS)
47
+
48
+ <snip...>
49
+
50
+ end
51
+
52
+
53
+ You then get access to 6 useful helper methods:
54
+
55
+
56
+ === <tt>css()</tt>
57
+
58
+ This method serves two purposes:
59
+
60
+ a) Return a stylesheet <tt><link></tt> tag with the <tt>path</tt> given.
61
+
62
+ css('/css/style.css') # =>
63
+
64
+ <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css" charset="utf-8">
65
+
66
+ css('style.css', :media => :print) # =>
67
+
68
+ <link rel="stylesheet" href="/style.css" media="print" type="text/css" charset="utf-8">
69
+
70
+
71
+
72
+ b) When passed a *block*, a <tt><style></tt> tag will be created with the yielded block as its contents.
73
+
74
+ css do
75
+ "body {
76
+ color: blue;
77
+ }"
78
+ end
79
+ # =>
80
+
81
+ <style type="text/css" media="screen">
82
+ body { color: blue; }
83
+ </style>
84
+
85
+
86
+ === <tt>css_custom() & css_custom_add()</tt>
87
+
88
+ These two methods works together, like this:
89
+
90
+ First you add the <tt>css_custom()</tt> method to your layout(s) (../views/layout.erb):
91
+
92
+ <html>
93
+ <head>
94
+ <snip...>
95
+
96
+ <%= css_custom %>
97
+
98
+ </head>
99
+
100
+
101
+
102
+ Then in your views, you can use the <tt>css_custom_add()</tt> method to add custom CSS
103
+ to the page, like this:
104
+
105
+ # in ../views/template.erb
106
+ <%= css_custom_add( "body{color: red;}" ) =>
107
+
108
+ # in ../views/shared/sidebar.erb
109
+ <%= css_custom_add( "#sidebar { background-color: black; }" ) =>
110
+
111
+
112
+ Which outputs the following in the <tt><head></tt> element of your page.
113
+
114
+ <html>
115
+ <head>
116
+ <snip...>
117
+
118
+ <style type="text/css" media="screen">
119
+ body { color: red; }
120
+ #sidebar { background-color: black; }
121
+ /* ...and more custom CSS */
122
+ </style>
123
+
124
+
125
+ This functionality makes it very easy to add CSS overides or page specific CSS to any page,
126
+ even from within multiple views.
127
+
128
+
129
+ === <tt>css_custom_files() & css_custom_add_file()</tt>
130
+
131
+ These two methods also works together in a similar fashion, like this:
132
+
133
+ First of, add the <tt>css_custom_files()</tt> method to your layout(s) (../views/layout.erb):
134
+
135
+ <html>
136
+ <head>
137
+ <snip...>
138
+
139
+ <%= css_custom_files %>
140
+
141
+ </head>
142
+
143
+
144
+ Then in your views, you can use the <tt>css_custom_add_file()</tt> method to add a custom CSS
145
+ file to the page, like this:
146
+
147
+ <%= css_custom_add_file('home') #=>
148
+
149
+ <link href="/home.css" rel="stylesheet" media="screen" type="text/css" charset="utf-8" />
150
+
151
+
152
+ The method even accepts an Array consisting of <tt>[ filename, media ]</tt> like this:
153
+
154
+ <%= css_custom_add_file( ['/css/print', :print] ) #=>
155
+
156
+ <link href="/css/print.css" rel="stylesheet" media="print" type="text/css" charset="utf-8" />
157
+
158
+
159
+ You can also use the method to embed the styles of a .css file into any part of a page, like this:
160
+
161
+ # NB! path is starting from APP_ROOT/public/
162
+
163
+ css_custom_add_file('home.css',:insert_into_html) #=>
164
+
165
+ <style type="text/css" media="screen">
166
+ /* the contents of ../public/home.css */
167
+ </style>
168
+
169
+
170
+ You can even give a file system path to embed the styles of a globaly shared .css file
171
+ outside of your applications path. Providing an easy way to resuse common snippets of code.
172
+
173
+
174
+ # NB! make sure the path and .css file works together as a real path.
175
+
176
+ # the :path value should always be a directory without the trailing slash.
177
+
178
+ css_custom_add_file('home.css',:insert_into_html, '/path/2/some/directory')
179
+
180
+
181
+ <style type="text/css" media="screen">
182
+ /* the contents of /path/2/some/directory/home.css */
183
+ </style>
184
+
185
+
186
+
187
+ === <tt>css_insert_file()</tt>
188
+
189
+ This is a simple convenicence method that takes a path to a CSS file
190
+ and inserts its content straight into the current view, without any enclosing HTML tags.
191
+
192
+ The method depends upon the settings of the <tt>:css_shared_source_files_dir</tt>
193
+ configuration variable defined inside your application.
194
+ By default this is set to <tt>'ENV['HOME']/.alt/css'</tt>.
195
+
196
+ An example of how to use this functionality:
197
+
198
+ # in your app's routes configurations
199
+
200
+ get('/css/screen.css') do
201
+ content_type 'text/css'
202
+ erb('css/screen'.to_sym, :layout => false)
203
+ end
204
+
205
+
206
+ # in views/css/screen.erb
207
+
208
+ <%= css_insert_file('blueprint/grid') %>
209
+
210
+ # => insert the contents of ENV['HOME']/.alt/css/blueprint/grid.css
211
+
212
+
213
+ You can also load and insert local files, ie files in your app's <tt>public/css/</tt> directory
214
+ by adding the <tt>:local</tt> flag to the call.
215
+
216
+ <%= css_insert_file('colors', :local) %>
217
+
218
+ # => insert the contents of /path/2/your/app/public/css/colors.css
219
+
220
+
221
+
222
+ == RTFM
223
+
224
+ If the above is not clear enough, please check the Specs for a better understanding.
225
+
226
+
227
+ == Errors / Bugs
228
+
229
+ If something is not behaving intuitively, it is a bug, and should be reported.
230
+ Report it here: http://github.com/kematzy/sinatra-css/issues
231
+
232
+
233
+ == TODOs
234
+
235
+ * Keep it up to date with any changes in Sinatra.
236
+
237
+ * Add bundle functionality from Sinatra::Bundles gem.
238
+
239
+ * Improve the specs a bit and add missing tests.
240
+
241
+ * Any other improvements I or You can think of.
242
+
243
+
244
+ == Note on Patches/Pull Requests
245
+
246
+ * Fork the project.
247
+ * Make your feature addition or bug fix.
248
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
249
+ * Commit, do not mess with rakefile, version, or history.
250
+ * (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
251
+ * Send me a pull request. Bonus points for topic branches.
252
+
253
+ == Copyright
254
+
255
+ Copyright (c) 2010 kematzy. See LICENSE for details.
256
+
@@ -0,0 +1,92 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "sinatra-css"
8
+ gem.summary = %Q{A Sinatra Extension that makes working with CSS easy.}
9
+ gem.description = %Q{A Sinatra Extension that makes working with CSS easy.}
10
+ gem.email = "kematzy@gmail.com"
11
+ gem.homepage = "http://github.com/kematzy/sinatra-css"
12
+ gem.authors = ["kematzy"]
13
+ gem.add_dependency "sinatra", ">= 1.0"
14
+ gem.add_dependency "sinatra-tags", ">= 0.1.0"
15
+ gem.add_development_dependency "sinatra-tests", ">= 0.1.6"
16
+ gem.add_development_dependency "rspec", ">= 1.3.0"
17
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
+ end
19
+ Jeweler::GemcutterTasks.new
20
+ rescue LoadError
21
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
22
+ end
23
+
24
+ require 'spec/rake/spectask'
25
+ Spec::Rake::SpecTask.new(:spec) do |spec|
26
+ spec.libs << 'lib' << 'spec'
27
+ spec.spec_opts = ["--color", "--format", "specdoc", "--require", "spec/spec_helper.rb"]
28
+ spec.spec_files = FileList['spec/**/*_spec.rb']
29
+ end
30
+
31
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
32
+ spec.libs << 'lib' << 'spec'
33
+ spec.spec_opts = ["--color", "--format", "specdoc", "--require", "spec/spec_helper.rb"]
34
+ spec.pattern = 'spec/**/*_spec.rb'
35
+ spec.rcov = true
36
+ end
37
+
38
+
39
+ namespace :spec do
40
+
41
+ desc "Run all specifications quietly"
42
+ Spec::Rake::SpecTask.new(:quiet) do |t|
43
+ t.libs << "lib"
44
+ t.spec_opts = ["--color", "--require", "spec/spec_helper.rb"]
45
+ end
46
+
47
+ desc "Run specific spec verbosely (SPEC=/path/2/file)"
48
+ Spec::Rake::SpecTask.new(:select) do |t|
49
+ t.libs << "lib"
50
+ t.spec_files = [ENV["SPEC"]]
51
+ t.spec_opts = ["--color", "--format", "specdoc", "--require", "spec/spec_helper.rb"]
52
+ end
53
+
54
+ end
55
+
56
+ task :spec => :check_dependencies
57
+
58
+ task :default => :spec
59
+
60
+ require 'rake/rdoctask'
61
+ Rake::RDocTask.new do |rdoc|
62
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
63
+
64
+ rdoc.rdoc_dir = 'rdoc'
65
+ rdoc.title = "Sinatra::CSS #{version}"
66
+ rdoc.rdoc_files.include('README*')
67
+ rdoc.rdoc_files.include('lib/**/*.rb')
68
+ end
69
+
70
+
71
+ desc 'Build the rdoc HTML Files'
72
+ task :docs do
73
+ version = File.exist?('VERSION') ? IO.read('VERSION').chomp : "[Unknown]"
74
+
75
+ sh "sdoc -N --title 'Sinatra::CSS v#{version}' lib/ README.rdoc"
76
+ end
77
+
78
+ namespace :docs do
79
+
80
+ desc 'Remove rdoc products'
81
+ task :remove => [:clobber_rdoc]
82
+
83
+ desc 'Force a rebuild of the RDOC files'
84
+ task :rebuild => [:rerdoc]
85
+
86
+ desc 'Build docs, and open in browser for viewing (specify BROWSER)'
87
+ task :open => [:docs] do
88
+ browser = ENV["BROWSER"] || "safari"
89
+ sh "open -a #{browser} doc/index.html"
90
+ end
91
+
92
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.5
@@ -0,0 +1,522 @@
1
+
2
+ require 'sinatra/base'
3
+ require 'sinatra/tags'
4
+ require 'sinatra/assets'
5
+
6
+
7
+ module Tilt
8
+
9
+ ## RCSS (RubyCSS) support, piggy-backing onto the ERBTemplate
10
+ # so that we can use <% %> tags with Ruby code inside the .rcss file
11
+ register 'rcss', ERBTemplate
12
+
13
+ end #/module Tilt
14
+
15
+ module Sinatra
16
+
17
+ module Templates
18
+
19
+ ## add support for .rcss
20
+ def rcss(template, options={}, locals={})
21
+ options[:outvar] = '@_out_buf'
22
+ options[:layout] = false
23
+ render :rcss, template, options, locals
24
+ end
25
+
26
+ end #/module Templates
27
+
28
+
29
+
30
+ ##
31
+ # = Sinatra::CSS
32
+ #
33
+ # A Sinatra Extension that makes working with CSS easy.
34
+ #
35
+ #
36
+ #
37
+ # == Installation
38
+ #
39
+ # # Add RubyGems.org (former Gemcutter) to your RubyGems sources
40
+ # $ gem sources -a http://rubygems.org
41
+ #
42
+ # $ (sudo)? gem install sinatra-css
43
+ #
44
+ # == Dependencies
45
+ #
46
+ # This Gem depends upon the following:
47
+ #
48
+ # === Runtime:
49
+ #
50
+ # * sinatra ( >= 1.0.a )
51
+ # * sinatra-tags[http://github.com/kematzy/sinatra-tags] ( >= 0.1.0 )
52
+ # * sinatra-outputbuffer[http://github.com/kematzy/sinatra-outputbuffer] ( >= 0.1.0 )
53
+ # * sinatra-basics[http://github.com/kematzy/sinatra-basics] ( >= 0.5.0 )
54
+ #
55
+ # Optionals:
56
+ #
57
+ # * sinatra-settings[http://github.com/kematzy/sinatra-settings] (>= 0.1.1) # to view default settings in a browser display.
58
+ # * sinatra-logger[http://github.com/kematzy/sinatra-logger] (>= 0.1.0) # to capture error messages in the log file.
59
+ #
60
+ #
61
+ # === Development & Tests:
62
+ #
63
+ # * sinatra-tests (>= 0.1.6)
64
+ # * rspec (>= 1.3.0 )
65
+ # * rack-test (>= 0.5.3)
66
+ # * rspec_hpricot_matchers (>= 0.1.0)
67
+ #
68
+ #
69
+ # == Getting Started
70
+ #
71
+ # To start using Sinatra::CSS, just require and register the extension in your App...
72
+ #
73
+ # require 'sinatra/css'
74
+ #
75
+ # class YourApp < Sinatra::Base
76
+ # register(Sinatra::CSS)
77
+ #
78
+ # <snip...>
79
+ #
80
+ # end
81
+ #
82
+ #
83
+ # You then get access to 6 useful helper methods:
84
+ #
85
+ #
86
+ # === <tt>css()</tt>
87
+ #
88
+ # This method serves two purposes:
89
+ #
90
+ # a) Return a stylesheet <tt><link></tt> tag with the <tt>path</tt> given.
91
+ #
92
+ # css('/css/style.css') # =>
93
+ #
94
+ # <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css" charset="utf-8">
95
+ #
96
+ # css('style.css', :media => :print) # =>
97
+ #
98
+ # <link rel="stylesheet" href="/style.css" media="print" type="text/css" charset="utf-8">
99
+ #
100
+ #
101
+ #
102
+ # b) When passed a *block*, a <tt><style></tt> tag will be created with the yielded block as its contents.
103
+ #
104
+ # css do
105
+ # "body {
106
+ # color: blue;
107
+ # }"
108
+ # end
109
+ # # =>
110
+ #
111
+ # <style type="text/css" media="screen">
112
+ # body { color: blue; }
113
+ # </style>
114
+ #
115
+ #
116
+ # === <tt>css_custom() & css_custom_add()</tt>
117
+ #
118
+ # These two methods works together, like this:
119
+ #
120
+ # First you add the <tt>css_custom()</tt> method to your layout(s) (../views/layout.erb):
121
+ #
122
+ # <html>
123
+ # <head>
124
+ # <snip...>
125
+ #
126
+ # <%= css_custom %>
127
+ #
128
+ # </head>
129
+ #
130
+ #
131
+ #
132
+ # Then in your views, you can use the <tt>css_custom_add()</tt> method to add custom CSS
133
+ # to the page, like this:
134
+ #
135
+ # # in ../views/template.erb
136
+ # <%= css_custom_add( "body{color: red;}" ) =>
137
+ #
138
+ # # in ../views/shared/sidebar.erb
139
+ # <%= css_custom_add( "#sidebar { background-color: black; }" ) =>
140
+ #
141
+ #
142
+ # Which outputs the following in the <tt><head></tt> element of your page.
143
+ #
144
+ # <html>
145
+ # <head>
146
+ # <snip...>
147
+ #
148
+ # <style type="text/css" media="screen">
149
+ # body { color: red; }
150
+ # #sidebar { background-color: black; }
151
+ # /* ...and more custom CSS */
152
+ # </style>
153
+ #
154
+ #
155
+ # This functionality makes it very easy to add CSS overides or page specific CSS to any page,
156
+ # even from within multiple views.
157
+ #
158
+ #
159
+ # === <tt>css_custom_files() & css_custom_add_file()</tt>
160
+ #
161
+ # These two methods also works together in a similar fashion, like this:
162
+ #
163
+ # First of, add the <tt>css_custom_files()</tt> method to your layout(s) (../views/layout.erb):
164
+ #
165
+ # <html>
166
+ # <head>
167
+ # <snip...>
168
+ #
169
+ # <%= css_custom_files %>
170
+ #
171
+ # </head>
172
+ #
173
+ #
174
+ # Then in your views, you can use the <tt>css_custom_add_file()</tt> method to add a custom CSS
175
+ # file to the page, like this:
176
+ #
177
+ # <%= css_custom_add_file('home') #=>
178
+ #
179
+ # <link href="/home.css" rel="stylesheet" media="screen" type="text/css" charset="utf-8" />
180
+ #
181
+ #
182
+ # The method even accepts an Array consisting of <tt>[ filename, media ]</tt> like this:
183
+ #
184
+ # <%= css_custom_add_file( ['/css/print', :print] ) #=>
185
+ #
186
+ # <link href="/css/print.css" rel="stylesheet" media="print" type="text/css" charset="utf-8" />
187
+ #
188
+ #
189
+ # You can also use the method to embed the styles of a .css file into any part of a page, like this:
190
+ #
191
+ # # NB! path is starting from APP_ROOT/public/
192
+ #
193
+ # css_custom_add_file('home.css',:insert_into_html) #=>
194
+ #
195
+ # <style type="text/css" media="screen">
196
+ # /* the contents of ../public/home.css */
197
+ # </style>
198
+ #
199
+ #
200
+ # You can even give a file system path to embed the styles of a globaly shared .css file
201
+ # outside of your applications path. Providing an easy way to resuse common snippets of code.
202
+ #
203
+ #
204
+ # # NB! make sure the path and .css file works together as a real path.
205
+ #
206
+ # # the :path value should always be a directory without the trailing slash.
207
+ #
208
+ # css_custom_add_file('home.css',:insert_into_html, '/path/2/some/directory')
209
+ #
210
+ #
211
+ # <style type="text/css" media="screen">
212
+ # /* the contents of /path/2/some/directory/home.css */
213
+ # </style>
214
+ #
215
+ #
216
+ #
217
+ # === <tt>css_insert_file()</tt>
218
+ #
219
+ # This is a simple convenicence method that takes a path to a CSS file
220
+ # and inserts its content straight into the current view, without any enclosing HTML tags.
221
+ #
222
+ # The method depends upon the settings of the <tt>:css_shared_source_files_dir</tt>
223
+ # configuration variable defined inside your application.
224
+ # By default this is set to <tt>'ENV['HOME']/.alt/css'</tt>.
225
+ #
226
+ # An example of how to use this functionality:
227
+ #
228
+ # # in your app's routes configurations
229
+ #
230
+ # get('/css/screen.css') do
231
+ # content_type 'text/css'
232
+ # erb('css/screen'.to_sym, :layout => false)
233
+ # end
234
+ #
235
+ #
236
+ # # in views/css/screen.erb
237
+ #
238
+ # <%= css_insert_file('blueprint/grid') %>
239
+ #
240
+ # # => insert the contents of ENV['HOME']/.alt/css/blueprint/grid.css
241
+ #
242
+ #
243
+ # You can also load and insert local files, ie files in your app's <tt>public/css/</tt> directory
244
+ # by adding the <tt>:local</tt> flag to the call.
245
+ #
246
+ # <%= css_insert_file('colors', :local) %>
247
+ #
248
+ # # => insert the contents of /path/2/your/app/public/css/colors.css
249
+ #
250
+ #
251
+ # == TODOs
252
+ #
253
+ # * Keep it up to date with any changes in Sinatra.
254
+ #
255
+ # * Add bundle functionality from Sinatra::Bundles gem.
256
+ #
257
+ # * Improve the specs a bit and add missing tests.
258
+ #
259
+ # * Any other improvements I or You can think of.
260
+ #
261
+ #
262
+ # == Copyright
263
+ #
264
+ # Copyright (c) 2010 kematzy. See LICENSE for details.
265
+ #
266
+
267
+ module CSS
268
+ VERSION = '0.1.5' unless const_defined?(:VERSION)
269
+ def self.version; "Sinatra::CSS v#{VERSION}"; end
270
+
271
+
272
+
273
+ module Helpers
274
+
275
+ attr_accessor :sinatra_css_custom_code, :sinatra_css_custom_files
276
+
277
+ ##
278
+ # Return stylesheet link tag to _path_. When a _block_
279
+ # is passed, a style tag will be created with the yielded
280
+ # value as its contents.
281
+ #
282
+ # ==== Examples
283
+ #
284
+ # css do
285
+ # "body {
286
+ # color: blue;
287
+ # }"
288
+ # end
289
+ # # => <style>body { ... }</style>
290
+ #
291
+ #
292
+ # css('/css/style.css', :media => :print) # =>
293
+ #
294
+ # <link rel="stylesheet" href="/css/style.css" media="print" type="text/css" charset="utf-8">
295
+ #
296
+ # @api public
297
+ def css(path = nil, attrs = {}, &block)
298
+ attrs = { :type => 'text/css', :media => "screen" }.merge(attrs)
299
+ return tag(:style, yield, attrs) if block_given?
300
+ path = url_for("#{path.sub('.css','')}.css") unless remote_asset?(path)
301
+ tag(:link, { :rel => 'stylesheet', :charset => "utf-8", :href => path, :newline => true }.merge(attrs))
302
+ end
303
+ alias_method :stylesheet, :css
304
+
305
+ ##
306
+ # Adds custom CSS to the page load from within a view, helper method and so on
307
+ #
308
+ # ==== Examples
309
+ #
310
+ # css_custom_add("body{color: green;}")
311
+ # => output within <style>.. tag in the <head> of document
312
+ #
313
+ # @api public
314
+ def css_custom_add(css)
315
+ @sinatra_css_custom_code ||= []
316
+ @sinatra_css_custom_code << css
317
+ end
318
+
319
+ ##
320
+ # Add a custom CSS file to the page load from within a view, helper method and so on
321
+ #
322
+ # ==== Examples
323
+ #
324
+ # css_custom_add_file [filename, media]
325
+ # => output within <link href..>.. tag in the <head> of document
326
+ #
327
+ # You can also embed the styles of a .css file into the head element of a page.
328
+ # NB! path is starting from APP_ROOT/public/
329
+ #
330
+ # css_custom_add_file('home.css',:insert_into_html)
331
+ # => <style type="text/css" media="screen"> CSS content </style>
332
+ #
333
+ # You can even give a file system path to embed the styles of a .css file.
334
+ # NB! make sure the path and .css file works together as a real path.
335
+ # :path should always be a directory without the trailing slash.
336
+ #
337
+ # css_custom_add_file('home.css',:insert_into_html, '/path/2/some/directory')
338
+ # => <style type="text/css" media="screen"> Some Style CSS content </style>
339
+ #
340
+ # @api public
341
+ def css_custom_add_file(file, insert_into_html = nil, path = nil)
342
+ if insert_into_html.nil?
343
+ @sinatra_css_custom_files ||= []
344
+ file = [file,:screen] unless file.is_a?(Array)
345
+ @sinatra_css_custom_files << file
346
+ else
347
+ # read the file into css_custom_add
348
+ path_css = path.nil? ? self.class.public : path
349
+ file_css = "#{path_css}/#{file.sub('.css','')}.css"
350
+ if test(?f, file_css)
351
+ css_custom_add(IO.read(file_css))
352
+ else
353
+ err_msg = "ERROR: css_custom_add_file(:insert_into_html) method could NOT find and embed this CSS file=[ #{file_css} ]"
354
+ if self.respond_to?(:logger)
355
+ logger.warn(err_msg)
356
+ else
357
+ warn(err_msg)
358
+ end
359
+ end
360
+ end
361
+ end
362
+
363
+ ##
364
+ # Simple convenicence method that takes a path to a CSS file
365
+ # and inserts its content into the current <tt>.erb</tt> file
366
+ #
367
+ # Depends upon the settings of the <tt>:css_compiled_files_dir</tt> configuration variable
368
+ # defined inside your application. By default it is set to <tt>'//Users/kematzy/.alt/css'</tt>
369
+ #
370
+ # ==== Examples
371
+ #
372
+ # # in your app's routes configurations
373
+ # get '/css/screen.css' { }
374
+ # get('/css/screen.css') do
375
+ # content_type 'text/css'
376
+ # erb('css/screen.css'.to_sym, :layout => false)
377
+ # end
378
+ #
379
+ #
380
+ # # in views/css/screen.css
381
+ # css_insert_file('blueprint/grid')
382
+ #
383
+ # which inserts the CSS code from that file into the output.
384
+ #
385
+ #
386
+ #
387
+ #
388
+ # @api public
389
+ def css_insert_file(path = '', local = nil )
390
+ file_path = local.nil? ? "#{self.class.css_shared_source_files_dir}/#{path}" : path
391
+ file_path = file_path.sub(/\.css$/,'') << ".css"
392
+ if test(?f, file_path)
393
+ content = IO.read(file_path)
394
+ else
395
+ content = "/* ERROR: the CSS file [#{file_path}] could NOT be found */"
396
+ end
397
+ content
398
+ end
399
+
400
+ ##
401
+ # Outputs any custom CSS if provided from within a view, helper method and so on
402
+ #
403
+ # ==== Examples
404
+ #
405
+ # custom_css() => <style...> custom css </style>
406
+ #
407
+ # @api public
408
+ def css_custom(css=nil)
409
+ out = ''
410
+ out << css unless css.nil?
411
+ @sinatra_css_custom_code.each { |i| out << " #{i}\n" } unless @sinatra_css_custom_code.nil?
412
+ out = out.empty? ? '' : %Q[<style type="text/css" media="screen">\n#{out.strip}\n </style>\n]
413
+ end
414
+
415
+ ##
416
+ # Outputs any custom CSS files that have been included
417
+ #
418
+ # ==== Examples
419
+ #
420
+ # css_custom_files =>
421
+ # <!-- custom css files -->
422
+ # <link href="/css/custom1.css"...>
423
+ # <link href="/css/custom2.css"...>
424
+ # <!-- /custom css files -->
425
+ #
426
+ # @api public
427
+ def css_custom_files
428
+ unless @sinatra_css_custom_files.nil?
429
+ out = "<!-- custom css files -->\n"
430
+ @sinatra_css_custom_files.each do |file| # returns an array
431
+ out << css(file[0], :media => file[1])
432
+ end
433
+ out << "<!-- /custom css files -->\n"
434
+ else
435
+ '' # return empty string, it's better than nil in this case
436
+ end
437
+ end
438
+
439
+
440
+
441
+ end #/ Helpers
442
+
443
+
444
+
445
+ ##
446
+ # Handles all CSS requests, and returns the RCSS (RubyCSS) file version of it,
447
+ # or else passes the request on to the file system.
448
+ #
449
+ # NB! the path value given is NOT used as the name of the source directory in app/views,
450
+ # so ensure that there is always an app/views/css directory in place.
451
+ #
452
+ # ie:
453
+ # get_all_css_requests() => expects a app/views/css dir with the .rcss files
454
+
455
+ # get_all_css_requests('/stylesheets') => expects a app/views/css dir with the .rcss files
456
+ #
457
+ # ==== Examples
458
+ #
459
+ # get_all_css_requests() => catches 'site.com/css/screen.css
460
+ # get_all_css_requests('/stylesheets') => catches 'site.com/stylesheets/screen.css
461
+ #
462
+ # @api public
463
+ def get_all_css_requests(path='/css', options = {})
464
+ path, options = '/css', path if path.is_a?(Hash)
465
+
466
+ get("#{path}/*.css", {}) do
467
+
468
+ begin
469
+ options = { :cache => false, :layout => false }.merge(options)
470
+
471
+ content_type 'text/css', :charset => 'utf-8'
472
+ if self.settings.environment == :production
473
+ rcss("css/#{params[:splat].first}".to_sym, options ).gsub(/\n\r?$/,"")
474
+ else
475
+ rcss("css/#{params[:splat].first}".to_sym, options )
476
+ end
477
+ rescue Errno::ENOENT
478
+ content_type 'text/html' # reset the content_type
479
+ pass
480
+ end
481
+ end
482
+ end
483
+
484
+
485
+
486
+ ##
487
+ # Registers these Extensions:
488
+ #
489
+ # * Sinatra::Tags
490
+ # * Sinatra::Basics::Assets
491
+ #
492
+ # Default Settings:
493
+ #
494
+ # * +:css_shared_source_files_dir+ => set the path to the Shared directory with compliled CSS templates.
495
+ # Default is: <tt>'ENV['HOME']/.alt/css'</tt>
496
+ #
497
+ # @api public
498
+ def self.registered(app)
499
+ app.register(Sinatra::Tags)
500
+ app.register(Sinatra::Assets)
501
+
502
+ app.helpers Sinatra::CSS::Helpers
503
+
504
+ # set the path to the Shared directory with compliled CSS templates
505
+ app.set :css_shared_source_files_dir, File.join(File.expand_path(ENV['HOME']) ,'.alt', 'css')
506
+
507
+
508
+ ## add the extension specific options to those inspectable by :settings_inspect method
509
+ # provided by the Sinatra::Settings extension
510
+ if app.respond_to?(:sinatra_settings_for_inspection)
511
+ %w( css_shared_source_files_dir ).each do |m|
512
+ app.sinatra_settings_for_inspection << m
513
+ end
514
+ end
515
+
516
+ end #/ self.registered
517
+
518
+ end #/ CSS
519
+
520
+ register(Sinatra::CSS)
521
+
522
+ end #/ Sinatra