chriseppstein-compass 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +143 -0
- data/README.markdown +18 -0
- data/Rakefile +104 -0
- data/VERSION +1 -0
- data/bin/compass +8 -0
- data/compass.gemspec +37 -0
- data/examples/blueprint_default/index.html +73 -0
- data/examples/blueprint_default/parts/elements.html +246 -0
- data/examples/blueprint_default/parts/forms.html +100 -0
- data/examples/blueprint_default/parts/grid.html +206 -0
- data/examples/blueprint_default/parts/test-small.jpg +0 -0
- data/examples/blueprint_default/parts/test.jpg +0 -0
- data/examples/blueprint_default/parts/valid.png +0 -0
- data/examples/blueprint_default/stylesheets/ie.sass +4 -0
- data/examples/blueprint_default/stylesheets/images/grid.png +0 -0
- data/examples/blueprint_default/stylesheets/print.sass +4 -0
- data/examples/blueprint_default/stylesheets/screen.sass +9 -0
- data/examples/blueprint_plugins/index.html +60 -0
- data/examples/blueprint_plugins/parts/fancy_type.html +84 -0
- data/examples/blueprint_plugins/parts/test-small.jpg +0 -0
- data/examples/blueprint_plugins/parts/test.jpg +0 -0
- data/examples/blueprint_plugins/parts/valid.png +0 -0
- data/examples/blueprint_plugins/stylesheets/ie.sass +4 -0
- data/examples/blueprint_plugins/stylesheets/images/grid.png +0 -0
- data/examples/blueprint_plugins/stylesheets/print.sass +4 -0
- data/examples/blueprint_plugins/stylesheets/screen.sass +11 -0
- data/examples/blueprint_scoped/stylesheets/ie.sass +4 -0
- data/examples/blueprint_scoped/stylesheets/print.sass +4 -0
- data/examples/blueprint_scoped/stylesheets/screen.sass +5 -0
- data/examples/blueprint_scoped_form/stylesheets/ie.sass +4 -0
- data/examples/blueprint_scoped_form/stylesheets/print.sass +4 -0
- data/examples/blueprint_scoped_form/stylesheets/screen.sass +9 -0
- data/examples/blueprint_semantic/index.html +68 -0
- data/examples/blueprint_semantic/parts/fancy_type.html +84 -0
- data/examples/blueprint_semantic/parts/liquid.html +84 -0
- data/examples/blueprint_semantic/parts/test-small.jpg +0 -0
- data/examples/blueprint_semantic/parts/test.jpg +0 -0
- data/examples/blueprint_semantic/parts/valid.png +0 -0
- data/examples/blueprint_semantic/stylesheets/ie.sass +4 -0
- data/examples/blueprint_semantic/stylesheets/images/grid.png +0 -0
- data/examples/blueprint_semantic/stylesheets/liquid.sass +70 -0
- data/examples/blueprint_semantic/stylesheets/print.sass +4 -0
- data/examples/blueprint_semantic/stylesheets/screen.sass +69 -0
- data/examples/compass/compass.html +19 -0
- data/examples/compass/stylesheets/compass.sass +47 -0
- data/examples/compass/stylesheets/images/blue_arrow.gif +0 -0
- data/examples/compass/stylesheets/utilities.sass +65 -0
- data/examples/compass/utilities.html.haml +136 -0
- data/examples/yui/divisions.html.haml +179 -0
- data/examples/yui/index.html.haml +19 -0
- data/examples/yui/stylesheets/screen.sass +13 -0
- data/examples/yui/sub_divisions.html.haml +169 -0
- data/examples/yui/templates.html.haml +54 -0
- data/examples/yui/test.jpg +0 -0
- data/examples/yui/typography.html.haml +132 -0
- data/frameworks/blueprint/lib/blueprint/constants.rb +17 -0
- data/frameworks/blueprint/lib/blueprint/grid_builder.rb +54 -0
- data/frameworks/blueprint/stylesheets/blueprint/_ie.sass +19 -0
- data/frameworks/blueprint/stylesheets/blueprint/_print.sass +69 -0
- data/frameworks/blueprint/stylesheets/blueprint/_screen.sass +15 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_colors.sass +25 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_debug.sass +9 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass +85 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_form.sass +43 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass +140 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_interaction.sass +55 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_liquid.sass +140 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_scaffolding.sass +29 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass +131 -0
- data/frameworks/blueprint/stylesheets/blueprint/modules/_utilities.sass +39 -0
- data/frameworks/blueprint/templates/project/grid.png +0 -0
- data/frameworks/blueprint/templates/project/ie.sass +4 -0
- data/frameworks/blueprint/templates/project/print.sass +4 -0
- data/frameworks/blueprint/templates/project/screen.sass +9 -0
- data/frameworks/compass/stylesheets/compass/_reset.sass +19 -0
- data/frameworks/compass/stylesheets/compass/_utilities.sass +5 -0
- data/frameworks/compass/stylesheets/compass/utilities/_general.sass +4 -0
- data/frameworks/compass/stylesheets/compass/utilities/_links.sass +3 -0
- data/frameworks/compass/stylesheets/compass/utilities/_lists.sass +3 -0
- data/frameworks/compass/stylesheets/compass/utilities/_tables.sass +1 -0
- data/frameworks/compass/stylesheets/compass/utilities/_text.sass +2 -0
- data/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.sass +11 -0
- data/frameworks/compass/stylesheets/compass/utilities/general/_inline_block.sass +6 -0
- data/frameworks/compass/stylesheets/compass/utilities/general/_reset.sass +32 -0
- data/frameworks/compass/stylesheets/compass/utilities/general/_tabs.sass +0 -0
- data/frameworks/compass/stylesheets/compass/utilities/general/_tag_cloud.sass +19 -0
- data/frameworks/compass/stylesheets/compass/utilities/links/_hover_link.sass +5 -0
- data/frameworks/compass/stylesheets/compass/utilities/links/_link_colors.sass +24 -0
- data/frameworks/compass/stylesheets/compass/utilities/links/_unstyled_link.sass +5 -0
- data/frameworks/compass/stylesheets/compass/utilities/lists/_bullets.sass +21 -0
- data/frameworks/compass/stylesheets/compass/utilities/lists/_horizontal_list.sass +20 -0
- data/frameworks/compass/stylesheets/compass/utilities/lists/_inline_list.sass +29 -0
- data/frameworks/compass/stylesheets/compass/utilities/tables/_alternating_rows_and_columns.sass +25 -0
- data/frameworks/compass/stylesheets/compass/utilities/text/_nowrap.sass +3 -0
- data/frameworks/compass/stylesheets/compass/utilities/text/_replacement.sass +10 -0
- data/frameworks/compass/templates/project/grid.png +0 -0
- data/frameworks/compass/templates/project/ie.sass +3 -0
- data/frameworks/compass/templates/project/print.sass +4 -0
- data/frameworks/compass/templates/project/screen.sass +4 -0
- data/frameworks/yui/COPYRIGHT +15 -0
- data/frameworks/yui/stylesheets/yui/_screen.sass +7 -0
- data/frameworks/yui/stylesheets/yui/modules/_base.sass +60 -0
- data/frameworks/yui/stylesheets/yui/modules/_fonts.sass +38 -0
- data/frameworks/yui/stylesheets/yui/modules/_grids.sass +341 -0
- data/frameworks/yui/templates/project/screen.sass +5 -0
- data/lib/compass.rb +19 -0
- data/lib/compass/commands/base.rb +94 -0
- data/lib/compass/commands/create_project.rb +30 -0
- data/lib/compass/commands/install_rails.rb +115 -0
- data/lib/compass/commands/print_version.rb +23 -0
- data/lib/compass/commands/update_project.rb +91 -0
- data/lib/compass/commands/watch_project.rb +42 -0
- data/lib/compass/core_ext.rb +39 -0
- data/lib/compass/exec.rb +156 -0
- data/lib/compass/frameworks.rb +27 -0
- data/lib/compass/frameworks/blueprint.rb +2 -0
- data/lib/compass/frameworks/compass.rb +2 -0
- data/lib/compass/frameworks/yui.rb +2 -0
- data/lib/compass/merb.rb +43 -0
- data/lib/compass/test_case.rb +37 -0
- data/lib/compass/validate.rb +13 -0
- data/lib/compass/validate/COPYRIGHT.html +93 -0
- data/lib/compass/validate/JIGSAW_COPYRIGHT +64 -0
- data/lib/compass/validate/README.html +83 -0
- data/lib/compass/validate/XERCES_COPYING.txt +56 -0
- data/lib/compass/validate/css-validator-javadoc.jar +0 -0
- data/lib/compass/validate/css-validator.jar +0 -0
- data/lib/compass/validate/jigsaw.jar +0 -0
- data/lib/compass/validate/xerces.jar +0 -0
- data/lib/compass/validator.rb +59 -0
- data/lib/compass/version.rb +48 -0
- data/lib/sass_extensions.rb +13 -0
- data/test/compass_test.rb +142 -0
- data/test/fixtures/stylesheets/default/sass/ie.sass +4 -0
- data/test/fixtures/stylesheets/default/sass/print.sass +4 -0
- data/test/fixtures/stylesheets/default/sass/screen.sass +18 -0
- data/test/fixtures/stylesheets/yui/css/mixins.css +16 -0
- data/test/fixtures/stylesheets/yui/sass/base.sass +3 -0
- data/test/fixtures/stylesheets/yui/sass/fonts.sass +3 -0
- data/test/fixtures/stylesheets/yui/sass/grids.sass +3 -0
- data/test/fixtures/stylesheets/yui/sass/mixins.sass +16 -0
- data/test/sass_extensions_test.rb +26 -0
- data/test/test_helper.rb +37 -0
- metadata +247 -0
data/lib/compass.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'sass'
|
2
|
+
require File.join(File.dirname(__FILE__), 'sass_extensions')
|
3
|
+
|
4
|
+
['core_ext', 'version'].each do |file|
|
5
|
+
require File.join(File.dirname(__FILE__), 'compass', file)
|
6
|
+
end
|
7
|
+
|
8
|
+
module Compass
|
9
|
+
extend Compass::Version
|
10
|
+
def base_directory
|
11
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
12
|
+
end
|
13
|
+
module_function :base_directory
|
14
|
+
end
|
15
|
+
|
16
|
+
require File.join(File.dirname(__FILE__), 'compass', 'frameworks')
|
17
|
+
# make sure we're running inside Merb
|
18
|
+
require File.join(File.dirname(__FILE__), 'compass', 'merb') if defined?(Merb::Plugins)
|
19
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Compass
|
2
|
+
module Commands
|
3
|
+
class Base
|
4
|
+
attr_accessor :working_directory, :options
|
5
|
+
def initialize(working_directory, options)
|
6
|
+
self.working_directory = working_directory
|
7
|
+
self.options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def perform
|
11
|
+
raise StandardError.new("Not Implemented")
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def projectize(path)
|
17
|
+
File.join(project_directory, separate(path))
|
18
|
+
end
|
19
|
+
# create a directory and all the directories necessary to reach it.
|
20
|
+
def directory(subdir, options = nil)
|
21
|
+
options ||= self.options
|
22
|
+
dir = subdir ? projectize(subdir) : project_directory
|
23
|
+
if File.exists?(dir) && File.directory?(dir) && options[:force]
|
24
|
+
print_action :exists, basename(dir) + File::SEPARATOR
|
25
|
+
elsif File.exists?(dir) && File.directory?(dir)
|
26
|
+
msg = "Directory #{basename(dir)} already exists. Run with --force to force project creation."
|
27
|
+
raise ::Compass::Exec::ExecError.new(msg)
|
28
|
+
elsif File.exists?(dir)
|
29
|
+
msg = "#{basename(dir)} already exists and is not a directory."
|
30
|
+
raise ::Compass::Exec::ExecError.new(msg)
|
31
|
+
else
|
32
|
+
print_action :directory, basename(dir) + File::SEPARATOR
|
33
|
+
FileUtils.mkdir_p(dir) unless options[:dry_run]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# copy/process a template in the compass template directory to the project directory.
|
38
|
+
def template(from, to, options)
|
39
|
+
to = projectize(to)
|
40
|
+
from = File.join(templates_directory, separate(from))
|
41
|
+
if File.exists?(to) && !options[:force]
|
42
|
+
#TODO: Detect differences & provide an overwrite prompt
|
43
|
+
msg = "#{basename(to)} already exists."
|
44
|
+
raise ::Compass::Exec::ExecError.new(msg)
|
45
|
+
elsif File.exists?(to)
|
46
|
+
print_action :remove, basename(to)
|
47
|
+
FileUtils.rm to unless options[:dry_run]
|
48
|
+
end
|
49
|
+
print_action :create, basename(to)
|
50
|
+
FileUtils.cp from, to unless options[:dry_run]
|
51
|
+
end
|
52
|
+
|
53
|
+
def write_file(file_name, contents)
|
54
|
+
if File.exists?(file_name) && !options[:force]
|
55
|
+
msg = "File #{basename(file_name)} already exists. Run with --force to force creation."
|
56
|
+
raise ::Compass::Exec::ExecError.new(msg)
|
57
|
+
end
|
58
|
+
if File.exists?(file_name)
|
59
|
+
print_action :overwrite, basename(file_name)
|
60
|
+
else
|
61
|
+
print_action :create, basename(file_name)
|
62
|
+
end
|
63
|
+
output = open(file_name,'w')
|
64
|
+
output.write(contents)
|
65
|
+
output.close
|
66
|
+
end
|
67
|
+
|
68
|
+
# returns the path to the templates directory and caches it
|
69
|
+
def templates_directory
|
70
|
+
@templates_directory ||= File.expand_path(File.join(File.dirname(__FILE__), separate("../../../frameworks/#{options[:framework]}/templates")))
|
71
|
+
end
|
72
|
+
|
73
|
+
# Write paths like we're on unix and then fix it
|
74
|
+
def separate(path)
|
75
|
+
path.gsub(%r{/}, File::SEPARATOR)
|
76
|
+
end
|
77
|
+
|
78
|
+
def basename(file, extra = 0)
|
79
|
+
if file.length > (working_directory.length + extra)
|
80
|
+
file[(working_directory.length + extra + 1)..-1]
|
81
|
+
else
|
82
|
+
File.basename(file)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
ACTIONS = [:directory, :exists, :remove, :create, :overwrite]
|
87
|
+
MAX_ACTION_LENGTH = ACTIONS.inject(0){|memo, a| [memo, a.to_s.length].max}
|
88
|
+
def print_action(action, extra)
|
89
|
+
puts "#{' ' * (MAX_ACTION_LENGTH - action.to_s.length)}#{action} #{extra}" if !options[:quiet] || options[:dry_run]
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require File.join(File.dirname(__FILE__), 'base')
|
3
|
+
require File.join(File.dirname(__FILE__), 'update_project')
|
4
|
+
|
5
|
+
module Compass
|
6
|
+
module Commands
|
7
|
+
class CreateProject < Base
|
8
|
+
|
9
|
+
attr_accessor :project_directory, :project_name
|
10
|
+
|
11
|
+
def initialize(working_directory, options)
|
12
|
+
super(working_directory, options)
|
13
|
+
self.project_name = options[:project_name]
|
14
|
+
self.project_directory = File.expand_path File.join(working_directory, project_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
# all commands must implement perform
|
18
|
+
def perform
|
19
|
+
directory nil, options
|
20
|
+
directory 'stylesheets', options.merge(:force => true)
|
21
|
+
directory 'src', options.merge(:force => true)
|
22
|
+
template 'project/screen.sass', 'src/screen.sass', options
|
23
|
+
template 'project/print.sass', 'src/print.sass', options
|
24
|
+
template 'project/ie.sass', 'src/ie.sass', options
|
25
|
+
UpdateProject.new(working_directory, options).perform
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'base')
|
2
|
+
|
3
|
+
module Compass
|
4
|
+
module Commands
|
5
|
+
class InstallRails < Base
|
6
|
+
def initialize(working_directory, options)
|
7
|
+
super(working_directory, options)
|
8
|
+
end
|
9
|
+
def perform
|
10
|
+
set_install_location
|
11
|
+
set_output_location
|
12
|
+
directory options[:stylesheets_location]
|
13
|
+
template 'project/screen.sass', "#{options[:stylesheets_location]}/screen.sass", options
|
14
|
+
template 'project/print.sass', "#{options[:stylesheets_location]}/print.sass", options
|
15
|
+
template 'project/ie.sass', "#{options[:stylesheets_location]}/ie.sass", options
|
16
|
+
write_file projectize('config/initializers/compass.rb'), initializer_contents
|
17
|
+
if has_application_layout?
|
18
|
+
next_steps
|
19
|
+
else
|
20
|
+
write_file projectize('app/views/layouts/application.html.haml'), application_layout_contents
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def initializer
|
25
|
+
init_file =
|
26
|
+
if File.exists?(init_file) && !options[:force]
|
27
|
+
msg = "File #{basename(init_file)} already exists. Run with --force to force project creation."
|
28
|
+
raise ::Compass::Exec::ExecError.new(msg)
|
29
|
+
end
|
30
|
+
if File.exists?(init_file)
|
31
|
+
print_action :overwrite, basename(init_file)
|
32
|
+
else
|
33
|
+
print_action :create, basename(init_file)
|
34
|
+
end
|
35
|
+
output = open(init_file,'w')
|
36
|
+
output.write(initializer_contents)
|
37
|
+
output.close
|
38
|
+
end
|
39
|
+
|
40
|
+
def initializer_contents
|
41
|
+
%Q{require 'compass'
|
42
|
+
# If you have any compass plugins, require them here.
|
43
|
+
Sass::Plugin.options[:template_location] = {
|
44
|
+
"\#{RAILS_ROOT}#{File::SEPARATOR}#{options[:stylesheets_location]}" => "\#{RAILS_ROOT}#{File::SEPARATOR}#{options[:css_location]}"
|
45
|
+
}
|
46
|
+
Compass::Frameworks::ALL.each do |framework|
|
47
|
+
Sass::Plugin.options[:template_location][framework.stylesheets_directory] = "\#{RAILS_ROOT}#{File::SEPARATOR}#{options[:css_location]}"
|
48
|
+
end
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def application_layout_contents
|
53
|
+
%Q{!!! XML
|
54
|
+
!!!
|
55
|
+
%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
|
56
|
+
%head
|
57
|
+
%meta{'http-equiv' => "content-type", :content => "text/html;charset=UTF-8"}
|
58
|
+
%title= @browser_title || 'Default Browser Title'
|
59
|
+
= stylesheet_link_tag '#{stylesheet_prefix}screen.css', :media => 'screen, projection'
|
60
|
+
= stylesheet_link_tag '#{stylesheet_prefix}print.css', :media => 'print'
|
61
|
+
/[if IE]
|
62
|
+
= stylesheet_link_tag '#{stylesheet_prefix}ie.css', :media => 'screen, projection'
|
63
|
+
%body
|
64
|
+
%h1 Welcome to Compass
|
65
|
+
= yield
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def next_steps
|
70
|
+
puts <<NEXTSTEPS
|
71
|
+
|
72
|
+
Congratulations! Your project has been configured to use Compass.
|
73
|
+
Next add these lines to the head of your application.html.haml:
|
74
|
+
|
75
|
+
%head
|
76
|
+
= stylesheet_link_tag '#{stylesheet_prefix}screen.css', :media => 'screen, projection'
|
77
|
+
= stylesheet_link_tag '#{stylesheet_prefix}print.css', :media => 'print'
|
78
|
+
/[if IE]
|
79
|
+
= stylesheet_link_tag '#{stylesheet_prefix}ie.css', :media => 'screen, projection'
|
80
|
+
|
81
|
+
(you are using haml, aren't you?)
|
82
|
+
NEXTSTEPS
|
83
|
+
end
|
84
|
+
|
85
|
+
def has_application_layout?
|
86
|
+
File.exists?(projectize('app/views/layouts/application.rhtml')) ||
|
87
|
+
File.exists?(projectize('app/views/layouts/application.html.erb')) ||
|
88
|
+
File.exists?(projectize('app/views/layouts/application.html.haml'))
|
89
|
+
end
|
90
|
+
|
91
|
+
def stylesheet_prefix
|
92
|
+
if options[:css_location].length >= 19
|
93
|
+
"#{options[:css_location][19..-1]}/"
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def project_directory
|
100
|
+
working_directory
|
101
|
+
end
|
102
|
+
|
103
|
+
def set_install_location
|
104
|
+
print "Compass recommends that you keep your stylesheets in app/stylesheets/ instead of the Sass default location of public/stylesheets/sass/.\nIs this OK? (Y/n) "
|
105
|
+
answer = gets
|
106
|
+
self.options[:stylesheets_location] = separate(answer.downcase[0] == ?n ? 'public/stylesheets/sass' : 'app/stylesheets')
|
107
|
+
end
|
108
|
+
def set_output_location
|
109
|
+
print "\nCompass recommends that you keep your compiled css in public/stylesheets/compiled/ instead the Sass default of public/stylesheets/.\nHowever, if you're exclusively using Sass, then public/stylesheets/ is recommended.\nEmit compiled stylesheets to public/stylesheets/compiled? (Y/n) "
|
110
|
+
answer = gets
|
111
|
+
self.options[:css_location] = separate(answer.downcase[0] == ?n ? 'public/stylesheets' : 'public/stylesheets/compiled')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Compass
|
2
|
+
module Commands
|
3
|
+
class PrintVersion
|
4
|
+
attr_accessor :options
|
5
|
+
def initialize(working_directory, options)
|
6
|
+
self.options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform
|
10
|
+
if options[:quiet]
|
11
|
+
# The quiet option may make scripting easier
|
12
|
+
puts ::Compass.version[:string]
|
13
|
+
else
|
14
|
+
lines = []
|
15
|
+
lines << "Compass #{::Compass.version[:string]}"
|
16
|
+
lines << "Copyright (c) 2008 Chris Eppstein"
|
17
|
+
lines << "Released under the MIT License."
|
18
|
+
puts lines.join("\n")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sass'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'pathname'
|
5
|
+
require File.join(File.dirname(__FILE__), 'base')
|
6
|
+
|
7
|
+
module Compass
|
8
|
+
module Commands
|
9
|
+
class UpdateProject < Base
|
10
|
+
|
11
|
+
Base::ACTIONS << :compile
|
12
|
+
Base::ACTIONS << :overwrite
|
13
|
+
|
14
|
+
attr_accessor :project_directory, :project_name, :options
|
15
|
+
|
16
|
+
def initialize(working_directory, options = {})
|
17
|
+
super(working_directory, options)
|
18
|
+
if options[:project_name]
|
19
|
+
options[:project_name] = options[:project_name][0..-2] if options[:project_name][-1..-1] == File::SEPARATOR
|
20
|
+
self.project_name = File.basename(options[:project_name])
|
21
|
+
if options[:project_name][0] == File::SEPARATOR
|
22
|
+
self.project_directory = options[:project_name]
|
23
|
+
elsif File.directory?(File.join(working_directory, options[:project_name]))
|
24
|
+
self.project_directory = File.expand_path(File.join(working_directory, options[:project_name]))
|
25
|
+
else
|
26
|
+
if File.exists?(options[:project_name]) or File.exists?(File.join(working_directory, options[:project_name]))
|
27
|
+
raise ::Compass::Exec::ExecError.new("#{options[:project_name]} is not a directory.")
|
28
|
+
elsif !(options[:force] || options[:dry_run])
|
29
|
+
raise ::Compass::Exec::ExecError.new("#{options[:project_name]} does not exist.")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
else
|
33
|
+
self.project_name = File.basename(working_directory)
|
34
|
+
self.project_directory = working_directory
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def perform
|
39
|
+
Dir.glob(separate("#{project_directory}/src/**/[^_]*.sass")).each do |sass_file|
|
40
|
+
stylesheet_name = sass_file[("#{project_directory}/src/".length)..-6]
|
41
|
+
compile "src/#{stylesheet_name}.sass", "stylesheets/#{stylesheet_name}.css", options
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Compile one Sass file
|
46
|
+
def compile(sass_filename, css_filename, options)
|
47
|
+
sass_filename = projectize(sass_filename)
|
48
|
+
css_filename = projectize(css_filename)
|
49
|
+
if !File.directory?(File.dirname(css_filename))
|
50
|
+
directory basename(File.dirname(css_filename)), options.merge(:force => true) unless options[:dry_run]
|
51
|
+
end
|
52
|
+
print_action :compile, basename(sass_filename)
|
53
|
+
if File.exists?(css_filename)
|
54
|
+
print_action :overwrite, basename(css_filename)
|
55
|
+
else
|
56
|
+
print_action :create, basename(css_filename)
|
57
|
+
end
|
58
|
+
unless options[:dry_run]
|
59
|
+
engine = ::Sass::Engine.new(open(sass_filename).read,
|
60
|
+
:filename => sass_filename,
|
61
|
+
:line_comments => options[:environment] == :development,
|
62
|
+
:style => output_style,
|
63
|
+
:css_filename => css_filename,
|
64
|
+
:load_paths => sass_load_paths)
|
65
|
+
output = open(css_filename,'w')
|
66
|
+
output.write(engine.render)
|
67
|
+
output.close
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def output_style
|
72
|
+
@output_style ||= options[:style] || if options[:environment] == :development
|
73
|
+
:expanded
|
74
|
+
else
|
75
|
+
:compact
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# where to load sass files from
|
80
|
+
def sass_load_paths
|
81
|
+
@sass_load_paths ||= [project_src_directory] + Compass::Frameworks::ALL.map{|f| f.stylesheets_directory}
|
82
|
+
end
|
83
|
+
|
84
|
+
# The directory where the project source files are located.
|
85
|
+
def project_src_directory
|
86
|
+
@project_src_directory ||= separate("#{project_directory}/src")
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sass'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'pathname'
|
5
|
+
require File.join(File.dirname(__FILE__), 'base')
|
6
|
+
require File.join(File.dirname(__FILE__), 'update_project')
|
7
|
+
|
8
|
+
module Compass
|
9
|
+
module Commands
|
10
|
+
class WatchProject < UpdateProject
|
11
|
+
attr_accessor :last_update_time
|
12
|
+
def perform
|
13
|
+
super
|
14
|
+
self.last_update_time = most_recent_update_time
|
15
|
+
loop do
|
16
|
+
# TODO: Make this efficient by using filesystem monitoring.
|
17
|
+
sleep 1
|
18
|
+
file, t = should_update?
|
19
|
+
if t
|
20
|
+
begin
|
21
|
+
puts ">>> Change detected to #{file} <<<"
|
22
|
+
super
|
23
|
+
rescue StandardError => e
|
24
|
+
::Compass::Exec.report_error(e, options)
|
25
|
+
end
|
26
|
+
self.last_update_time = t
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def most_recent_update_time
|
31
|
+
Dir.glob(separate("#{project_directory}/src/**/*.sass")).map {|sass_file| File.stat(sass_file).mtime}.max
|
32
|
+
end
|
33
|
+
def should_update?
|
34
|
+
t = most_recent_update_time
|
35
|
+
if t > last_update_time
|
36
|
+
file = Dir.glob(separate("#{project_directory}/src/**/*.sass")).detect {|sass_file| File.stat(sass_file).mtime >= t}
|
37
|
+
[file, t]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class String
|
2
|
+
# see if string has any content
|
3
|
+
def blank?; self.length.zero?; end
|
4
|
+
|
5
|
+
# strip space after :, remove newlines, replace multiple spaces with only one space, remove comments
|
6
|
+
def strip_space!
|
7
|
+
replace self.gsub(/:\s*/, ':').gsub(/\n/, '').gsub(/\s+/, ' ').gsub(/(\/\*).*?(\*\/)/, '')
|
8
|
+
end
|
9
|
+
|
10
|
+
# remove newlines, insert space after comma, replace two spaces with one space after comma
|
11
|
+
def strip_selector_space!
|
12
|
+
replace self.gsub(/(\n)/, '').gsub(',', ', ').gsub(', ', ', ')
|
13
|
+
end
|
14
|
+
|
15
|
+
# remove leading whitespace, remove end whitespace
|
16
|
+
def strip_side_space!
|
17
|
+
replace self.gsub(/^\s+/, '').gsub(/\s+$/, $/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class NilClass
|
22
|
+
def blank?
|
23
|
+
true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class File
|
28
|
+
# string output from file
|
29
|
+
def self.path_to_string(path)
|
30
|
+
File.new(path).read
|
31
|
+
end
|
32
|
+
|
33
|
+
# saves a string to a specified file path
|
34
|
+
def self.string_to_file(string, path)
|
35
|
+
directory = File.dirname(path)
|
36
|
+
FileUtils.mkdir_p directory unless File.directory?(directory)
|
37
|
+
File.open(path, 'w') { |f| f << string }
|
38
|
+
end
|
39
|
+
end
|