front-end-blender 0.5.1 → 0.5.2
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 +2 -1
- data/README +31 -25
- data/bin/blend +92 -111
- metadata +16 -8
data/MIT-LICENSE
CHANGED
data/README
CHANGED
@@ -1,37 +1,43 @@
|
|
1
|
-
==
|
2
|
-
|
3
|
-
|
1
|
+
== What is Blender?
|
2
|
+
|
3
|
+
Blender is like ant or make for the front-end. It aggregates and compresses
|
4
|
+
CSS and/or JavaScript assets for a site into efficient, production-ready files.
|
4
5
|
|
5
6
|
== Examples
|
6
|
-
In your site directory run 'blend' to minify CSS and JavaScript.
|
7
|
-
blend
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
In your site directory run 'blend' to minify CSS and JavaScript.
|
9
|
+
blend
|
10
|
+
|
11
|
+
Other examples:
|
12
|
+
blend -f site/blender.yaml
|
13
|
+
blend -t css
|
14
|
+
blend -t css -d
|
15
|
+
blend -F -- --preserve-semi
|
16
|
+
|
17
|
+
== Usage
|
13
18
|
|
14
|
-
|
15
|
-
blend [options]
|
19
|
+
blend [options] [-- yui-compressor-options]
|
16
20
|
|
17
|
-
|
21
|
+
For help use: blend -h
|
18
22
|
|
19
23
|
== 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
24
|
|
27
|
-
|
28
|
-
|
25
|
+
-h, --help Displays help message
|
26
|
+
-v, --version Display the version, then exit
|
27
|
+
-f <file>, --file <file> Use given Blendfile
|
28
|
+
-t <css|js>, --type <css|js> Compress CSS or JavaScript only
|
29
|
+
-d, --data Convert CSS url(image.ext) to url(data:) EXPERIMENTAL
|
30
|
+
-F, --force Force file minification when there are no new updates
|
29
31
|
|
30
32
|
== Installation
|
31
|
-
|
32
|
-
|
33
|
+
|
34
|
+
To install the beta gem, run the following at the command line:
|
35
|
+
sudo gem install front-end-blender --source=http://gems.github.com
|
33
36
|
|
34
37
|
== License
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
+
|
39
|
+
Copyright (c) 2008 Chris Griego
|
40
|
+
(c) 2008 Blake Elshire
|
41
|
+
|
42
|
+
Blender is freely distributable under the terms of an MIT-style license.
|
43
|
+
For details, see http://www.opensource.org/licenses/mit-license.php
|
data/bin/blend
CHANGED
@@ -1,55 +1,28 @@
|
|
1
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 'blend' to minify CSS and JavaScript.
|
8
|
-
# blend
|
9
|
-
#
|
10
|
-
# Other examples:
|
11
|
-
# blend -f site/blender.yaml
|
12
|
-
# blend -t css
|
13
|
-
# blend -t css -d
|
14
|
-
#
|
15
|
-
# == Usage
|
16
|
-
# blend [options]
|
17
|
-
#
|
18
|
-
# For help use: blend -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 front-end-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
2
|
|
3
|
+
# Copyright (c) 2008 Chris Griego
|
4
|
+
# (c) 2008 Blake Elshire
|
5
|
+
#
|
6
|
+
# Blender is freely distributable under the terms of an MIT-style license.
|
7
|
+
# For details, see http://www.opensource.org/licenses/mit-license.php
|
40
8
|
|
41
9
|
require 'yaml'
|
42
10
|
require 'optparse'
|
43
11
|
require 'rdoc/usage'
|
44
12
|
require 'ostruct'
|
45
13
|
require 'base64'
|
14
|
+
require 'mime/types'
|
46
15
|
|
16
|
+
# TODO Move class to lib so other tools could potentially reuse it
|
47
17
|
class Blender
|
48
|
-
VERSION = '0.5.
|
18
|
+
VERSION = '0.5.2'
|
19
|
+
|
49
20
|
attr_reader :options
|
50
21
|
|
51
22
|
def initialize(arguments, stdin)
|
52
|
-
@arguments
|
23
|
+
@arguments = !arguments.include?('--') ? arguments : arguments[0...arguments.index('--')]
|
24
|
+
@passthrough = !arguments.include?('--') ? '' : arguments[arguments.index('--')+1..-1]
|
25
|
+
|
53
26
|
# Set defaults
|
54
27
|
@options = OpenStruct.new
|
55
28
|
@options.blendfile = 'blender.yaml'
|
@@ -71,9 +44,9 @@ class Blender
|
|
71
44
|
|
72
45
|
blender.each do |output_name, inputs|
|
73
46
|
output_new = false
|
47
|
+
|
74
48
|
# Checks the type flag and if the current file meets the type requirements continues
|
75
49
|
if output_name.match "." + @options.file_type.to_s
|
76
|
-
|
77
50
|
file_type = output_name.match(/\.css/) ? "css" : "js"
|
78
51
|
|
79
52
|
# Checks if output file exists and checks the mtimes of the source files to the output file if new creates a new file
|
@@ -86,12 +59,12 @@ class Blender
|
|
86
59
|
end
|
87
60
|
|
88
61
|
if output_new || @options.force
|
89
|
-
|
62
|
+
create_output(output_name, inputs, file_type)
|
90
63
|
else
|
91
|
-
|
64
|
+
puts "Skipping: #{output_name}"
|
92
65
|
end
|
93
66
|
else
|
94
|
-
|
67
|
+
create_output(output_name, inputs, file_type)
|
95
68
|
end
|
96
69
|
end
|
97
70
|
end
|
@@ -100,87 +73,95 @@ class Blender
|
|
100
73
|
|
101
74
|
protected
|
102
75
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
76
|
+
def parsed_options?
|
77
|
+
opts = OptionParser.new
|
78
|
+
|
79
|
+
opts.on('-v', '--version') { output_version ; exit 0 }
|
80
|
+
opts.on('-h', '--help') { output_help }
|
81
|
+
|
82
|
+
opts.on('-f FILE', '--file FILE', String, "Use given Blendfile") do |blendfile|
|
83
|
+
@options.blendfile = blendfile
|
84
|
+
end
|
85
|
+
|
86
|
+
opts.on("-t [TYPE]", "--type [TYPE]", [:css, :js], "Select file type to minify (css, js)") do |t|
|
87
|
+
@options.file_type = t
|
88
|
+
end
|
89
|
+
|
90
|
+
opts.on("-d", "--data", String, "Change url(image.ext) to url(data:) in css files") { @options.data = true }
|
91
|
+
opts.on("-F", "--force", String, "Force minification when source files aren't newer than min files") { @options.force = true }
|
92
|
+
|
93
|
+
opts.parse!(@arguments) rescue return false
|
94
|
+
|
95
|
+
true
|
96
|
+
end
|
97
|
+
|
98
|
+
# TODO Change to work with directory hashes (css/: [ colors.css, layout.css ])
|
99
|
+
def create_output(output_name, inputs, type)
|
100
|
+
File.open(output_name, 'w') do |output_file|
|
101
|
+
inputs.each do |i|
|
102
|
+
output_file << IO.read(i)
|
112
103
|
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
104
|
end
|
119
105
|
|
120
|
-
#
|
121
|
-
|
106
|
+
# Compress
|
107
|
+
IO.popen("java -jar #{File.dirname(__FILE__)}/../lib/yuicompressor.jar #{@passthrough} --type #{type}", mode="r+") do |io|
|
108
|
+
io.write IO.read(output_name)
|
109
|
+
io.close_write
|
110
|
+
|
122
111
|
File.open(output_name, 'w') do |output_file|
|
123
|
-
|
124
|
-
output_file << IO.read(i)
|
125
|
-
end
|
112
|
+
output_file << io.read
|
126
113
|
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# TODO Move this to before the file gets written
|
117
|
+
# Workaround for YUI Compressor Bug #1938329 & Bug #1961175
|
118
|
+
if output_name.match /\.css$/
|
119
|
+
output = IO.read(output_name)
|
127
120
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
121
|
+
output.gsub! ' and(', ' and ('
|
122
|
+
output.gsub! '/**/;}', '/**/}'
|
123
|
+
|
124
|
+
if @options.data
|
125
|
+
output = output.gsub(/url\(['"]?([^?']+)['"]+\)/im) do
|
126
|
+
uri = $1
|
127
|
+
mime_type = ''
|
128
|
+
|
129
|
+
# Make the URI absolute instead of relative. TODO Seems kinda hacky is there a better way?
|
130
|
+
uri.gsub! "../", ""
|
131
|
+
|
132
|
+
# Figure out the mime type.
|
133
|
+
mime_type = MIME::Types.type_for(uri)
|
134
|
+
|
135
|
+
url_contents = make_data_uri(IO.read(uri), mime_type)
|
136
|
+
|
137
|
+
%Q!url("#{url_contents}")!
|
134
138
|
end
|
135
139
|
end
|
136
140
|
|
137
|
-
|
138
|
-
|
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
|
-
mime_type = ''
|
147
|
-
|
148
|
-
# Make the URI absolute instead of relative. TODO Again seems kinda hacky is there a better way?
|
149
|
-
uri.gsub! "../", ""
|
150
|
-
|
151
|
-
# Figure out the mime type. TODO Seems hacky is there a way to read mime type built into Ruby?
|
152
|
-
IO.popen("file --mime #{uri}") do |io|
|
153
|
-
mime_type = io.read.split(": ")[1]
|
154
|
-
end
|
155
|
-
|
156
|
-
url_contents = make_data_uri(IO.read(uri), mime_type)
|
157
|
-
|
158
|
-
%Q!url("#{url_contents}")!
|
159
|
-
}
|
160
|
-
end
|
161
|
-
|
162
|
-
File.open(output_name, 'w') do |output_file|
|
163
|
-
output_file << output
|
164
|
-
end
|
141
|
+
File.open(output_name, 'w') do |output_file|
|
142
|
+
output_file << output
|
165
143
|
end
|
166
|
-
puts output_name
|
167
144
|
end
|
168
145
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
def output_version
|
177
|
-
puts "#{File.basename(__FILE__)} version #{VERSION}"
|
178
|
-
end
|
146
|
+
puts output_name
|
147
|
+
end
|
148
|
+
|
149
|
+
def make_data_uri(content, content_type)
|
150
|
+
outuri = 'data:' + content_type + ';base64'
|
151
|
+
content = Base64.encode64(content)
|
152
|
+
outuri += ",#{content}"
|
179
153
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
154
|
+
outuri.gsub("\n", '')
|
155
|
+
end
|
156
|
+
|
157
|
+
def output_version
|
158
|
+
puts "#{File.basename(__FILE__)} version #{VERSION}"
|
159
|
+
end
|
160
|
+
|
161
|
+
def output_help
|
162
|
+
output_version
|
163
|
+
RDoc::usage() #exits app
|
164
|
+
end
|
184
165
|
end
|
185
166
|
|
186
167
|
# Create and run the application
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: front-end-blender
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Elshire & Chris Griego
|
@@ -9,11 +9,19 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-05-
|
12
|
+
date: 2008-05-17 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: mime-types
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "1.15"
|
23
|
+
version:
|
24
|
+
description: Blender is like ant or make for the front-end. It aggregates and compresses CSS and/or JavaScript assets for a site into efficient, production-ready files.
|
17
25
|
email: belshire@gmail.com
|
18
26
|
executables:
|
19
27
|
- blend
|
@@ -45,12 +53,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
45
53
|
- !ruby/object:Gem::Version
|
46
54
|
version: "0"
|
47
55
|
version:
|
48
|
-
requirements:
|
49
|
-
|
56
|
+
requirements:
|
57
|
+
- Java, v1.4 or greater
|
50
58
|
rubyforge_project:
|
51
59
|
rubygems_version: 1.0.1
|
52
60
|
signing_key:
|
53
61
|
specification_version: 2
|
54
|
-
summary: Blender gives you production-ready CSS and/or JavaScript assets.
|
62
|
+
summary: Blender gives you efficient, production-ready CSS and/or JavaScript assets.
|
55
63
|
test_files: []
|
56
64
|
|