juicer 1.0.13 → 1.0.14
Sign up to get free protection for your applications and to get access to all the features.
- data/GPATH +0 -0
- data/GRTAGS +0 -0
- data/GSYMS +0 -0
- data/GTAGS +0 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +33 -0
- data/History.txt +3 -0
- data/Rakefile +96 -0
- data/VERSION +1 -1
- data/lib/juicer.rb +1 -1
- data/lib/juicer/asset/path.rb +10 -10
- data/lib/juicer/asset/path_resolver.rb +2 -2
- data/lib/juicer/binary.rb +1 -1
- data/lib/juicer/cache_buster.rb +1 -1
- data/lib/juicer/command/merge.rb +10 -8
- data/lib/juicer/datafy/datafy.rb +2 -2
- data/lib/juicer/dependency_resolver/css_dependency_resolver.rb +29 -29
- data/lib/juicer/dependency_resolver/javascript_dependency_resolver.rb +23 -23
- data/lib/juicer/image_embed.rb +24 -18
- data/lib/juicer/install/closure_compiler_installer.rb +1 -1
- data/lib/juicer/install/rhino_installer.rb +1 -1
- data/lib/juicer/install/yui_compressor_installer.rb +1 -1
- data/lib/juicer/merger/javascript_merger.rb +29 -29
- data/lib/juicer/merger/stylesheet_merger.rb +111 -111
- data/lib/juicer/minifyer/java_base.rb +8 -1
- data/test/bin/jslint-1.0.js +523 -0
- data/test/bin/jslint.js +523 -0
- data/test/bin/rhino1_7R1.zip +0 -0
- data/test/bin/rhino1_7R2-RC1.jar +0 -0
- data/test/bin/rhino1_7R2-RC1.zip +0 -0
- data/test/bin/rhino1_7R3.jar +0 -0
- data/test/bin/rhino1_7R3.zip +0 -0
- data/test/bin/yuicompressor +0 -0
- data/test/bin/yuicompressor-2.3.5.zip +0 -0
- data/test/bin/yuicompressor-2.4.2.jar +0 -0
- data/test/bin/yuicompressor-2.4.2.zip +0 -0
- data/test/data/Changelog.txt +10 -0
- data/test/data/a.css +3 -0
- data/test/data/a.js +5 -0
- data/test/data/a1.css +5 -0
- data/test/data/b.css +1 -0
- data/test/data/b.js +5 -0
- data/test/data/b1.css +5 -0
- data/test/data/b2.css +5 -0
- data/test/data/c1.css +3 -0
- data/test/data/css/2.gif +1 -0
- data/test/data/css/test.css +15 -0
- data/test/data/css/test2.css +1 -0
- data/test/data/css/test3.css +12 -0
- data/test/data/d1.css +3 -0
- data/test/data/images/1.png +1 -0
- data/test/data/my_app.js +2 -0
- data/test/data/not-ok.js +2 -0
- data/test/data/ok.js +3 -0
- data/test/data/path_test.css +5 -0
- data/test/data/path_test2.css +14 -0
- data/test/data/pkg/module/moda.js +2 -0
- data/test/data/pkg/module/modb.js +3 -0
- data/test/data/pkg/pkg.js +1 -0
- data/test/fixtures/rhino-download.html +42 -0
- data/test/fixtures/yui-download.html +375 -0
- data/test/test_helper.rb +10 -7
- data/test/unit/juicer/cache_buster_test.rb +1 -1
- data/test/unit/juicer/command/install_test.rb +2 -2
- data/test/unit/juicer/command/merge_test.rb +3 -3
- data/test/unit/juicer/command/verify_test.rb +2 -2
- data/test/unit/juicer/css_cache_buster_test.rb +2 -2
- data/test/unit/juicer/datafy_test.rb +1 -1
- data/test/unit/juicer/image_embed_test.rb +39 -6
- data/test/unit/juicer/jslint_test.rb +3 -3
- data/test/unit/juicer/merger/stylesheet_merger_test.rb +1 -1
- data/test/unit/juicer/minifyer/closure_compressor_test.rb +4 -4
- data/test/unit/juicer/minifyer/yui_compressor_test.rb +21 -4
- data/test/unit/juicer_test.rb +1 -1
- metadata +180 -154
data/GPATH
ADDED
Binary file
|
data/GRTAGS
ADDED
Binary file
|
data/GSYMS
ADDED
Binary file
|
data/GTAGS
ADDED
Binary file
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
juicer (1.0.9)
|
5
|
+
cmdparse
|
6
|
+
nokogiri
|
7
|
+
rubyzip
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
cmdparse (2.0.3)
|
13
|
+
fakefs (0.3.2)
|
14
|
+
git (1.2.5)
|
15
|
+
jeweler (1.6.0)
|
16
|
+
bundler (~> 1.0.0)
|
17
|
+
git (>= 1.2.5)
|
18
|
+
rake
|
19
|
+
mocha (0.9.12)
|
20
|
+
nokogiri (1.4.4.1-x86-mingw32)
|
21
|
+
rake (0.9.0)
|
22
|
+
rubyzip (0.9.4)
|
23
|
+
shoulda (2.11.3)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
x86-mingw32
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
fakefs (>= 0.2.1)
|
30
|
+
jeweler (>= 0.2.1)
|
31
|
+
juicer!
|
32
|
+
mocha (>= 0.9.8)
|
33
|
+
shoulda (>= 2.10.2)
|
data/History.txt
CHANGED
data/Rakefile
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'jeweler'
|
8
|
+
Jeweler::Tasks.new do |gem|
|
9
|
+
gem.name = "juicer"
|
10
|
+
gem.summary = "Command line tool for CSS and JavaScript developers"
|
11
|
+
gem.description = "Resolve dependencies, merge and minify CSS and JavaScript files with Juicer - the command line tool for frontend engineers"
|
12
|
+
gem.email = "christian@cjohansen.no"
|
13
|
+
gem.homepage = "http://github.com/cjohansen/juicer"
|
14
|
+
gem.authors = ["Christian Johansen"]
|
15
|
+
gem.rubyforge_project = "juicer"
|
16
|
+
gem.add_development_dependency "shoulda", ">= 2.10.2"
|
17
|
+
gem.add_development_dependency "mocha", ">= 0.9.8"
|
18
|
+
gem.add_development_dependency "fakefs", ">= 0.2.1"
|
19
|
+
gem.add_development_dependency "jeweler", ">= 0.2.1"
|
20
|
+
gem.add_development_dependency "redgreen", ">= 1.2.2" if RUBY_VERSION < "1.9"
|
21
|
+
gem.add_dependency "cmdparse"
|
22
|
+
gem.add_dependency "nokogiri", ">= 1.5.0"
|
23
|
+
gem.add_dependency "rubyzip"
|
24
|
+
gem.executables = ["juicer"]
|
25
|
+
gem.post_install_message = <<-MSG
|
26
|
+
Juicer does not ship with third party libraries. You probably want to install
|
27
|
+
Yui Compressor and JsLint now:
|
28
|
+
|
29
|
+
juicer install yui_compressor
|
30
|
+
juicer install jslint
|
31
|
+
|
32
|
+
Happy juicing!
|
33
|
+
MSG
|
34
|
+
gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*"]
|
35
|
+
end
|
36
|
+
|
37
|
+
Jeweler::GemcutterTasks.new
|
38
|
+
Jeweler::RubyforgeTasks.new do |rubyforge|
|
39
|
+
rubyforge.doc_task = "rdoc"
|
40
|
+
end
|
41
|
+
rescue LoadError => err
|
42
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
43
|
+
puts err.message
|
44
|
+
end
|
45
|
+
|
46
|
+
Rake::TestTask.new("test:units") do |test|
|
47
|
+
test.libs << 'test'
|
48
|
+
test.pattern = 'test/unit/**/*_test.rb'
|
49
|
+
test.verbose = true
|
50
|
+
end
|
51
|
+
|
52
|
+
Rake::TestTask.new("test:integration") do |test|
|
53
|
+
test.libs << 'test'
|
54
|
+
test.pattern = 'test/integration/**/*_test.rb'
|
55
|
+
test.verbose = true
|
56
|
+
end
|
57
|
+
|
58
|
+
task :test => ["check_dependencies:development", "test:units", "test:integration"]
|
59
|
+
|
60
|
+
task :default => "test:units"
|
61
|
+
|
62
|
+
# lib/tasks/cruise.rake
|
63
|
+
desc 'Continuous build target'
|
64
|
+
task :cruise do
|
65
|
+
out = ENV['CC_BUILD_ARTIFACTS']
|
66
|
+
mkdir_p out unless File.directory? out if out
|
67
|
+
|
68
|
+
Rake::Task["rcov"].invoke
|
69
|
+
mv 'coverage/', "#{out}/" if out
|
70
|
+
end
|
71
|
+
|
72
|
+
begin
|
73
|
+
require 'rcov/rcovtask'
|
74
|
+
Rcov::RcovTask.new do |test|
|
75
|
+
test.libs << 'test'
|
76
|
+
test.pattern = 'test/**/*_test.rb'
|
77
|
+
test.verbose = true
|
78
|
+
end
|
79
|
+
rescue LoadError
|
80
|
+
task :rcov do
|
81
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
Rake::RDocTask.new do |rdoc|
|
86
|
+
if File.exist?('VERSION')
|
87
|
+
version = File.read('VERSION')
|
88
|
+
else
|
89
|
+
version = ""
|
90
|
+
end
|
91
|
+
|
92
|
+
rdoc.rdoc_dir = 'rdoc'
|
93
|
+
rdoc.title = "jstdutil #{version}"
|
94
|
+
rdoc.rdoc_files.include('README*')
|
95
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
96
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.14
|
data/lib/juicer.rb
CHANGED
data/lib/juicer/asset/path.rb
CHANGED
@@ -16,35 +16,35 @@ module Juicer
|
|
16
16
|
#
|
17
17
|
# Dir.pwd
|
18
18
|
# #=> "/home/christian/projects/mysite/design/css"
|
19
|
-
#
|
19
|
+
#
|
20
20
|
# asset = Juicer::Asset::Path.new "../images/logo.png"
|
21
21
|
# asset.path
|
22
22
|
# #=> "../images/logo.png"
|
23
|
-
#
|
23
|
+
#
|
24
24
|
# asset.rebase("~/projects/mysite/design").path
|
25
25
|
# #=> "images/logo.png"
|
26
|
-
#
|
26
|
+
#
|
27
27
|
# asset.filename
|
28
28
|
# #=> "/home/christian/projects/mysite/design/images/logo.png"
|
29
|
-
#
|
29
|
+
#
|
30
30
|
# asset.path(:cache_buster_type => :soft)
|
31
31
|
# #=> "../images/logo.png?jcb=1234567890"
|
32
|
-
#
|
32
|
+
#
|
33
33
|
# asset.path(:cache_buster_type => :soft, :cache_buster => nil)
|
34
34
|
# #=> "../images/logo.png?1234567890"
|
35
|
-
#
|
35
|
+
#
|
36
36
|
# asset.path(:cache_buster => "bustIT")
|
37
37
|
# #=> "../images/logo.png?bustIT=1234567890"
|
38
|
-
#
|
38
|
+
#
|
39
39
|
# asset = Juicer::Asset::Path.new "../images/logo.png", :document_root
|
40
40
|
# #=> "/home/christian/projects/mysite"
|
41
|
-
#
|
41
|
+
#
|
42
42
|
# asset.absolute_path(:cache_buster_type => :hard)
|
43
43
|
# #=> "/images/logo-jcb1234567890.png"
|
44
|
-
#
|
44
|
+
#
|
45
45
|
# asset.absolute_path(:host => "http://localhost")
|
46
46
|
# #=> "http://localhost/images/logo.png"
|
47
|
-
#
|
47
|
+
#
|
48
48
|
# asset.absolute_path(:host => "http://localhost", :cache_buster_type => :hard)
|
49
49
|
# #=> "http://localhost/images/logo-jcb1234567890.png"
|
50
50
|
#
|
@@ -16,10 +16,10 @@ module Juicer
|
|
16
16
|
# asset = path_resolver.resolve("../images/logo.png")
|
17
17
|
# asset.document_root
|
18
18
|
# #=> "/var/www"
|
19
|
-
#
|
19
|
+
#
|
20
20
|
# asset.absolute_path(path_resolver.cycle_hosts)
|
21
21
|
# #=> "http://assets1.mysite.com/images/logo.png"
|
22
|
-
#
|
22
|
+
#
|
23
23
|
# asset = path_resolver.resolve("/favicon.ico")
|
24
24
|
# asset.absolute_path(path_resolver.cycle_hosts)
|
25
25
|
# #=> "http://assets2.mysite.com/favicon.ico"
|
data/lib/juicer/binary.rb
CHANGED
@@ -129,7 +129,7 @@ module Juicer
|
|
129
129
|
#
|
130
130
|
def locate(bin_glob, env = nil)
|
131
131
|
path << ENV[env] if env && ENV.key?(env) && File.exist?(ENV[env])
|
132
|
-
|
132
|
+
|
133
133
|
(path << Dir.pwd).each do |path|
|
134
134
|
files = Dir.glob(File.expand_path(File.join(path, bin_glob)))
|
135
135
|
return files unless files.empty?
|
data/lib/juicer/cache_buster.rb
CHANGED
data/lib/juicer/command/merge.rb
CHANGED
@@ -30,7 +30,8 @@ module Juicer
|
|
30
30
|
@absolute_urls = false # Make the merger use absolute URLs
|
31
31
|
@local_hosts = [] # Host names that are served from :document_root
|
32
32
|
@verify = true # Verify js files with JsLint
|
33
|
-
|
33
|
+
@image_embed_type = :none # Embed images in css files, options are :none, :data_uri
|
34
|
+
@force_image_embed = false
|
34
35
|
|
35
36
|
@log = log || Logger.new(STDOUT)
|
36
37
|
|
@@ -75,7 +76,7 @@ the compressor the path should be the path to where the jar file is found.
|
|
75
76
|
(" " * 37) + "Works with cycled asset hosts. Only valid for CSS files") { |t| @absolute_urls = true }
|
76
77
|
opt.on("-d", "--document-root dir", "Path to resolve absolute URLs relative to") { |path| @document_root = path }
|
77
78
|
opt.on("-c", "--cache-buster type", "none, soft, rails, or hard. Default is soft, which adds timestamps to\n" +
|
78
|
-
(" " * 37) + "reference URLs as query parameters. None leaves URLs untouched, rails adds\n" +
|
79
|
+
(" " * 37) + "reference URLs as query parameters. None leaves URLs untouched, rails adds\n" +
|
79
80
|
(" " * 37) + "timestamps in the same format as Rails' image_tag helper, and hard alters\n" +
|
80
81
|
(" " * 37) + "file names") do |type|
|
81
82
|
@cache_buster = [:soft, :hard, :rails].include?(type.to_sym) ? type.to_sym : nil
|
@@ -84,6 +85,7 @@ the compressor the path should be the path to where the jar file is found.
|
|
84
85
|
(" " * 37) + "None leaves URLs untouched. Candiate images must be flagged with '?embed=true to be considered") do |embed|
|
85
86
|
@image_embed_type = [:none, :data_uri].include?(embed.to_sym) ? embed.to_sym : nil
|
86
87
|
end
|
88
|
+
opt.on("", "--force-image-embed", "Will force all images to embed without having to tag with embed parameter") { @force_image_embed = true }
|
87
89
|
end
|
88
90
|
end
|
89
91
|
|
@@ -188,13 +190,13 @@ the compressor the path should be the path to where the jar file is found.
|
|
188
190
|
Juicer::CssCacheBuster.new(:document_root => @document_root, :type => @cache_buster, :hosts => @local_hosts)
|
189
191
|
end
|
190
192
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
193
|
+
#
|
194
|
+
# Load image embed, only available for CSS files
|
195
|
+
#
|
196
|
+
def image_embed(file)
|
195
197
|
return nil if !file || file !~ /\.css$/ || @image_embed_type.nil?
|
196
|
-
Juicer::ImageEmbed.new(:document_root => @document_root, :type => @image_embed_type )
|
197
|
-
|
198
|
+
Juicer::ImageEmbed.new(:document_root => @document_root, :type => @image_embed_type, :force => @force_image_embed )
|
199
|
+
end
|
198
200
|
|
199
201
|
#
|
200
202
|
# Generate output file name. Optional argument is a filename to base the new
|
data/lib/juicer/datafy/datafy.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
require "juicer/dependency_resolver/dependency_resolver"
|
2
|
-
|
3
|
-
module Juicer
|
4
|
-
|
5
|
-
# Resolves @import statements in CSS files and builds a list of all
|
6
|
-
# files, in order.
|
7
|
-
#
|
8
|
-
class CssDependencyResolver < DependencyResolver
|
9
|
-
# Regexp borrowed from similar project:
|
10
|
-
# http://github.com/cgriego/front-end-blender/tree/master/lib/front_end_architect/blender.rb
|
11
|
-
@@import_pattern = /^\s*@import(?:\surl\(|\s)(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]*))?\1\)?(?:[^?;]*);?/im
|
12
|
-
|
13
|
-
private
|
14
|
-
def parse(line, imported_file = nil)
|
15
|
-
return $2 if line =~ @@import_pattern
|
16
|
-
|
17
|
-
# At first sight of actual CSS rules we abort (TODO: This does not take
|
18
|
-
# into account the fact that rules may be commented out and that more
|
19
|
-
# imports may follow)
|
20
|
-
throw :done if imported_file && line =~ %r{/*}
|
21
|
-
throw :done if line =~ /^[\.\#a-zA-Z\:]/
|
22
|
-
end
|
23
|
-
|
24
|
-
def extension
|
25
|
-
".css"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
1
|
+
require "juicer/dependency_resolver/dependency_resolver"
|
2
|
+
|
3
|
+
module Juicer
|
4
|
+
|
5
|
+
# Resolves @import statements in CSS files and builds a list of all
|
6
|
+
# files, in order.
|
7
|
+
#
|
8
|
+
class CssDependencyResolver < DependencyResolver
|
9
|
+
# Regexp borrowed from similar project:
|
10
|
+
# http://github.com/cgriego/front-end-blender/tree/master/lib/front_end_architect/blender.rb
|
11
|
+
@@import_pattern = /^\s*@import(?:\surl\(|\s)(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]*))?\1\)?(?:[^?;]*);?/im
|
12
|
+
|
13
|
+
private
|
14
|
+
def parse(line, imported_file = nil)
|
15
|
+
return $2 if line =~ @@import_pattern
|
16
|
+
|
17
|
+
# At first sight of actual CSS rules we abort (TODO: This does not take
|
18
|
+
# into account the fact that rules may be commented out and that more
|
19
|
+
# imports may follow)
|
20
|
+
throw :done if imported_file && line =~ %r{/*}
|
21
|
+
throw :done if line =~ /^[\.\#a-zA-Z\:]/
|
22
|
+
end
|
23
|
+
|
24
|
+
def extension
|
25
|
+
".css"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -1,23 +1,23 @@
|
|
1
|
-
require "juicer/dependency_resolver/dependency_resolver"
|
2
|
-
|
3
|
-
module Juicer
|
4
|
-
# Resolves @depends and @depend statements in comments in JavaScript files.
|
5
|
-
# Only the first comment in a JavaScript file is parsed
|
6
|
-
#
|
7
|
-
class JavaScriptDependencyResolver < DependencyResolver
|
8
|
-
@@depends_pattern = /\@depends?\s+([^\s\'\"\;]+)/
|
9
|
-
|
10
|
-
private
|
11
|
-
def parse(line, imported_file = nil)
|
12
|
-
return $1 if line =~ @@depends_pattern
|
13
|
-
|
14
|
-
# If we have already skimmed through some @depend/@depends or a
|
15
|
-
# closing comment we're done.
|
16
|
-
throw :done unless imported_file.nil? || !(line =~ /\*\//)
|
17
|
-
end
|
18
|
-
|
19
|
-
def extension
|
20
|
-
".js"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
1
|
+
require "juicer/dependency_resolver/dependency_resolver"
|
2
|
+
|
3
|
+
module Juicer
|
4
|
+
# Resolves @depends and @depend statements in comments in JavaScript files.
|
5
|
+
# Only the first comment in a JavaScript file is parsed
|
6
|
+
#
|
7
|
+
class JavaScriptDependencyResolver < DependencyResolver
|
8
|
+
@@depends_pattern = /\@depends?\s+([^\s\'\"\;]+)/
|
9
|
+
|
10
|
+
private
|
11
|
+
def parse(line, imported_file = nil)
|
12
|
+
return $1 if line =~ @@depends_pattern
|
13
|
+
|
14
|
+
# If we have already skimmed through some @depend/@depends or a
|
15
|
+
# closing comment we're done.
|
16
|
+
throw :done unless imported_file.nil? || !(line =~ /\*\//)
|
17
|
+
end
|
18
|
+
|
19
|
+
def extension
|
20
|
+
".js"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/juicer/image_embed.rb
CHANGED
@@ -6,18 +6,18 @@ module Juicer
|
|
6
6
|
#
|
7
7
|
# The ImageEmbed is a tool that can parse a CSS file and substitute all
|
8
8
|
# referenced URLs by a data uri
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# - data uri (http://en.wikipedia.org/wiki/Data_URI_scheme)
|
11
|
-
#
|
11
|
+
#
|
12
12
|
# Only local resources will be processed this way, external resources referenced
|
13
13
|
# by absolute urls will be left alone
|
14
|
-
#
|
14
|
+
#
|
15
15
|
class ImageEmbed
|
16
16
|
include Juicer::Chainable
|
17
17
|
|
18
18
|
# The maximum supported limit for modern browsers, See the Readme.rdoc for details
|
19
19
|
SIZE_LIMIT = 32768
|
20
|
-
|
20
|
+
|
21
21
|
#
|
22
22
|
# Returns the size limit
|
23
23
|
#
|
@@ -33,6 +33,7 @@ module Juicer
|
|
33
33
|
@hosts = options[:hosts]
|
34
34
|
@path_resolver = Juicer::Asset::PathResolver.new(:document_root => options[:document_root],
|
35
35
|
:hosts => options[:hosts])
|
36
|
+
@force = options[:force]
|
36
37
|
end
|
37
38
|
|
38
39
|
#
|
@@ -55,22 +56,22 @@ module Juicer
|
|
55
56
|
duplicates = duplicate_urls(assets)
|
56
57
|
|
57
58
|
if duplicates.length > 0
|
58
|
-
Juicer::LOGGER.warn("Duplicate image urls detected, these images will not be embedded: #{duplicates.collect { |v| v.gsub('?embed=true', '') }.inspect}")
|
59
|
+
Juicer::LOGGER.warn("Duplicate image urls detected, these images will not be embedded: #{duplicates.collect { |v| v.gsub('?embed=true', '') }.inspect}")
|
59
60
|
end
|
60
61
|
|
61
62
|
assets.each do |asset|
|
62
63
|
begin
|
63
64
|
next if used.include?(asset) || duplicates.include?(asset.path)
|
64
65
|
used << asset
|
65
|
-
|
66
|
+
|
66
67
|
# make sure we do not exceed SIZE_LIMIT
|
67
68
|
new_path = embed_data_uri(asset.filename)
|
68
69
|
|
69
70
|
if new_path.length < SIZE_LIMIT
|
70
71
|
# replace the url in the css file with the data uri
|
71
|
-
@contents.gsub!(asset.path, embed_data_uri(asset.filename)) if asset.filename.match( /\?embed=true$/ )
|
72
|
+
@contents.gsub!(asset.path, embed_data_uri(asset.filename)) if @force || asset.filename.match( /\?embed=true$/ )
|
72
73
|
else
|
73
|
-
Juicer::LOGGER.warn("The final data uri for the image located at #{asset.path.gsub('?embed=true', '')} exceeds #{SIZE_LIMIT} and will not be embedded to maintain compatability.")
|
74
|
+
Juicer::LOGGER.warn("The final data uri for the image located at #{asset.path.gsub('?embed=true', '')} exceeds #{SIZE_LIMIT} and will not be embedded to maintain compatability.")
|
74
75
|
end
|
75
76
|
rescue Errno::ENOENT
|
76
77
|
puts "Unable to locate file #{asset.path}, skipping image embedding"
|
@@ -82,23 +83,28 @@ module Juicer
|
|
82
83
|
end
|
83
84
|
|
84
85
|
chain_method :save
|
85
|
-
|
86
|
+
|
86
87
|
def embed_data_uri( path )
|
87
88
|
new_path = path
|
88
|
-
|
89
|
-
|
89
|
+
|
90
|
+
if @force
|
91
|
+
supported_file_matches = path.match( /(?:\.)(png|gif|jpg|jpeg)$/i )
|
92
|
+
else
|
93
|
+
supported_file_matches = path.match( /(?:\.)(png|gif|jpg|jpeg)(?:\?embed=true)$/i )
|
94
|
+
end
|
95
|
+
|
90
96
|
filetype = supported_file_matches[1] if supported_file_matches
|
91
|
-
|
92
|
-
if ( filetype )
|
93
|
-
filename = path.gsub('?embed=true','')
|
94
|
-
|
97
|
+
|
98
|
+
if ( filetype )
|
99
|
+
filename = path.gsub('?embed=true','')
|
100
|
+
|
95
101
|
# check if file exists, throw an error if it doesn't exist
|
96
102
|
if File.exist?( filename )
|
97
|
-
|
98
|
-
# read contents of file into memory
|
103
|
+
|
104
|
+
# read contents of file into memory
|
99
105
|
content = File.read( filename )
|
100
106
|
content_type = "image/#{filetype}"
|
101
|
-
|
107
|
+
|
102
108
|
# encode the url
|
103
109
|
new_path = Datafy::make_data_uri( content, content_type )
|
104
110
|
else
|