cgriego-blender 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/MIT-LICENSE +19 -0
  2. data/README +37 -0
  3. data/bin/blender +189 -0
  4. data/lib/yuicompressor.jar +0 -0
  5. metadata +56 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2008 Chris Griego & Blake Elshire.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,37 @@
1
+ == Synopsis
2
+ Blender is like Make or Ant for the front-end. It aggregates and compresses
3
+ CSS and/or JavaScript assets of a site into production-ready files.
4
+
5
+ == Examples
6
+ In your site directory run blender to minify CSS and JavaScript.
7
+ blender
8
+
9
+ Other examples:
10
+ blender -f site/blender.yaml
11
+ blender -t css
12
+ blender -t css -d
13
+
14
+ == Usage
15
+ blender [options]
16
+
17
+ For help use: blender -h
18
+
19
+ == Options
20
+ -h, --help Displays help message
21
+ -v, --version Display the version, then exit
22
+ -f <file>, --file <file> Use given Blendfile
23
+ -t <css|js>, --type <css|js> Compress CSS or JavaScript only
24
+ -d, --data Convert CSS url(image.ext) to url(data:) EXPERIMENTAL
25
+ -F, --force Force file minification when there are no new updates
26
+
27
+ == Authors
28
+ Chris Griego & Blake Elshire
29
+
30
+ == Installation
31
+ To install the beta version, run the following at the command line:
32
+ sudo gem install cgriego-blender --source=http://gems.github.com
33
+
34
+ == License
35
+ Copyright (c) 2008 Chris Griego & Blake Elshire.
36
+ Licensed under the MIT License:
37
+ http://www.opensource.org/licenses/mit-license.php
data/bin/blender ADDED
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env ruby
2
+ # == Synopsis
3
+ # Blender is like Make or Ant for the front-end. It aggregates and compresses
4
+ # CSS and/or JavaScript assets of a site into production-ready files.
5
+ #
6
+ # == Examples
7
+ # In your site directory run blender to minify CSS and JavaScript.
8
+ # blender
9
+ #
10
+ # Other examples:
11
+ # blender -f site/blender.yaml
12
+ # blender -t css
13
+ # blender -t css -d
14
+ #
15
+ # == Usage
16
+ # blender [options]
17
+ #
18
+ # For help use: blender -h
19
+ #
20
+ # == Options
21
+ # -h, --help Displays help message
22
+ # -v, --version Display the version, then exit
23
+ # -f <file>, --file <file> Use given Blendfile
24
+ # -t <css|js>, --type <css|js> Compress CSS or JavaScript only
25
+ # -d, --data Convert CSS url(image.ext) to url(data:) EXPERIMENTAL
26
+ # -F, --force Force file minification when there are no new updates
27
+ #
28
+ # == Authors
29
+ # Chris Griego & Blake Elshire
30
+ #
31
+ # == Installation
32
+ # To install the beta version, run the following at the command line:
33
+ # sudo gem install cgriego-blender --source=http://gems.github.com
34
+ #
35
+ # == License
36
+ # Copyright (c) 2008 Chris Griego & Blake Elshire.
37
+ # Licensed under the MIT License:
38
+ # http://www.opensource.org/licenses/mit-license.php
39
+
40
+
41
+ require 'yaml'
42
+ require 'optparse'
43
+ require 'rdoc/usage'
44
+ require 'ostruct'
45
+ require 'base64'
46
+
47
+ class Blender
48
+ VERSION = '0.5.1'
49
+ attr_reader :options
50
+
51
+ def initialize(arguments, stdin)
52
+ @arguments = arguments
53
+ # Set defaults
54
+ @options = OpenStruct.new
55
+ @options.blendfile = 'blender.yaml'
56
+ @options.png = false
57
+ @options.data = false
58
+ @options.force = false
59
+ end
60
+
61
+ def blend
62
+ if parsed_options?
63
+ unless File.exists? @options.blendfile
64
+ puts "Couldn't find '#{@options.blendfile}'"
65
+ exit 1
66
+ end
67
+
68
+ blender = YAML::load_file @options.blendfile
69
+
70
+ Dir.chdir(File.dirname(@options.blendfile))
71
+
72
+ blender.each do |output_name, inputs|
73
+ output_new = false
74
+ # Checks the type flag and if the current file meets the type requirements continues
75
+ if output_name.match "." + @options.file_type.to_s
76
+
77
+ file_type = output_name.match(/\.css/) ? "css" : "js"
78
+
79
+ # Checks if output file exists and checks the mtimes of the source files to the output file if new creates a new file
80
+ if File.exists? output_name
81
+ inputs.each do |i|
82
+ if File.mtime(i) > File.mtime(output_name)
83
+ output_new = true
84
+ break
85
+ end
86
+ end
87
+
88
+ if output_new || @options.force
89
+ create_output(output_name, inputs, file_type)
90
+ else
91
+ puts "Skipping: #{output_name}"
92
+ end
93
+ else
94
+ create_output(output_name, inputs, file_type)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ protected
102
+
103
+ def parsed_options?
104
+ opts = OptionParser.new
105
+ opts.on('-v', '--version') { output_version ; exit 0 }
106
+ opts.on('-h', '--help') { output_help }
107
+ opts.on('-f FILE', '--file FILE', String, "Use given Blendfile") do |blendfile|
108
+ @options.blendfile = blendfile
109
+ end
110
+ opts.on("-t [TYPE]", "--type [TYPE]", [:css, :js], "Select file type to minify (css, js)") do |t|
111
+ @options.file_type = t
112
+ end
113
+ opts.on("-d", "--data", String, "Change url(image.ext) to url(data:) in css files") { @options.data = true }
114
+ opts.on("-F", "--force", String, "Force minification when source files aren't newer than min files") { @options.force = true }
115
+
116
+ opts.parse!(@arguments) rescue return false
117
+ true
118
+ end
119
+
120
+ # TODO Change to work with directory hashes (css/: [ colors.css, layout.css ])
121
+ def create_output(output_name, inputs, type)
122
+ File.open(output_name, 'w') do |output_file|
123
+ inputs.each do |i|
124
+ output_file << IO.read(i)
125
+ end
126
+ end
127
+
128
+ # Compress
129
+ IO.popen("java -jar #{File.dirname(__FILE__)}/../lib/yuicompressor.jar --type #{type}", mode="r+") do |io|
130
+ io.write IO.read(output_name)
131
+ io.close_write
132
+ File.open(output_name, 'w') do |output_file|
133
+ output_file << io.read
134
+ end
135
+ end
136
+
137
+ # Workaround for YUI Compressor Bug #1938329 & Bug #1961175
138
+ if output_name.match /\.css$/
139
+ output = IO.read(output_name)
140
+ output.gsub! ' and(', ' and ('
141
+ output.gsub! '/**/;}', '/**/}'
142
+
143
+ if @options.data
144
+ output = output.gsub(/url\(['"]?([^?']+)['"]+\)/im) {
145
+ uri = $1
146
+
147
+ # Figure out the mime type. TODO Seems hacky is there a way to read mime type built into Ruby?
148
+ mime_type = case
149
+ when uri.include?(".png") then "image/png"
150
+ when uri.include?(".jpg") then "image/jpg"
151
+ when uri.include?(".jpeg") then "image/jpeg"
152
+ when uri.include?(".gif") then "image/gif"
153
+ end
154
+
155
+ # Make the URI absolute instead of relative. TODO Again seems kinda hacky is there a better way?
156
+ uri.gsub! "../", ""
157
+ url_contents = make_data_uri(IO.read(uri), mime_type)
158
+
159
+ %Q!url("#{url_contents}")!
160
+ }
161
+ end
162
+
163
+ File.open(output_name, 'w') do |output_file|
164
+ output_file << output
165
+ end
166
+ end
167
+ puts output_name
168
+ end
169
+
170
+ def make_data_uri(content, content_type)
171
+ outuri = 'data:' + content_type + ';base64'
172
+ content = Base64.encode64(content).gsub("\n", '')
173
+ outuri += ",#{content}"
174
+ return outuri
175
+ end
176
+
177
+ def output_version
178
+ puts "#{File.basename(__FILE__)} version #{VERSION}"
179
+ end
180
+
181
+ def output_help
182
+ output_version
183
+ RDoc::usage() #exits app
184
+ end
185
+ end
186
+
187
+ # Create and run the application
188
+ blender = Blender.new(ARGV, STDIN)
189
+ blender.blend
Binary file
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cgriego-blender
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.1
5
+ platform: ruby
6
+ authors:
7
+ - Blake Elshire & Chris Griego
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-16 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Blender is like Make or Ant for the front-end. It aggregates and compresses CSS and/or JavaScript assets of a site into production-ready files.
17
+ email: belshire@gmail.com
18
+ executables:
19
+ - blender
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README
26
+ - MIT-LICENSE
27
+ - bin/blender
28
+ - lib/yuicompressor.jar
29
+ has_rdoc: false
30
+ homepage: http://github.com/cgriego/front-end-blender/tree/master
31
+ post_install_message:
32
+ rdoc_options: []
33
+
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ requirements: []
49
+
50
+ rubyforge_project:
51
+ rubygems_version: 1.0.1
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: Blender gives you production-ready CSS and/or JavaScript assets.
55
+ test_files: []
56
+