sqweeze 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +17 -5
- data/bin/sqweeze +11 -2
- data/lib/compilers/cssDomCompiler.rb +3 -3
- data/lib/compressor.rb +14 -5
- data/lib/compressors/cssCompressor.rb +3 -0
- data/lib/compressors/jsCompressor.rb +7 -5
- data/lib/confManager.rb +14 -8
- data/lib/domCompiler.rb +1 -1
- data/lib/sqweezeUtils.rb +44 -5
- data/sqweeze.gemspec +1 -1
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -9,7 +9,8 @@ With a little help from a number of well known open source third party tools, _S
|
|
9
9
|
* Lossless compresses .PNG, .JPEG and .GIF image assets.
|
10
10
|
* Compresses and concatenates into single files multiple Stylesheets and Javascript files.
|
11
11
|
* Embeds the compressed assets referenced into the stylesheet, using using {Data-uris}[https://developer.mozilla.org/En/The_data_URL_scheme] (for proper browsers and IE8) and {MHTML}[http://en.wikipedia.org/wiki/MHTML] (for IE6-7).
|
12
|
-
* Finally, it provides some basic functionality
|
12
|
+
* Finally, it provides some basic functionality for linking the compressed Javascript and CSS just created to the main HTML document,
|
13
|
+
and removing automatically the links pointing to the old uncompressed ones.
|
13
14
|
|
14
15
|
=== Installing it
|
15
16
|
|
@@ -18,11 +19,22 @@ On an Ubuntu box, you can install these by running a single command line
|
|
18
19
|
|
19
20
|
sudo apt-get install pngcrush gifsicle libjpeg-progs
|
20
21
|
|
21
|
-
|
22
|
-
{compiled manually}[http://www.phpied.com/installing-jpegtran-mac-unix-linux].
|
22
|
+
Mac OSX users can install the first two as Macports packages. The third (part of libjpeg) instead, has to be
|
23
|
+
{compiled manually}[http://www.phpied.com/installing-jpegtran-mac-unix-linux].
|
23
24
|
|
24
|
-
Once installed
|
25
|
+
Once installed these, you can install _Sqweeze_ using rubygems
|
25
26
|
|
26
27
|
gem install sqweeze
|
27
28
|
|
28
|
-
|
29
|
+
=== Configuration
|
30
|
+
|
31
|
+
When run for the first time, the script creates a config file in the user's $HOME directory and sets therein the default paths of command line tools such as pngcrush and friends.
|
32
|
+
|
33
|
+
# file $HOME/.sqweeze.yml
|
34
|
+
|
35
|
+
bin_paths:
|
36
|
+
- pngcrush: /usr/bin/pngcrush
|
37
|
+
- jpegtran: /usr/bin/jpegtran
|
38
|
+
- gifsicle: /usr/bin/gifsicle
|
39
|
+
|
40
|
+
If you have installed these anywhere else than in /usr/bin+, you will have to edit this file so that sqweeze can find them.
|
data/bin/sqweeze
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# rubygems
|
3
3
|
%w[rubygems yui/compressor closure-compiler hpricot].each{|lib| require lib}
|
4
4
|
# ruby standard library
|
5
|
-
%w[logger singleton yaml base64 open-uri pathname optparse].each{|lib| require lib}
|
5
|
+
%w[logger singleton yaml base64 open-uri pathname optparse fileutils].each{|lib| require lib}
|
6
6
|
|
7
7
|
# add lib sub-directories to load path
|
8
8
|
SQWEEZE_DIR=File.expand_path( File.dirname(File.dirname(__FILE__)))
|
@@ -77,6 +77,16 @@ op=OptionParser.new do |opts|
|
|
77
77
|
options[:default_js_compressor] = j.downcase.to_sym
|
78
78
|
end
|
79
79
|
|
80
|
+
opts.separator ""
|
81
|
+
opts.separator "Console output:"
|
82
|
+
|
83
|
+
opts.on('-q',"--quite", "suppress console output ") do |q|
|
84
|
+
options[:suppress_warn] = true
|
85
|
+
options[:suppress_info] = true
|
86
|
+
end
|
87
|
+
opts.on('-d',"--debug", "show debug information") do |q|
|
88
|
+
options[:suppress_debug] = false
|
89
|
+
end
|
80
90
|
end
|
81
91
|
|
82
92
|
begin
|
@@ -86,7 +96,6 @@ begin
|
|
86
96
|
exit(1) }.call unless File.exists?(ARGV[0])
|
87
97
|
|
88
98
|
|
89
|
-
$log=Logger.new( STDERR )
|
90
99
|
cm=ConfManager.instance
|
91
100
|
cm.prepare(ARGV[0], ARGV[1], options)
|
92
101
|
|
@@ -1,8 +1,9 @@
|
|
1
|
+
# Turn link to extenrnal stylesheets into inline style elements..
|
2
|
+
|
1
3
|
class CssDomCompiler < DOMCompiler
|
2
|
-
|
3
4
|
def compile
|
4
5
|
iterate_over('link[@rel="stylesheet"]') do |elm, doc|
|
5
|
-
next unless elm.has_attribute?('href') and not elm.get_attribute('href').
|
6
|
+
next unless elm.has_attribute?('href') and not elm.get_attribute('href').empty?
|
6
7
|
|
7
8
|
fbody=get_resource(elm.get_attribute('href'))
|
8
9
|
|
@@ -11,7 +12,6 @@ class CssDomCompiler < DOMCompiler
|
|
11
12
|
|
12
13
|
style_html = "<style type=\"text/css\">\n" + css_cdata(fbody,:compress) + '</style>'
|
13
14
|
doc.search('head').append(style_html)
|
14
|
-
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
data/lib/compressor.rb
CHANGED
@@ -82,7 +82,7 @@ class Compressor
|
|
82
82
|
gsub('%input%',inputpath).
|
83
83
|
gsub('%output%', output_path)
|
84
84
|
system(cl)
|
85
|
-
|
85
|
+
notify("run command #{cl}, pid=#{$?.pid} exitstatus=#{$?.exitstatus}", :debug)
|
86
86
|
output_path
|
87
87
|
end
|
88
88
|
|
@@ -101,7 +101,10 @@ class Compressor
|
|
101
101
|
files.each do |path|
|
102
102
|
output_path=process(path,cmd)
|
103
103
|
size_check(path,output_path) unless %w(.css .js).include?( File.extname(output_path))
|
104
|
-
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# summarise compression stats
|
107
|
+
print_summary unless ['.css','.js' ].include?(@input_file_extensions)
|
105
108
|
end
|
106
109
|
|
107
110
|
# Makes sure that the byteweight of a compressed file is not larger that the original one.
|
@@ -110,10 +113,10 @@ class Compressor
|
|
110
113
|
before_size, after_size = byteweight(input_path), byteweight(output_path)
|
111
114
|
# if the compressed file is bigger than the original one, copy the original in the target dir
|
112
115
|
if after_size < before_size
|
113
|
-
|
116
|
+
notify("compressed #{input_path} to the #{ compression_percentage(before_size,after_size)}% of its original size (from: #{before_size} to #{after_size} bytes ) ", :debug)
|
114
117
|
@byteweight_after+=after_size
|
115
118
|
else
|
116
|
-
|
119
|
+
notify("output(#{after_size}) >= input(#{before_size}), keeping the original file #{input_path}",:debug)
|
117
120
|
FileUtils.cp(input_path,output_path)
|
118
121
|
@byteweight_after+=before_size
|
119
122
|
end
|
@@ -124,5 +127,11 @@ class Compressor
|
|
124
127
|
def concatenate_files
|
125
128
|
@input_files.collect{|f|File.open(f,'r').read}.join("\n")
|
126
129
|
end
|
130
|
+
|
131
|
+
def print_summary
|
132
|
+
notify("Compressed #{ansi_bold(@input_files.size)} #{@input_file_extensions.first.upcase} files".ljust(60) +
|
133
|
+
"#{ansi_green(compression_percentage(@byteweight_before,@byteweight_after)+'%')} (was #{ansi_bold(@byteweight_before)}, is #{ansi_bold(@byteweight_after)} bytes now) \n",
|
134
|
+
:info) unless @byteweight_before == 0
|
135
|
+
end
|
127
136
|
|
128
|
-
end
|
137
|
+
end
|
@@ -40,6 +40,9 @@ class CssCompressor < Compressor
|
|
40
40
|
|
41
41
|
unless compressed_output.chomp.empty?
|
42
42
|
write_file(compressed_output,"#{@cm.target_dir}/stylesheets.min.css")
|
43
|
+
|
44
|
+
# set the total byte-weight
|
45
|
+
@byteweight_after=byteweight(compressed_output)
|
43
46
|
embed_datauris( compressed_output )
|
44
47
|
embed_mhtml( compressed_output ) if @cm.get_conf(:mhtml_root)
|
45
48
|
end
|
@@ -7,18 +7,20 @@ class JsCompressor < Compressor
|
|
7
7
|
|
8
8
|
|
9
9
|
def process(input_str,cmd=nil)
|
10
|
-
|
11
|
-
compressor, method = YUI::JavaScriptCompressor.new( :munge => true), :compress
|
12
|
-
else
|
10
|
+
if @cm.get_conf(:default_js_compressor) == :closure
|
13
11
|
compressor, method = Closure::Compiler.new, :compiler
|
12
|
+
else
|
13
|
+
compressor, method = YUI::JavaScriptCompressor.new( :munge => true), :compress
|
14
14
|
end
|
15
|
-
|
16
15
|
fout= (@concatenate_input)? "#{@cm.target_dir}/javascripts.min.js" : @cm.get_target_path(inputpath)
|
16
|
+
|
17
17
|
|
18
18
|
File.open(fout,'w') do |f|
|
19
19
|
f.write(compressor.send( method, input_str))
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
|
+
# set the total byte-weight
|
23
|
+
@byteweight_after=byteweight(fout)
|
22
24
|
fout
|
23
25
|
end
|
24
26
|
|
data/lib/confManager.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# Main component for handling Sqweeze's file and command-line configuration parameters
|
2
2
|
|
3
3
|
|
4
|
-
class ConfManager
|
4
|
+
class ConfManager
|
5
|
+
include SqweezeUtils
|
5
6
|
include Singleton
|
6
7
|
# Class constructor.
|
7
8
|
#
|
@@ -17,6 +18,10 @@ class ConfManager
|
|
17
18
|
@files=[]
|
18
19
|
|
19
20
|
@conf={
|
21
|
+
:suppress_info => false,
|
22
|
+
:suppress_debug => true,
|
23
|
+
:suppress_warn => false,
|
24
|
+
:suppress_error => false,
|
20
25
|
:bin_paths => {},
|
21
26
|
:dom_documents => [],
|
22
27
|
:include_files => [],
|
@@ -62,7 +67,8 @@ class ConfManager
|
|
62
67
|
else
|
63
68
|
target
|
64
69
|
end
|
65
|
-
|
70
|
+
copy_source
|
71
|
+
|
66
72
|
write_globalconf
|
67
73
|
# Parses the global configuration file in $HOME.
|
68
74
|
parse_conf
|
@@ -76,7 +82,7 @@ class ConfManager
|
|
76
82
|
# Creates the list of the files in the project directory.
|
77
83
|
|
78
84
|
list_files
|
79
|
-
|
85
|
+
|
80
86
|
end
|
81
87
|
|
82
88
|
# Copies the source into the target directory.
|
@@ -123,7 +129,7 @@ class ConfManager
|
|
123
129
|
# Parses configuration files and sets user-defined file inclusion/exlusion patterns.
|
124
130
|
|
125
131
|
def parse_conf(configfile="#{ENV['HOME']}/#{@conf_filename}")
|
126
|
-
|
132
|
+
notify("Parsing configuration file: #{configfile}",:debug)
|
127
133
|
conf=YAML::load_file( configfile )
|
128
134
|
|
129
135
|
bin_paths={}
|
@@ -150,7 +156,8 @@ class ConfManager
|
|
150
156
|
|
151
157
|
# others..
|
152
158
|
%w(include exclude).each {|k| set_conf(k, conf[k].to_a)}
|
153
|
-
%w(optimisation_strategy append_scripts_to
|
159
|
+
%w(optimisation_strategy append_scripts_to
|
160
|
+
suppress_messagess suppress_debug suppress_warnings).each{|k| set_conf(k,conf[k]) if conf[k]}
|
154
161
|
end
|
155
162
|
|
156
163
|
# Explodes the inclusion/exclusion patterns provided by the user into a list, and populates the @files attribute.
|
@@ -170,12 +177,11 @@ class ConfManager
|
|
170
177
|
exclude_files=get_files(get_conf(:exclude))
|
171
178
|
|
172
179
|
|
173
|
-
|
180
|
+
notify("Excluding #{exclude_files.size} file/s from user list", :debug)
|
174
181
|
@files -= exclude_files
|
175
|
-
|
182
|
+
notify("#{@files.size} file/s found", :info)
|
176
183
|
end
|
177
184
|
|
178
|
-
|
179
185
|
# Get all the files matching an array of patterns
|
180
186
|
#
|
181
187
|
# (Any file expansion patterns accepted ruby's Dir[] method can be used).
|
data/lib/domCompiler.rb
CHANGED
data/lib/sqweezeUtils.rb
CHANGED
@@ -12,6 +12,7 @@ module SqweezeUtils
|
|
12
12
|
'.otf' => 'font/opentype'
|
13
13
|
}
|
14
14
|
|
15
|
+
|
15
16
|
def write_file(fbody,fpath)
|
16
17
|
File.open(fpath,'w') do |f|
|
17
18
|
f.write(fbody)
|
@@ -75,12 +76,50 @@ module SqweezeUtils
|
|
75
76
|
# TODO: rewrite this! (it sucks..)
|
76
77
|
|
77
78
|
def find_file_in_targetdir(endpath)
|
78
|
-
pattern= [
|
79
|
+
pattern= [get_confManager.target_dir,"**/*#{File.extname(endpath)}"].join('/')
|
79
80
|
#puts "searcing for files in #{pattern} ending with #{endpath}"
|
80
81
|
Dir[pattern].find{|path| path =~ Regexp.new("#{endpath}$")}
|
81
82
|
end
|
82
83
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
84
|
+
|
85
|
+
# Prints to STDERR and adds a log entry.
|
86
|
+
#
|
87
|
+
# Log entries can be of four types:
|
88
|
+
#
|
89
|
+
# * info
|
90
|
+
# * warning
|
91
|
+
# * error
|
92
|
+
# * debug
|
93
|
+
#
|
94
|
+
|
95
|
+
def notify( message, log_level=:info)
|
96
|
+
raise "Log level #{log_level} does not exist!" unless [:info,:warn,:error,:debug].include?(log_level.to_sym)
|
97
|
+
cm=get_confManager
|
98
|
+
|
99
|
+
$log=Logger.new( "#{cm.target_dir}/sqweeze.log" ) unless $log
|
100
|
+
$log.send(log_level, ansi_nocolour(message))
|
101
|
+
|
102
|
+
puts message unless cm.get_conf( "suppress_#{log_level}".to_sym)
|
103
|
+
end
|
104
|
+
|
105
|
+
def ansi_bold(bold)
|
106
|
+
"\033[1m#{bold}\033[0m"
|
107
|
+
end
|
108
|
+
def ansi_red(red)
|
109
|
+
"\033[31m#{red}\033[0m"
|
110
|
+
end
|
111
|
+
def ansi_green(green)
|
112
|
+
"\033[32m#{green}\033[0m"
|
113
|
+
end
|
114
|
+
def ansi_yellow(yellow)
|
115
|
+
"\033[33m#{yellow}\033[0m"
|
116
|
+
end
|
117
|
+
def ansi_nocolour(text)
|
118
|
+
text.gsub(/\033\[[0-9]{1,2}/,'')
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
def get_confManager
|
123
|
+
(@cm) ? @cm : self
|
124
|
+
end
|
125
|
+
end
|
data/sqweeze.gemspec
CHANGED