gridpaper 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/.gitignore +10 -0
  2. data/Gemfile +4 -0
  3. data/Guardfile +33 -0
  4. data/README.rdoc +74 -0
  5. data/Rakefile +10 -0
  6. data/bin/gridpaper +62 -0
  7. data/examples/images/Untitled-1.png +0 -0
  8. data/examples/images/grid.png +0 -0
  9. data/examples/index.html +124 -0
  10. data/examples/stylesheets/sass/_columns.sass +51 -0
  11. data/examples/stylesheets/sass/_settings.sass +7 -0
  12. data/examples/stylesheets/sass/styles.sass +38 -0
  13. data/examples/stylesheets/scss/nested_folder/_imported_file.scss +3 -0
  14. data/examples/stylesheets/scss/nested_folder/generated.scss +0 -0
  15. data/examples/stylesheets/scss/something.scss +1 -0
  16. data/gridpaper.gemspec +26 -0
  17. data/lib/Guardfile +147 -0
  18. data/lib/gridpaper.rb +95 -0
  19. data/lib/gridpaper/version.rb +3 -0
  20. data/lib/guard/gridpaper-watch.rb +129 -0
  21. data/templates/examples/_columns.sass +46 -0
  22. data/templates/sass/_settings.sass +7 -0
  23. data/templates/sass/gridpaper/_all.sass +1 -0
  24. data/templates/sass/gridpaper/_effects.sass +31 -0
  25. data/templates/sass/gridpaper/_forms.sass +27 -0
  26. data/templates/sass/gridpaper/_grid.sass +59 -0
  27. data/templates/sass/gridpaper/_reset.sass +102 -0
  28. data/templates/sass/gridpaper/_utilities.sass +6 -0
  29. data/templates/sass/styles.sass +2 -0
  30. data/templates/scss/_settings.scss +7 -0
  31. data/templates/scss/gridpaper/_all.scss +7 -0
  32. data/templates/scss/gridpaper/_effects.scss +31 -0
  33. data/templates/scss/gridpaper/_forms.scss +19 -0
  34. data/templates/scss/gridpaper/_grid.scss +57 -0
  35. data/templates/scss/gridpaper/_reset.scss +106 -0
  36. data/templates/scss/styles.scss +2 -0
  37. metadata +137 -0
@@ -0,0 +1,147 @@
1
+ require 'gridpaper'
2
+ require 'colorize'
3
+ require 'guard/guard'
4
+ require 'sass'
5
+
6
+ module ::Guard
7
+ class GridpaperSass < ::Guard::Guard
8
+
9
+ DEFAULTS = {
10
+ :output => 'css', # Output directory
11
+ :notification => true, # Enable notifications?
12
+ :shallow => false, # Output nested directories?
13
+ :style => :nested, # Nested output
14
+ :debug_info => false, # File and line number info for FireSass
15
+ :noop => false, # Do no write output file
16
+ :hide_success => false, # Do not show success message
17
+ :load_paths => Dir.glob('**/**').find_all {|i| File.directory?(i) }
18
+ }
19
+
20
+ def initialize(watchers = [], options = {})
21
+ if options[:input]
22
+ options[:output] = options[:input] unless options.has_key?(:output)
23
+ watchers << ::Guard::Watcher.new(%r{^#{options.delete(:input)}/(.+\.s[ac]ss)$})
24
+ end
25
+
26
+ super(watchers, DEFAULTS.merge(options))
27
+ end
28
+
29
+
30
+ # Builds the sass or scss. Determines engine to use by extension
31
+ # of path given.
32
+ #
33
+ # @param file [String] path to file to build
34
+ # @return [String] the output css
35
+ #
36
+ def build_sass(file)
37
+ content = File.new(file).read
38
+ # sass or scss?
39
+ type = file[-4..-1].to_sym
40
+ sass_options = {
41
+ :syntax => type,
42
+ :load_paths => options[:load_paths],
43
+ :style => options[:style].to_sym,
44
+ :debug_info => options[:debug_info],
45
+ }
46
+
47
+ ::Sass::Engine.new(content, sass_options).render
48
+ end
49
+
50
+ # Get the file path to output the css based on the file being
51
+ # built.
52
+ #
53
+ # @param file [String] path to file being built
54
+ # @return [String] path to file where output should be written
55
+ #
56
+ def get_output(file)
57
+ folder = File.join ::Guard.listener.directory, options[:output]
58
+
59
+ unless options[:shallow]
60
+ watchers.product([file]).each do |watcher, file|
61
+ if matches = file.match(watcher.pattern)
62
+ if matches[1]
63
+ folder = File.join(::Guard.listener.directory, options[:output], File.dirname(matches[1])).gsub(/\/\.$/, '')
64
+ break
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ FileUtils.mkdir_p folder
71
+ r = File.join folder, File.basename(file).split('.')[0]
72
+ r << '.css'
73
+ end
74
+
75
+ def ignored?(path)
76
+ File.basename(path)[0,1] == "_"
77
+ end
78
+
79
+ # ================
80
+ # = Guard method =
81
+ # ================
82
+
83
+ # Build all files being watched
84
+ def run_all
85
+ run_on_change(Watcher.match_files(self, Dir.glob(File.join('**', '[^_]*.*'))))
86
+ end
87
+
88
+ # Build the files given
89
+ def run_on_change(paths)
90
+ partials = paths.select { |f| ignored?(f) }
91
+ return run_all unless partials.empty?
92
+
93
+ changed_files = paths.reject{ |f| ignored?(f) }.map do |file|
94
+ css_file = get_output(file)
95
+ begin
96
+ contents = build_sass(file)
97
+ if contents
98
+ message = options[:noop] ? "verified #{file}" : "rebuilt #{file}"
99
+
100
+ File.open(css_file, 'w') {|f| f.write(contents) } unless options[:noop]
101
+ ::Guard::UI.info "-> #{message}", :reset => true
102
+ if options[:notification] && !options[:hide_success]
103
+ ::Guard::Notifier.notify(message, :title => "Guard::Sass", :image => :success)
104
+ end
105
+ end
106
+ css_file
107
+ rescue ::Sass::SyntaxError => e
108
+ ::Guard::UI.error "Sass > #{e.sass_backtrace_str(file)}"
109
+ ::Guard::Notifier.notify(
110
+ (options[:noop] ? 'validation' : 'rebuild') + " failed > #{e.sass_backtrace_str(file)}",
111
+ :title => "Guard::Sass",
112
+ :image => :error
113
+ ) if options[:notification]
114
+ nil
115
+ end
116
+ end.compact
117
+ notify changed_files
118
+ end
119
+
120
+ def notify(changed_files)
121
+ ::Guard.guards.reject{ |guard| guard == self }.each do |guard|
122
+ paths = Watcher.match_files(guard, changed_files)
123
+ guard.run_on_change paths unless paths.empty?
124
+ end
125
+ end
126
+
127
+ end
128
+ end
129
+
130
+
131
+
132
+ # input = File.join(Gridpaper::Watch::DIR, 'stylesheets')
133
+ # output = File.join(Gridpaper::Watch::DIR, 'stylesheets')
134
+ puts "#{ Gridpaper::Watch.input_path } => #{ Gridpaper::Watch.output_path }".light_red
135
+
136
+ guard 'gridpaper-sass', :input => Gridpaper::Watch.input_path, :output => Gridpaper::Watch.output_path do
137
+ # watch %r{^(s[ac]ss)/(.+\.s[ac]ss)$}
138
+ watch %r{^(.+\.s[ac]ss)$}
139
+ end
140
+
141
+ # guard 'sass',
142
+ # :input => Gridpaper::Watch.input_path,
143
+ # :output => Gridpaper::Watch.output_path,
144
+ # :style => :compact,
145
+ # :debug_info_ => true do
146
+ # watch %r{^(.+\.s[ac]ss)$}
147
+ # end
@@ -0,0 +1,95 @@
1
+ require 'rubygems'
2
+ require 'gridpaper/version'
3
+ require 'commander/import'
4
+ require 'fileutils'
5
+ require 'yaml'
6
+ require 'colorize'
7
+ require 'guard'
8
+ # require 'guard-sass'
9
+
10
+ module Gridpaper
11
+ class Generate
12
+
13
+ # Add Gridpaper to your project
14
+ def initialize(path, stylesheets_dir="stylesheets", syntax=:sass)
15
+
16
+ destination = File.join(path, stylesheets_dir)
17
+ puts stylesheets_dir.cyan
18
+ copy_files_to(destination, syntax.to_s)
19
+
20
+
21
+ end
22
+
23
+ private
24
+
25
+ def copy_files_to(destination, syntax)
26
+ template_dir = File.expand_path(File.join(File.dirname(__FILE__), '../', 'templates', syntax.to_s))
27
+ template_dir_dest = File.join(destination, syntax)
28
+ project_dir = Dir.pwd
29
+
30
+ if File.exists?(template_dir_dest)
31
+ output(template_dir_dest, :skipped)
32
+ else
33
+ FileUtils.mkdir_p(template_dir_dest)
34
+ output(template_dir_dest, :created)
35
+ end
36
+
37
+ # Get a listing of all files and folders in the
38
+ # templates directory for the specified syntax
39
+ Dir.chdir(File.expand_path(template_dir))
40
+ files = Dir['**/*']
41
+ puts files
42
+ Dir.chdir(project_dir)
43
+
44
+ files.each do |file|
45
+ src = File.join(template_dir, file)
46
+ dest = File.join(template_dir_dest, file)
47
+
48
+ if File.exists?(dest)
49
+ output(dest.to_s, :skipped)
50
+ else
51
+ FileUtils.mkdir_p(dest) if File.directory?(src)
52
+ FileUtils.cp(src, dest) unless File.directory?(src)
53
+ output(dest.to_s, :created)
54
+ end
55
+
56
+ end
57
+ end
58
+
59
+ def output(message, status)
60
+ puts "#{ status.to_s }: #{ message }".to_s.green if status == :created
61
+ puts "#{ status.to_s }: #{ message } (exists)".to_s.yellow if status == :skipped
62
+ puts "#{ status.to_s }: #{ message }".to_s.red if status == :failed
63
+ end
64
+ end
65
+
66
+ class Watch
67
+
68
+
69
+ def initialize(input, output)
70
+ # working_dir = Dir.pwd
71
+ @@output_path = output
72
+ @@input_path = input
73
+
74
+ guardfile = File.expand_path(File.join(File.dirname(__FILE__), 'Guardfile'))
75
+ # puts guardfile.cyan
76
+
77
+ # Guard.setup
78
+ # Guard::Dsl.evaluate_guardfile(:guardfile => guardfile)
79
+ # Guard::Dsl.local_guardfile_path(guardfile)
80
+ # puts Guard::Dsl.guardfile_path.cyan
81
+
82
+ Guard.start(:guardfile => guardfile, :watchdir => input)
83
+ end
84
+
85
+ def self.output_path
86
+ return @@output_path
87
+ end
88
+
89
+ def self.input_path
90
+ return @@input_path
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -0,0 +1,3 @@
1
+ module Gridpaper
2
+ VERSION = "0.0.5"
3
+ end
@@ -0,0 +1,129 @@
1
+ require 'guard'
2
+ require 'guard/guard'
3
+ require 'guard/watcher'
4
+
5
+ require 'sass'
6
+
7
+ module Guard
8
+ class GridpaperWatch < Guard
9
+
10
+ DEFAULTS = {
11
+ :output => 'css', # Output directory
12
+ :notification => true, # Enable notifications?
13
+ :shallow => false, # Output nested directories?
14
+ :style => :nested, # Nested output
15
+ :debug_info => false, # File and line number info for FireSass
16
+ :noop => false, # Do no write output file
17
+ :hide_success => false, # Do not show success message
18
+ :load_paths => Dir.glob('**/**').find_all {|i| File.directory?(i) }
19
+ }
20
+
21
+ def initialize(watchers = [], options = {})
22
+ if options[:input]
23
+ options[:output] = options[:input] unless options.has_key?(:output)
24
+ watchers << ::Guard::Watcher.new(%r{^#{options.delete(:input)}/(.+\.s[ac]ss)$})
25
+ end
26
+
27
+ super(watchers, DEFAULTS.merge(options))
28
+ end
29
+
30
+
31
+ # Builds the sass or scss. Determines engine to use by extension
32
+ # of path given.
33
+ #
34
+ # @param file [String] path to file to build
35
+ # @return [String] the output css
36
+ #
37
+ def build_sass(file)
38
+ content = File.new(file).read
39
+ # sass or scss?
40
+ type = file[-4..-1].to_sym
41
+ sass_options = {
42
+ :syntax => type,
43
+ :load_paths => options[:load_paths],
44
+ :style => options[:style].to_sym,
45
+ :debug_info => options[:debug_info],
46
+ }
47
+
48
+ ::Sass::Engine.new(content, sass_options).render
49
+ end
50
+
51
+ # Get the file path to output the css based on the file being
52
+ # built.
53
+ #
54
+ # @param file [String] path to file being built
55
+ # @return [String] path to file where output should be written
56
+ #
57
+ def get_output(file)
58
+ folder = File.join ::Guard.listener.directory, options[:output]
59
+
60
+ unless options[:shallow]
61
+ watchers.product([file]).each do |watcher, file|
62
+ if matches = file.match(watcher.pattern)
63
+ if matches[1]
64
+ folder = File.join(::Guard.listener.directory, options[:output], File.dirname(matches[1])).gsub(/\/\.$/, '')
65
+ break
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ FileUtils.mkdir_p folder
72
+ r = File.join folder, File.basename(file).split('.')[0]
73
+ r << '.css'
74
+ end
75
+
76
+ def ignored?(path)
77
+ File.basename(path)[0,1] == "_"
78
+ end
79
+
80
+ # ================
81
+ # = Guard method =
82
+ # ================
83
+
84
+ # Build all files being watched
85
+ def run_all
86
+ run_on_change(Watcher.match_files(self, Dir.glob(File.join('**', '[^_]*.*'))))
87
+ end
88
+
89
+ # Build the files given
90
+ def run_on_change(paths)
91
+ partials = paths.select { |f| ignored?(f) }
92
+ return run_all unless partials.empty?
93
+
94
+ changed_files = paths.reject{ |f| ignored?(f) }.map do |file|
95
+ css_file = get_output(file)
96
+ begin
97
+ contents = build_sass(file)
98
+ if contents
99
+ message = options[:noop] ? "verified #{file}" : "rebuilt #{file}"
100
+
101
+ File.open(css_file, 'w') {|f| f.write(contents) } unless options[:noop]
102
+ ::Guard::UI.info "-> #{message}", :reset => true
103
+ if options[:notification] && !options[:hide_success]
104
+ ::Guard::Notifier.notify(message, :title => "Guard::Sass", :image => :success)
105
+ end
106
+ end
107
+ css_file
108
+ rescue ::Sass::SyntaxError => e
109
+ ::Guard::UI.error "Sass > #{e.sass_backtrace_str(file)}"
110
+ ::Guard::Notifier.notify(
111
+ (options[:noop] ? 'validation' : 'rebuild') + " failed > #{e.sass_backtrace_str(file)}",
112
+ :title => "Guard::Sass",
113
+ :image => :error
114
+ ) if options[:notification]
115
+ nil
116
+ end
117
+ end.compact
118
+ notify changed_files
119
+ end
120
+
121
+ def notify(changed_files)
122
+ ::Guard.guards.reject{ |guard| guard == self }.each do |guard|
123
+ paths = Watcher.match_files(guard, changed_files)
124
+ guard.run_on_change paths unless paths.empty?
125
+ end
126
+ end
127
+
128
+ end
129
+ end
@@ -0,0 +1,46 @@
1
+ .column
2
+ height: 100px
3
+ margin-bottom: 16px
4
+ background-color: $light-grey
5
+ border: 1px solid $medium-grey
6
+
7
+
8
+ #columns-1
9
+ .column
10
+ @include column
11
+ @include span(24, -2px)
12
+
13
+ #columns-2
14
+ .column
15
+ @include column
16
+ @include span(12, -2px)
17
+
18
+ #columns-3
19
+ .column
20
+ @include column
21
+ @include span(8, -2px)
22
+
23
+ #columns-4
24
+ .column
25
+ @include column
26
+ @include span(6, -2px)
27
+
28
+ #columns-6
29
+ .column
30
+ @include column
31
+ @include span(4, -2px)
32
+
33
+ #columns-8
34
+ .column
35
+ @include column
36
+ @include span(3, -2px)
37
+
38
+ #columns-12
39
+ .column
40
+ @include column
41
+ @include span(2, -2px)
42
+
43
+ #columns-24
44
+ .column
45
+ @include column
46
+ @include span(1, -2px)
@@ -0,0 +1,7 @@
1
+ // Define your own grid
2
+ $grid-columns: 24
3
+ $grid-column-width: 24px
4
+ $grid-gutter-width: 16px
5
+
6
+ // Set your base font size
7
+ $base-font-size: 16px
@@ -0,0 +1 @@
1
+ @import reset, grid, effects, forms
@@ -0,0 +1,31 @@
1
+ @mixin border-radius($radii, $ie: false)
2
+ -webkit-border-radius: $radii
3
+ -moz-border-radius: $radii
4
+ -ms-border-radius: $radii
5
+ -o-border-radius: $radii
6
+ border-radius: $radii
7
+ -moz-background-clip: padding
8
+ -webkit-background-clip: padding-box
9
+ background-clip: padding-box
10
+ @if $ie
11
+ position: relative
12
+ behavior: url(/javascripts/PIE.htc)
13
+
14
+ @mixin box-shadow($style, $ie: false)
15
+ -webkit-box-shadow: $style
16
+ -moz-box-shadow: $style
17
+ -ms-box-shadow: $style
18
+ -o-box-shadow: $style
19
+ box-shadow: $style
20
+ @if $ie
21
+ behavior: url(/javascripts/PIE.htc)
22
+
23
+ @mixin box-gradient($from, $to)
24
+ background-color: mix($from, $to)
25
+ background-image: -webkit-gradient(linear, left top, left bottom, from($from), to($to))
26
+ background-image: -webkit-linear-gradient(top, $from, $to)
27
+ background-image: -moz-linear-gradient(top, $from, $to)
28
+ background-image: -ms-linear-gradient(top, $from, $to)
29
+ background-image: -o-linear-gradient(top, $from, $to)
30
+ background-image: linear-gradient(top, $from, $to)
31
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorStr="#{ $from }", EndColorStr="#{ $to }")