cgriego-blender 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +19 -0
- data/README +37 -0
- data/bin/blender +189 -0
- data/lib/yuicompressor.jar +0 -0
- 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
|
+
|