chriseppstein-compass 0.6.15 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/CHANGELOG.markdown +170 -0
  2. data/LICENSE.markdown +29 -0
  3. data/README.markdown +10 -2
  4. data/REVISION +1 -1
  5. data/Rakefile +126 -0
  6. data/VERSION.yml +2 -2
  7. data/deps.rip +1 -0
  8. data/examples/blueprint_default/src/images/grid.png +0 -0
  9. data/examples/blueprint_plugins/src/images/grid.png +0 -0
  10. data/examples/blueprint_scoped/images/grid.png +0 -0
  11. data/examples/blueprint_scoped_form/images/grid.png +0 -0
  12. data/examples/blueprint_semantic/src/images/grid.png +0 -0
  13. data/examples/blueprint_semantic/src/liquid.sass +2 -2
  14. data/examples/blueprint_semantic/src/screen.sass +3 -3
  15. data/examples/compass/src/images/blue_arrow.gif +0 -0
  16. data/frameworks/blueprint/stylesheets/blueprint/_ie.sass +42 -0
  17. data/frameworks/blueprint/stylesheets/blueprint/_reset.sass +3 -0
  18. data/frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass +10 -9
  19. data/frameworks/blueprint/stylesheets/blueprint/modules/_form.sass +35 -23
  20. data/frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass +7 -7
  21. data/frameworks/blueprint/stylesheets/blueprint/modules/_reset.sass +56 -0
  22. data/frameworks/blueprint/stylesheets/blueprint/modules/_rtl.sass +2 -2
  23. data/frameworks/blueprint/stylesheets/blueprint/modules/_scaffolding.sass +2 -1
  24. data/frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass +3 -2
  25. data/frameworks/blueprint/templates/project/manifest.rb +2 -1
  26. data/frameworks/blueprint/templates/project/partials/_base.sass +11 -0
  27. data/frameworks/blueprint/templates/project/screen.sass +38 -6
  28. data/frameworks/compass/stylesheets/compass/_utilities.sass +1 -0
  29. data/frameworks/compass/stylesheets/compass/utilities/_sprites.sass +1 -0
  30. data/frameworks/compass/stylesheets/compass/utilities/general/_reset.sass +106 -28
  31. data/frameworks/compass/stylesheets/compass/utilities/general/_tag_cloud.sass +1 -1
  32. data/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite_img.sass +12 -0
  33. data/frameworks/compass/stylesheets/compass/utilities/text/_replacement.sass +10 -3
  34. data/frameworks/compass/templates/project/manifest.rb +1 -1
  35. data/frameworks/compass/templates/project/screen.sass +6 -0
  36. data/lib/compass/actions.rb +7 -0
  37. data/lib/compass/{merb.rb → app_integration/merb.rb} +0 -0
  38. data/lib/compass/app_integration/rails/action_controller.rb +15 -0
  39. data/lib/compass/app_integration/rails/image_url.rb +14 -0
  40. data/lib/compass/app_integration/rails/sass_plugin.rb +5 -0
  41. data/lib/compass/app_integration/rails/templates/compass-install-rails.rb +80 -0
  42. data/lib/compass/app_integration/rails.rb +12 -0
  43. data/lib/compass/app_integration.rb +5 -0
  44. data/lib/compass/commands/project_base.rb +12 -2
  45. data/lib/compass/commands/update_project.rb +13 -3
  46. data/lib/compass/commands/watch_project.rb +27 -28
  47. data/lib/compass/commands/write_configuration.rb +5 -1
  48. data/lib/compass/compiler.rb +14 -2
  49. data/lib/compass/configuration.rb +78 -2
  50. data/lib/compass/exec.rb +78 -37
  51. data/lib/compass/installers/base.rb +4 -2
  52. data/lib/compass/installers/rails.rb +3 -2
  53. data/lib/compass/installers/stand_alone.rb +3 -2
  54. data/lib/compass/sass_extensions/functions/display.rb +22 -0
  55. data/lib/compass/sass_extensions/functions/enumerate.rb +6 -0
  56. data/lib/compass/sass_extensions/functions/image_url.rb +88 -0
  57. data/lib/compass/sass_extensions/functions/inline_image.rb +35 -0
  58. data/lib/compass/sass_extensions/functions/selectors.rb +39 -0
  59. data/lib/compass/sass_extensions/functions.rb +19 -0
  60. data/lib/compass/sass_extensions/monkey_patches/stylesheet_updating.rb +23 -0
  61. data/lib/compass/sass_extensions/monkey_patches.rb +3 -0
  62. data/lib/compass/sass_extensions.rb +5 -0
  63. data/lib/compass/version.rb +2 -3
  64. data/lib/compass.rb +3 -18
  65. data/test/command_line_helper.rb +102 -0
  66. data/test/command_line_test.rb +2 -106
  67. data/test/compass_test.rb +18 -6
  68. data/test/configuration_test.rb +73 -0
  69. data/test/fixtures/stylesheets/blueprint/images/grid.png +0 -0
  70. data/test/fixtures/stylesheets/compass/css/reset.css +42 -46
  71. data/test/fixtures/stylesheets/compass/sass/reset.sass +9 -0
  72. data/test/fixtures/stylesheets/image_urls/config.rb +17 -0
  73. data/test/fixtures/stylesheets/image_urls/css/screen.css +3 -0
  74. data/test/fixtures/stylesheets/image_urls/images/grid.png +0 -0
  75. data/test/fixtures/stylesheets/image_urls/sass/screen.sass +6 -0
  76. data/test/rails_integration_test.rb +83 -0
  77. data/test/sass_extensions_test.rb +0 -1
  78. data/test/test_case_helper.rb +13 -0
  79. data/test/test_helper.rb +3 -27
  80. data/test/test_rails_helper.rb +20 -0
  81. metadata +51 -4
  82. data/lib/sass_extensions.rb +0 -67
@@ -7,45 +7,44 @@ module Compass
7
7
  module Commands
8
8
  class WatchProject < UpdateProject
9
9
 
10
- attr_accessor :last_update_time
10
+ attr_accessor :last_update_time, :last_sass_files
11
11
 
12
12
  def perform
13
- puts ">>> Compiling all stylesheets."
14
- super
15
- self.last_update_time = most_recent_update_time
16
- puts ">>> Compass is now watching for changes. Press Ctrl-C to Stop."
13
+ Signal.trap("INT") do
14
+ puts ""
15
+ exit 0
16
+ end
17
+ puts ">>> Compass is watching for changes. Press Ctrl-C to Stop."
17
18
  loop do
18
19
  # TODO: Make this efficient by using filesystem monitoring.
19
- begin
20
- sleep 1
21
- rescue Interrupt
22
- puts ""
23
- exit 0
24
- end
25
- file, t = should_update?
26
- if t
27
- begin
28
- puts ">>> Change detected to: #{file}"
29
- super
30
- rescue StandardError => e
31
- ::Compass::Exec.report_error(e, options)
32
- end
33
- self.last_update_time = t
34
- end
20
+ compiler = new_compiler_instance(:quiet => true)
21
+ remove_obsolete_css(compiler)
22
+ recompile(compiler)
23
+ sleep 1
35
24
  end
36
25
  end
37
26
 
38
- def most_recent_update_time
39
- Dir.glob(separate("#{projectize(Compass.configuration.sass_dir)}/**/*.sass")).map {|sass_file| File.stat(sass_file).mtime}.max
27
+ def remove_obsolete_css(compiler)
28
+ sass_files = compiler.sass_files
29
+ deleted_sass_files = (last_sass_files || []) - sass_files
30
+ deleted_sass_files.each do |deleted_sass_file|
31
+ css_file = compiler.corresponding_css_file(deleted_sass_file)
32
+ remove(css_file) if File.exists?(css_file)
33
+ end
34
+ self.last_sass_files = sass_files
40
35
  end
41
36
 
42
- def should_update?
43
- t = most_recent_update_time
44
- if t > last_update_time
45
- file = Dir.glob(separate("#{projectize(Compass.configuration.sass_dir)}/**/*.sass")).detect {|sass_file| File.stat(sass_file).mtime >= t}
46
- [file, t]
37
+ def recompile(compiler)
38
+ if file = compiler.out_of_date?
39
+ begin
40
+ puts ">>> Change detected to: #{file}"
41
+ compiler.run
42
+ rescue StandardError => e
43
+ ::Compass::Exec.report_error(e, options)
44
+ end
47
45
  end
48
46
  end
47
+
49
48
  end
50
49
  end
51
50
  end
@@ -12,13 +12,17 @@ module Compass
12
12
  end
13
13
 
14
14
  def perform
15
- installer.write_configuration_files
15
+ installer.write_configuration_files(options[:configuration_file])
16
16
  end
17
17
 
18
18
  def installer_args
19
19
  [nil, project_directory, options]
20
20
  end
21
21
 
22
+ def explicit_config_file_must_be_readable?
23
+ false
24
+ end
25
+
22
26
  end
23
27
  end
24
28
  end
@@ -22,15 +22,27 @@ module Compass
22
22
  end
23
23
 
24
24
  def css_files
25
- @css_files || sass_files.map{|sass_file| "#{to}/#{stylesheet_name(sass_file)}.css"}
25
+ @css_files ||= sass_files.map{|sass_file| corresponding_css_file(sass_file)}
26
+ end
27
+
28
+ def corresponding_css_file(sass_file)
29
+ "#{to}/#{stylesheet_name(sass_file)}.css"
26
30
  end
27
31
 
28
32
  def target_directories
29
33
  css_files.map{|css_file| File.dirname(css_file)}.uniq.sort.sort_by{|d| d.length }
30
34
  end
31
35
 
36
+ def out_of_date?
37
+ Compass.configure_sass_plugin! unless Compass.sass_plugin_configured?
38
+ sass_files.zip(css_files).each do |sass_filename, css_filename|
39
+ return sass_filename if Sass::Plugin.exact_stylesheet_needs_update?(css_filename, sass_filename)
40
+ end
41
+ false
42
+ end
43
+
32
44
  def run
33
- Compass.configure_sass_plugin!
45
+ Compass.configure_sass_plugin! unless Compass.sass_plugin_configured?
34
46
  target_directories.each do |dir|
35
47
  directory dir
36
48
  end
@@ -13,7 +13,9 @@ module Compass
13
13
  :javascripts_dir,
14
14
  :output_style,
15
15
  :environment,
16
- :http_images_path
16
+ :http_images_path,
17
+ :additional_import_paths,
18
+ :sass_options
17
19
  ]
18
20
 
19
21
  attr_accessor *ATTRIBUTES
@@ -38,6 +40,10 @@ module Compass
38
40
  value = eval(prop.to_s, binding) rescue nil
39
41
  self.send("#{prop}=", value) if value
40
42
  end
43
+ if @added_import_paths
44
+ self.additional_import_paths ||= []
45
+ self.additional_import_paths += @added_import_paths
46
+ end
41
47
  end
42
48
 
43
49
  def set_all(options)
@@ -117,7 +123,50 @@ module Compass
117
123
  end
118
124
  end
119
125
 
126
+ def add_import_path(*paths)
127
+ # The @added_import_paths variable works around an issue where
128
+ # the additional_import_paths gets overwritten during parse
129
+ @added_import_paths ||= []
130
+ @added_import_paths += paths
131
+ self.additional_import_paths ||= []
132
+ self.additional_import_paths += paths
133
+ end
134
+
135
+ # When called with a block, defines the asset host url to be used.
136
+ # The block must return a string that starts with a protocol (E.g. http).
137
+ # The block will be passed the root-relative url of the asset.
138
+ # When called without a block, returns the block that was previously set.
139
+ def asset_host(&block)
140
+ if block_given?
141
+ @asset_host = block
142
+ else
143
+ @asset_host
144
+ end
145
+ end
146
+
147
+ # When called with a block, defines the cache buster strategy to be used.
148
+ # The block must return nil or a string that can be appended to a url as a query parameter.
149
+ # The returned string must not include the starting '?'.
150
+ # The block will be passed the root-relative url of the asset.
151
+ # If the block accepts two arguments, it will also be passed a File object
152
+ # that points to the asset on disk -- which may or may not exist.
153
+ # When called without a block, returns the block that was previously set.
154
+ def asset_cache_buster(&block)
155
+ if block_given?
156
+ @asset_cache_buster = block
157
+ else
158
+ @asset_cache_buster
159
+ end
160
+ end
161
+
162
+
120
163
  def serialize
164
+ if asset_cache_buster
165
+ raise Compass::Error, "Cannot serialize a configuration with asset_cache_buster set."
166
+ end
167
+ if asset_host
168
+ raise Compass::Error, "Cannot serialize a configuration with asset_host set."
169
+ end
121
170
  contents = ""
122
171
  required_libraries.each do |lib|
123
172
  contents << %Q{require '#{lib}'\n}
@@ -152,17 +201,31 @@ module Compass
152
201
  Compass::Frameworks::ALL.each do |framework|
153
202
  locations[framework.stylesheets_directory] = css_path || css_dir || "."
154
203
  end
204
+ resolve_additional_import_paths.each do |additional_path|
205
+ locations[additional_path] = File.join(css_path || css_dir || ".", File.basename(additional_path))
206
+ end
155
207
  plugin_opts = {:template_location => locations}
156
208
  plugin_opts[:style] = output_style if output_style
157
209
  plugin_opts[:line_comments] = default_line_comments if environment
210
+ plugin_opts.merge!(sass_options || {})
158
211
  plugin_opts
159
212
  end
160
213
 
214
+ def resolve_additional_import_paths
215
+ (additional_import_paths || []).map do |path|
216
+ if project_path && !absolute_path?(path)
217
+ File.join(project_path, path)
218
+ else
219
+ path
220
+ end
221
+ end
222
+ end
223
+
161
224
  def to_sass_engine_options
162
225
  engine_opts = {:load_paths => sass_load_paths}
163
226
  engine_opts[:style] = output_style if output_style
164
227
  engine_opts[:line_comments] = default_line_comments if environment
165
- engine_opts
228
+ engine_opts.merge!(sass_options || {})
166
229
  end
167
230
 
168
231
  def sass_load_paths
@@ -171,6 +234,7 @@ module Compass
171
234
  Compass::Frameworks::ALL.each do |framework|
172
235
  load_paths << framework.stylesheets_directory
173
236
  end
237
+ load_paths += resolve_additional_import_paths
174
238
  load_paths
175
239
  end
176
240
 
@@ -179,6 +243,9 @@ module Compass
179
243
  ATTRIBUTES.each do |attr|
180
244
  send("#{attr}=", nil)
181
245
  end
246
+ @asset_cache_buster = nil
247
+ @asset_host = nil
248
+ @added_import_paths = nil
182
249
  self.required_libraries = []
183
250
  end
184
251
 
@@ -187,6 +254,10 @@ module Compass
187
254
  super
188
255
  end
189
256
 
257
+ def absolute_path?(path)
258
+ # This is only going to work on unix, gonna need a better implementation.
259
+ path.index(File::SEPARATOR) == 0
260
+ end
190
261
  end
191
262
 
192
263
  module ConfigHelpers
@@ -202,9 +273,14 @@ module Compass
202
273
  end
203
274
 
204
275
  def configure_sass_plugin!
276
+ @sass_plugin_configured = true
205
277
  Sass::Plugin.options.merge!(sass_plugin_configuration)
206
278
  end
207
279
 
280
+ def sass_plugin_configured?
281
+ @sass_plugin_configured
282
+ end
283
+
208
284
  def sass_engine_options
209
285
  configuration.to_sass_engine_options
210
286
  end
data/lib/compass/exec.rb CHANGED
@@ -80,14 +80,24 @@ module Compass
80
80
  Usage: compass [options] [project]
81
81
 
82
82
  Description:
83
- When project is given, generates a new project of that name as a subdirectory of
84
- the current directory.
83
+ The compass command line tool will help you create and manage the stylesheets for your project.
85
84
 
86
- If you change any source files, you can update your project using --update.
85
+ To get started on a stand-alone project based on blueprint:
87
86
 
88
- Options:
87
+ compass -f blueprint my_compass_project
88
+
89
+ When you change any sass files, you must recompile your project using --update or --watch.
89
90
  END
90
- opts.on('-u', '--update', :NONE, 'Update the current project') do
91
+ opts.separator ''
92
+ opts.separator 'Mode Options(only specify one):'
93
+
94
+ opts.on('-i', '--install', :NONE, "Create a new compass project.",
95
+ " The default mode when a project is provided.") do
96
+ self.options[:command] = :create_project
97
+ end
98
+
99
+ opts.on('-u', '--update', :NONE, 'Update the current project.',
100
+ ' This is the default when no project is provided.') do
91
101
  self.options[:command] = :update_project
92
102
  end
93
103
 
@@ -96,19 +106,58 @@ END
96
106
  self.options[:quiet] = true
97
107
  end
98
108
 
99
- opts.on('-f FRAMEWORK', '--framework FRAMEWORK', 'Use the specified framework.') do |framework|
100
- self.options[:framework] = framework
101
- end
102
-
103
- opts.on('-p', '--pattern PATTERN', 'Stamp out a pattern into the current project. Must be used in combination with -f.') do |pattern|
109
+ opts.on('-p', '--pattern PATTERN', 'Stamp out a pattern into the current project.',
110
+ ' Must be used with -f.') do |pattern|
104
111
  self.options[:command] = :stamp_pattern
105
112
  self.options[:pattern] = pattern
106
113
  end
107
114
 
108
- opts.on('-n', '--pattern-name NAME', 'The name to use when stamping a pattern. Must be used in combination with -p.') do |name|
115
+ opts.on('--write-configuration', "Write the current configuration to the configuration file.") do
116
+ self.options[:command] = :write_configuration
117
+ end
118
+
119
+ opts.on('--list-frameworks', "List compass frameworks available to use.") do
120
+ self.options[:command] = :list_frameworks
121
+ end
122
+
123
+ opts.on('--validate', :NONE, 'Validate your project\'s compiled css. Requires Java.') do
124
+ self.options[:command] = :validate_project
125
+ end
126
+
127
+ opts.on('--grid-img [DIMENSIONS]', 'Generate a background image to test grid alignment.',
128
+ ' Dimension is given as <column_width>+<gutter_width>.',
129
+ ' Defaults to 30+10.') do |dimensions|
130
+ self.options[:grid_dimensions] = dimensions || "30+10"
131
+ unless self.options[:grid_dimensions] =~ /^\d+\+\d+$/
132
+ puts "Please enter your dimensions as <column_width>+<gutter_width>. E.g. 20+5 or 30+10."
133
+ exit
134
+ end
135
+ self.options[:command] = :generate_grid_background
136
+ end
137
+
138
+ opts.separator ''
139
+ opts.separator 'Install/Pattern Options:'
140
+
141
+ opts.on('-f FRAMEWORK', '--framework FRAMEWORK', 'Use the specified framework. Only one may be specified.') do |framework|
142
+ self.options[:framework] = framework
143
+ end
144
+
145
+ opts.on('-n', '--pattern-name NAME', 'The name to use when stamping a pattern.',
146
+ ' Must be used in combination with -p.') do |name|
109
147
  self.options[:pattern_name] = name
110
148
  end
111
149
 
150
+ opts.on('--rails', "Sets the project type to a rails project.") do
151
+ self.options[:project_type] = :rails
152
+ end
153
+
154
+ opts.separator ''
155
+ opts.separator 'Configuration Options:'
156
+
157
+ opts.on('-c', '--config CONFIG_FILE', 'Specify the location of the configuration file explicitly.') do |configuration_file|
158
+ self.options[:configuration_file] = configuration_file
159
+ end
160
+
112
161
  opts.on('--sass-dir SRC_DIR', "The source directory where you keep your sass stylesheets.") do |sass_dir|
113
162
  self.options[:sass_dir] = sass_dir
114
163
  end
@@ -117,30 +166,33 @@ END
117
166
  self.options[:css_dir] = css_dir
118
167
  end
119
168
 
120
- opts.on('--list-frameworks', "List compass frameworks available to use.") do
121
- self.options[:command] = :list_frameworks
169
+ opts.on('--images-dir IMAGES_DIR', "The directory where you keep your images.") do |images_dir|
170
+ self.options[:images_dir] = images_dir
122
171
  end
123
172
 
124
- opts.on('-c', '--write-configuration', "Write the current configuration to the configuration file.") do
125
- self.options[:command] = :write_configuration
173
+ opts.on('--javascripts-dir JS_DIR', "The directory where you keep your javascripts.") do |javascripts_dir|
174
+ self.options[:javascripts_dir] = javascripts_dir
126
175
  end
127
176
 
128
- opts.on('-e ENV', '--environment ENV', [:development, :production], 'Use sensible defaults for your current environment: development, production (default)') do |env|
177
+ opts.on('-e ENV', '--environment ENV', [:development, :production], 'Use sensible defaults for your current environment.',
178
+ ' One of: development, production (default)') do |env|
129
179
  self.options[:environment] = env
130
180
  end
131
181
 
132
- opts.on('-s STYLE', '--output-style STYLE', [:nested, :expanded, :compact, :compressed], 'Select a CSS output mode (nested, expanded, compact, compressed)') do |style|
182
+ opts.on('-s STYLE', '--output-style STYLE', [:nested, :expanded, :compact, :compressed], 'Select a CSS output mode.',
183
+ ' One of: nested, expanded, compact, compressed') do |style|
133
184
  self.options[:output_style] = style
134
185
  end
135
186
 
136
- opts.on('-r LIBRARY', '--require LIBRARY', "Require LIBRARY before running commands. This is used to access compass plugins.") do |library|
187
+ opts.separator ''
188
+ opts.separator 'General Options:'
189
+
190
+ opts.on('-r LIBRARY', '--require LIBRARY', "Require the given ruby LIBRARY before running commands.",
191
+ " This is used to access compass plugins without having a",
192
+ " project configuration file.") do |library|
137
193
  ::Compass.configuration.require library
138
194
  end
139
195
 
140
- opts.on('--rails', "Sets the project type to a rails project.") do
141
- self.options[:project_type] = :rails
142
- end
143
-
144
196
  opts.on('-q', '--quiet', :NONE, 'Quiet mode.') do
145
197
  self.options[:quiet] = true
146
198
  end
@@ -153,11 +205,13 @@ END
153
205
  self.options[:trace] = true
154
206
  end
155
207
 
156
- opts.on('--force', :NONE, 'Force. Allows some commands to succeed when they would otherwise fail.') do
208
+ opts.on('--force', :NONE, 'Force. Allows some failing commands to succeed instead.') do
157
209
  self.options[:force] = true
158
210
  end
159
211
 
160
- opts.on('--imports', :NONE, 'Emit an import path suitable for use with the Sass command-line tool.') do
212
+ opts.on('--imports', :NONE, 'Emit an imports suitable for passing to the sass command-line.',
213
+ ' Example: sass `compass --imports`',
214
+ ' Note: Compass\'s Sass extensions will not be available.') do
161
215
  print ::Compass::Frameworks::ALL.map{|f| "-I #{f.stylesheets_directory}"}.join(' ')
162
216
  exit
163
217
  end
@@ -167,10 +221,6 @@ END
167
221
  exit
168
222
  end
169
223
 
170
- opts.on('--validate', :NONE, 'Validate your project\'s compiled css. Requires Java.') do
171
- self.options[:command] = :validate_project
172
- end
173
-
174
224
  opts.on_tail("-?", "-h", "--help", "Show this message") do
175
225
  puts opts
176
226
  exit
@@ -180,15 +230,6 @@ END
180
230
  self.options[:command] = :print_version
181
231
  end
182
232
 
183
- opts.on('--grid-img [DIMENSIONS]', 'Generate a background image to test grid alignment. Dimension is given as <column_width>+<gutter_width>. Defaults to 30+10.') do |dimensions|
184
- self.options[:grid_dimensions] = dimensions || "30+10"
185
- unless self.options[:grid_dimensions] =~ /^\d+\+\d+$/
186
- puts "Please enter your dimensions as <column_width>+<gutter_width>. E.g. 20+5 or 30+10."
187
- exit
188
- end
189
- self.options[:command] = :generate_grid_background
190
- end
191
-
192
233
  end
193
234
 
194
235
  def do_command(command)
@@ -127,12 +127,14 @@ module Compass
127
127
  def stylesheet_links
128
128
  html = "<head>\n"
129
129
  manifest.each_stylesheet do |stylesheet|
130
+ # Skip partials.
131
+ next if File.basename(stylesheet.from)[0..0] == "_"
130
132
  media = if stylesheet.options[:media]
131
133
  %Q{ media="#{stylesheet.options[:media]}"}
132
134
  end
133
135
  ss_line = %Q{ <link href="/stylesheets/#{stylesheet.to.sub(/\.sass$/,'.css')}"#{media} rel="stylesheet" type="text/css" />}
134
- if stylesheet.options[:ie]
135
- ss_line = " <!--[if IE]>\n #{ss_line}\n <![endif]-->"
136
+ if stylesheet.options[:condition]
137
+ ss_line = " <!--[if #{stylesheet.options[:condition]}]>\n #{ss_line}\n <![endif]-->"
136
138
  end
137
139
  html << ss_line + "\n"
138
140
  end
@@ -13,8 +13,9 @@ module Compass
13
13
  }
14
14
  end
15
15
 
16
- def write_configuration_files
17
- write_file targetize('config/compass.config'), config_contents
16
+ def write_configuration_files(config_file = nil)
17
+ config_file ||= targetize('config/compass.config')
18
+ write_file config_file, config_contents
18
19
  write_file targetize('config/initializers/compass.rb'), initializer_contents
19
20
  end
20
21
 
@@ -8,8 +8,9 @@ module Compass
8
8
  super
9
9
  end
10
10
 
11
- def write_configuration_files
12
- write_file targetize('config.rb'), config_contents
11
+ def write_configuration_files(config_file = nil)
12
+ config_file ||= targetize('config.rb')
13
+ write_file config_file, config_contents
13
14
  end
14
15
 
15
16
  def config_files_exist?
@@ -0,0 +1,22 @@
1
+ module Compass::SassExtensions::Functions::Display
2
+ DEFAULT_DISPLAY = {
3
+ :block => %w{address blockquote center dir div dd dl dt fieldset form
4
+ frameset h1 h2 h3 h4 h5 h6 hr isindex menu noframes
5
+ noscript ol p pre ul},
6
+ :inline => %w{a abbr acronym b basefont bdo big br cite code dfn em
7
+ font i img input kbd label q s samp select small span
8
+ strike strong sub sup textarea tt u var},
9
+ :table => %w{table},
10
+ :"list-item" => %w{li},
11
+ :"table-row-group" => %w{tbody},
12
+ :"table-header-group" => %w{thead},
13
+ :"table-footer-group" => %w{tfoot},
14
+ :"table-row" => %w{tr},
15
+ :"table-cell" => %w{th td}
16
+ }
17
+
18
+ # returns a comma delimited string for all the elements according to their default css3 display value.
19
+ def elements_of_type(display)
20
+ Sass::Script::String.new(DEFAULT_DISPLAY.fetch(display.value.to_sym).join(", "))
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ module Compass::SassExtensions::Functions::Enumerate
2
+ def enumerate(prefix, from, through)
3
+ selectors = (from.value..through.value).map{|i| "#{prefix.value}-#{i}"}.join(", ")
4
+ Sass::Script::String.new(selectors)
5
+ end
6
+ end
@@ -0,0 +1,88 @@
1
+ module Compass::SassExtensions::Functions::ImageUrl
2
+ def image_url(path)
3
+ path = path.value # get to the string value of the literal.
4
+ # Short curcuit if they have provided an absolute url.
5
+ if absolute_path?(path)
6
+ puts "#{path} is absolute"
7
+ return Sass::Script::String.new("url(#{path})")
8
+ end
9
+
10
+ # Compute the path to the image, either root relative or stylesheet relative
11
+ # or nil if the http_images_path is not set in the configuration.
12
+ http_images_path = if relative?
13
+ compute_relative_path
14
+ else
15
+ Compass.configuration.http_images_path
16
+ end
17
+
18
+ # Compute the real path to the image on the file stystem if the images_dir is set.
19
+ real_path = if Compass.configuration.images_dir
20
+ File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path)
21
+ end
22
+
23
+ # prepend the path to the image if there's one
24
+ if http_images_path
25
+ http_images_path = "#{http_images_path}/" unless http_images_path[-1..-1] == "/"
26
+ path = "#{http_images_path}#{path}"
27
+ end
28
+
29
+ # Compute the asset host unless in relative mode.
30
+ asset_host = (compute_asset_host(path) unless relative?)
31
+
32
+ # Compute and append the cache buster if there is one.
33
+ if buster = compute_cache_buster(path, real_path)
34
+ path += "?#{buster}"
35
+ end
36
+
37
+ # prepend the asset host if there is one.
38
+ path = "#{asset_host}#{'/' unless path[0..0] == "/"}#{path}" if asset_host
39
+
40
+ Sass::Script::String.new("url(#{path})")
41
+ end
42
+
43
+ private
44
+
45
+ def relative?
46
+ Compass.configuration.http_images_path == :relative
47
+ end
48
+
49
+ def absolute_path?(path)
50
+ path[0..0] == "/" || path[0..3] == "http"
51
+ end
52
+
53
+ def compute_relative_path
54
+ if (target_css_file = options[:css_filename])
55
+ images_path = File.join(Compass.configuration.project_path, Compass.configuration.images_dir)
56
+ Pathname.new(images_path).relative_path_from(Pathname.new(File.dirname(target_css_file))).to_s
57
+ end
58
+ end
59
+
60
+ def compute_cache_buster(path, real_path)
61
+ if Compass.configuration.asset_cache_buster
62
+ args = [path]
63
+ if Compass.configuration.asset_cache_buster.arity > 1
64
+ args << (File.new(real_path) if real_path)
65
+ end
66
+ Compass.configuration.asset_cache_buster.call(*args)
67
+ elsif real_path
68
+ default_cache_buster(path, real_path)
69
+ end
70
+ end
71
+
72
+ def default_cache_buster(path, real_path)
73
+ if File.readable?(real_path)
74
+ File.mtime(real_path).strftime("%s")
75
+ else
76
+ $stderr.puts "WARNING: '#{File.basename(path)}' was not found (or cannot be read) in #{File.dirname(real_path)}"
77
+ end
78
+ end
79
+
80
+ def compute_asset_host(path)
81
+ if Compass.configuration.asset_host
82
+ Compass.configuration.asset_host.call(path)
83
+ else
84
+ nil
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,35 @@
1
+ require 'base64'
2
+ module Compass::SassExtensions::Functions::InlineImage
3
+
4
+ def inline_image(path, mime_type = nil)
5
+ path = path.value
6
+ real_path = File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path)
7
+ url = "url('data:#{compute_mime_type(path,mime_type)};base64,#{data(real_path)}')"
8
+ Sass::Script::String.new(url)
9
+ end
10
+
11
+ private
12
+ def compute_mime_type(path, mime_type)
13
+ return mime_type if mime_type
14
+ case path
15
+ when /\.png$/i
16
+ 'image/png'
17
+ when /\.jpe?g$/i
18
+ 'image/jpeg'
19
+ when /\.gif$/i
20
+ 'image/gif'
21
+ when /\.([a-zA-Z]+)$/
22
+ "image/#{Regexp.last_match(1).downcase}"
23
+ else
24
+ raise Compass::Error, "A mime type could not be determined for #{path}, please specify one explicitly."
25
+ end
26
+ end
27
+
28
+ def data(real_path)
29
+ if File.readable?(real_path)
30
+ Base64.encode64(File.read(real_path)).gsub("\n","")
31
+ else
32
+ raise Compass::Error, "File not found or cannot be read: #{real_path}"
33
+ end
34
+ end
35
+ end