jammit 0.2.7 → 0.2.8
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/jammit.gemspec +2 -2
- data/lib/jammit.rb +5 -3
- data/lib/jammit/compressor.rb +36 -16
- data/lib/jammit/controller.rb +2 -1
- data/lib/jammit/packager.rb +2 -2
- metadata +2 -2
data/jammit.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'jammit'
|
3
|
-
s.version = '0.2.
|
4
|
-
s.date = '2009-11-
|
3
|
+
s.version = '0.2.8' # Keep version in sync with jammit.rb
|
4
|
+
s.date = '2009-11-23'
|
5
5
|
|
6
6
|
s.homepage = "http://documentcloud.github.com/jammit/"
|
7
7
|
s.summary = "Industrial Strength Asset Packaging for Rails"
|
data/lib/jammit.rb
CHANGED
@@ -4,11 +4,13 @@ $LOAD_PATH.push File.expand_path(File.dirname(__FILE__))
|
|
4
4
|
# to all of the configuration options.
|
5
5
|
module Jammit
|
6
6
|
|
7
|
-
VERSION
|
7
|
+
VERSION = "0.2.8"
|
8
8
|
|
9
|
-
ROOT
|
9
|
+
ROOT = File.expand_path(File.dirname(__FILE__) + '/..')
|
10
10
|
|
11
|
-
ASSET_ROOT = defined?(RAILS_ROOT) ? RAILS_ROOT : "."
|
11
|
+
ASSET_ROOT = File.expand_path(defined?(RAILS_ROOT) ? RAILS_ROOT : ".")
|
12
|
+
|
13
|
+
PUBLIC_ROOT = "#{ASSET_ROOT}/public"
|
12
14
|
|
13
15
|
DEFAULT_CONFIG_PATH = "#{ASSET_ROOT}/config/assets.yml"
|
14
16
|
|
data/lib/jammit/compressor.rb
CHANGED
@@ -17,8 +17,9 @@ module Jammit
|
|
17
17
|
'.tiff' => 'image/tiff'
|
18
18
|
}
|
19
19
|
|
20
|
-
|
21
|
-
IMAGE_DETECTOR = /url\(['"]?([^\s)]
|
20
|
+
|
21
|
+
IMAGE_DETECTOR = /url\(['"]?([^\s)]+\.(png|jpg|jpeg|gif|tif|tiff))['"]?\)/
|
22
|
+
IMAGE_EMBED = /[\A\/]embed\//
|
22
23
|
IMAGE_REPLACER = /url\(__EMBED__([^\s)]+)\)/
|
23
24
|
|
24
25
|
# MHTML file constants.
|
@@ -57,11 +58,13 @@ module Jammit
|
|
57
58
|
# :datauri or :mhtml variant, post-processes the result to embed
|
58
59
|
# referenced images.
|
59
60
|
def compress_css(paths, variant=nil, asset_url=nil)
|
60
|
-
|
61
|
-
|
62
|
-
return
|
63
|
-
return
|
64
|
-
|
61
|
+
compressed_css = @css_compressor.compress(concatenate_and_tag_images(paths, variant))
|
62
|
+
case variant
|
63
|
+
when nil then return compressed_css
|
64
|
+
when :datauri then return with_data_uris(compressed_css)
|
65
|
+
when :mhtml then return with_mhtml(compressed_css, asset_url)
|
66
|
+
else raise PackageNotFound, "\"#{variant}\" is not a valid stylesheet variant"
|
67
|
+
end
|
65
68
|
end
|
66
69
|
|
67
70
|
# Compiles a single JST file by writing out a javascript that adds
|
@@ -86,11 +89,11 @@ module Jammit
|
|
86
89
|
# expand the paths before contatenating the CSS together and losing the
|
87
90
|
# location of the original stylesheet path. Validate the images while we're
|
88
91
|
# at it.
|
89
|
-
def concatenate_and_tag_images(paths)
|
92
|
+
def concatenate_and_tag_images(paths, variant=nil)
|
90
93
|
stylesheets = [paths].flatten.map do |css_path|
|
91
94
|
File.read(css_path).gsub(IMAGE_DETECTOR) do |url|
|
92
|
-
|
93
|
-
|
95
|
+
new_path = rewrite_image_path(Pathname.new($1), Pathname.new(File.expand_path(css_path)), !!variant)
|
96
|
+
"url(#{new_path})"
|
94
97
|
end
|
95
98
|
end
|
96
99
|
stylesheets.join("\n")
|
@@ -120,18 +123,35 @@ module Jammit
|
|
120
123
|
[MHTML_START, mhtml, MHTML_END, css].flatten.join('')
|
121
124
|
end
|
122
125
|
|
126
|
+
# Return a rewritten image URL for a new stylesheet -- the image should
|
127
|
+
# be tagged for embedding if embeddable, and referenced at the correct level
|
128
|
+
# if relative.
|
129
|
+
def rewrite_image_path(image_path, css_path, embed=false)
|
130
|
+
public_path = absolute_path(image_path, css_path)
|
131
|
+
return "__EMBED__#{public_path}" if embed && embeddable?(public_path)
|
132
|
+
image_path.relative? ? relative_path(public_path) : image_path.to_s
|
133
|
+
end
|
134
|
+
|
123
135
|
# Get the site-absolute public path for an image file path that may or may
|
124
136
|
# not be relative, given the path of the stylesheet that contains it.
|
125
|
-
def
|
126
|
-
|
127
|
-
|
137
|
+
def absolute_path(image_pathname, css_pathname)
|
138
|
+
(image_pathname.absolute? ?
|
139
|
+
Pathname.new(File.join(PUBLIC_ROOT, image_pathname)) :
|
140
|
+
css_pathname.dirname + image_pathname).cleanpath
|
141
|
+
end
|
142
|
+
|
143
|
+
# CSS images that are referenced by relative paths, and are *not* being
|
144
|
+
# embedded, must be rewritten relative to the newly-merged stylesheet path.
|
145
|
+
def relative_path(absolute_path)
|
146
|
+
File.join('../', absolute_path.sub(PUBLIC_ROOT, ''))
|
128
147
|
end
|
129
148
|
|
130
|
-
# An image is valid if it exists,
|
149
|
+
# An image is valid for embedding if it exists, is less than 32K, and is
|
150
|
+
# stored somewhere inside of a folder named "embed".
|
131
151
|
# IE does not support Data-URIs larger than 32K, and you probably shouldn't
|
132
152
|
# be embedding images that large in any case.
|
133
|
-
def
|
134
|
-
image_path.exist? && image_path.size < 32.kilobytes
|
153
|
+
def embeddable?(image_path)
|
154
|
+
image_path.to_s.match(IMAGE_EMBED) && image_path.exist? && image_path.size < 32.kilobytes
|
135
155
|
end
|
136
156
|
|
137
157
|
# Return the Base64-encoded contents of an image on a single line.
|
data/lib/jammit/controller.rb
CHANGED
@@ -9,7 +9,7 @@ module Jammit
|
|
9
9
|
|
10
10
|
SUFFIX_STRIPPER = /-(datauri|mhtml)\Z/
|
11
11
|
|
12
|
-
NOT_FOUND_PATH = "#{
|
12
|
+
NOT_FOUND_PATH = "#{PUBLIC_ROOT}/404.html"
|
13
13
|
|
14
14
|
after_filter :cache_package if perform_caching
|
15
15
|
|
@@ -82,6 +82,7 @@ module Jammit
|
|
82
82
|
|
83
83
|
end
|
84
84
|
|
85
|
+
# Make the Jammit::Controller available to Rails as a top-level controller.
|
85
86
|
::JammitController = Jammit::Controller
|
86
87
|
|
87
88
|
if RAILS_ENV == 'development'
|
data/lib/jammit/packager.rb
CHANGED
@@ -18,7 +18,7 @@ module Jammit
|
|
18
18
|
# create a new Packager.
|
19
19
|
def initialize
|
20
20
|
@compressor = Compressor.new
|
21
|
-
@force =
|
21
|
+
@force = false
|
22
22
|
@config = {
|
23
23
|
:css => (Jammit.configuration[:stylesheets] || {}).symbolize_keys,
|
24
24
|
:js => (Jammit.configuration[:javascripts] || {}).symbolize_keys,
|
@@ -37,7 +37,7 @@ module Jammit
|
|
37
37
|
# Unless forced, will only rebuild assets whose source files have been
|
38
38
|
# changed since their last package build.
|
39
39
|
def precache_all(output_dir=nil, base_url=nil)
|
40
|
-
output_dir ||=
|
40
|
+
output_dir ||= File.join(PUBLIC_ROOT, Jammit.package_path)
|
41
41
|
cacheable(:js, output_dir).each {|p| cache(p, 'js', pack_javascripts(p), output_dir) }
|
42
42
|
cacheable(:jst, output_dir).each {|p| cache(p, 'jst', pack_templates(p), output_dir) }
|
43
43
|
cacheable(:css, output_dir).each do |p|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jammit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Ashkenas
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-23 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|