sinatra-minify 0.0.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/.gitignore +2 -0
- data/README.md +15 -0
- data/Rakefile +16 -0
- data/VERSION +1 -0
- data/lib/sinatra/minify.rb +15 -0
- data/lib/sinatra/minify/builder.rb +212 -0
- data/lib/tasks.rake +10 -0
- data/sinatra-minify.gemspec +47 -0
- metadata +82 -0
data/.gitignore
ADDED
data/README.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Usage
|
2
|
+
-----
|
3
|
+
|
4
|
+
Add these to your `init.rb`;
|
5
|
+
|
6
|
+
require 'sinatra/minify'
|
7
|
+
class Main
|
8
|
+
register Sinatra::Minify
|
9
|
+
end
|
10
|
+
|
11
|
+
Add this to your `Rakefile`:
|
12
|
+
|
13
|
+
load 'vendor/sinatra-minify/lib/tasks.rake'
|
14
|
+
|
15
|
+
Type `rake minify:build` to build the compressed JS/CSS files.
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |s|
|
4
|
+
s.name = "sinatra-minify"
|
5
|
+
s.authors = ["sinefunc"]
|
6
|
+
s.email = "info@sinefunc.com"
|
7
|
+
s.summary = "CSS/JS compressor for Sinatra"
|
8
|
+
s.homepage = "http://www.github.com/sinefunc/sinatra-minify"
|
9
|
+
s.description = "sinatra-minify is an extension for Sinatra to compress assets."
|
10
|
+
s.add_dependency('jsmin', '>= 1.0.1')
|
11
|
+
end
|
12
|
+
Jeweler::GemcutterTasks.new
|
13
|
+
rescue LoadError
|
14
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
15
|
+
end
|
16
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require File.join(File.dirname(__FILE__), 'minify/builder')
|
3
|
+
|
4
|
+
module Sinatra
|
5
|
+
module Minify
|
6
|
+
def self.registered( app )
|
7
|
+
app.helpers Helpers
|
8
|
+
app.set :js_url, '/js' # => http://site.com/js
|
9
|
+
app.set :js_path, '/public/js' # => ~/myproject/public/js
|
10
|
+
app.set :css_url, '/css'
|
11
|
+
app.set :css_path, '/public/css'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
register Minify
|
15
|
+
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
module Sinatra
|
2
|
+
module Minify
|
3
|
+
module Helpers
|
4
|
+
def js_assets( set )
|
5
|
+
Builder.new(self.class).js_assets set
|
6
|
+
end
|
7
|
+
def css_assets( set )
|
8
|
+
Builder.new(self.class).css_assets set
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Builder
|
13
|
+
def build
|
14
|
+
out = []
|
15
|
+
[:js, :css].each do |type|
|
16
|
+
assets_config(type).keys.each do |set|
|
17
|
+
prefix = type == :js ? settings.js_path : settings.css_path
|
18
|
+
path = root_path File.join(prefix, "#{set}.min." + type.to_s)
|
19
|
+
File.open(path, 'w') << compress(type, set)
|
20
|
+
out << path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
out
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize( app_class = ::Main )
|
27
|
+
@app_class = app_class
|
28
|
+
end
|
29
|
+
|
30
|
+
def settings
|
31
|
+
@app_class
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns the file sets for a given type as defined in the `assets.yml` config file.
|
35
|
+
#
|
36
|
+
# Params:
|
37
|
+
# - `type` (Symbol/string) - Can be either `:javascripts` or `:stylesheets`
|
38
|
+
#
|
39
|
+
def assets_config(type)
|
40
|
+
YAML::load(File.open(root_path "config/assets.yml")) [type.to_s]
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns HTML code with `<script>` tags to include the scripts in a given `set`.
|
44
|
+
#
|
45
|
+
# Params:
|
46
|
+
# - `set` (String) - The set name, as defined in `config/assets.yml`.
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
#
|
50
|
+
# <%= js_assets 'base' %>
|
51
|
+
#
|
52
|
+
def js_assets( set )
|
53
|
+
if settings.production?
|
54
|
+
"<script src='#{settings.js_url}/#{set}.min.js' type='text/javascript'></script>\n"
|
55
|
+
else
|
56
|
+
js_assets_all set
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def js_assets_all( set )
|
61
|
+
ret = ''
|
62
|
+
assets(:js, set).each do |script|
|
63
|
+
ret << "<script src=\"#{script[:url]}\" type=\"text/javascript\"></script>\n"
|
64
|
+
end
|
65
|
+
ret
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns HTML code with `<link>` tags to include the stylesheets in a given `set`.
|
69
|
+
#
|
70
|
+
# Params:
|
71
|
+
# - `set` (String) - The set name, as defined in `config/assets.yml`.
|
72
|
+
#
|
73
|
+
# Example:
|
74
|
+
#
|
75
|
+
# <%= css_assets 'base' %>
|
76
|
+
#
|
77
|
+
def css_assets( set )
|
78
|
+
if settings.production?
|
79
|
+
"<link rel='stylesheet' href='#{settings.css_url}/#{set}.min.css' media='screen' />\n"
|
80
|
+
else
|
81
|
+
css_assets_all set
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def css_assets_all(set)
|
86
|
+
ret = ''
|
87
|
+
(assets_config :css) [set].each do |filename|
|
88
|
+
ret << "<link rel='stylesheet' href='#{settings.css_url}/#{filename}' media='screen' />\n"
|
89
|
+
end
|
90
|
+
ret
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns the raw consolidated CSS/JS contents of a given type/set
|
94
|
+
def combine( type, set )
|
95
|
+
assets(type, set).map { |asset| File.open(asset[:path]).read }.join "\n"
|
96
|
+
end
|
97
|
+
|
98
|
+
# Returns compressed code
|
99
|
+
def compress( type, set )
|
100
|
+
code = combine type, set
|
101
|
+
if type == :js
|
102
|
+
minify_js code
|
103
|
+
elsif type == :css
|
104
|
+
minify_css code
|
105
|
+
else
|
106
|
+
raise Exception.new
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def minify_css( src )
|
111
|
+
src.gsub!(/\s+/, " ")
|
112
|
+
src.gsub!(/\/\*(.*?)\*\//, "")
|
113
|
+
src.gsub!(/\} /, "}\n")
|
114
|
+
src.gsub!(/\n$/, "")
|
115
|
+
src.gsub!(/ \{ /, " {")
|
116
|
+
src.gsub!(/; \}/, "}")
|
117
|
+
src
|
118
|
+
end
|
119
|
+
|
120
|
+
def minify_js( src )
|
121
|
+
require 'jsmin'
|
122
|
+
JSMin.minify src
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# Returns the file path of where assets of a certain type are stored.
|
127
|
+
#
|
128
|
+
# Params:
|
129
|
+
# - `type` (Symbol) - Either `:js` or `:css`.
|
130
|
+
#
|
131
|
+
# Example:
|
132
|
+
# get_path :js
|
133
|
+
# # Possible value: "/home/rsc/myproject/public/js"
|
134
|
+
#
|
135
|
+
def get_path( type )
|
136
|
+
if type == :js
|
137
|
+
path = settings.js_path
|
138
|
+
else
|
139
|
+
path = settings.css_path
|
140
|
+
end
|
141
|
+
root_path(path.split('/').inject([]) { |arr, item| arr << item unless item.empty?; arr })
|
142
|
+
end
|
143
|
+
|
144
|
+
# Returns the URL for a given filename and a type.
|
145
|
+
#
|
146
|
+
# Params:
|
147
|
+
# - `type` (Symbol) - Either `:js` or `:css`.
|
148
|
+
#
|
149
|
+
# Example:
|
150
|
+
# get_url :js, '/path/to/file.js'
|
151
|
+
#
|
152
|
+
def get_url( type, filename )
|
153
|
+
if type == :js
|
154
|
+
prefix = settings.js_url
|
155
|
+
else
|
156
|
+
prefix = settings.css_url
|
157
|
+
end
|
158
|
+
# Remove the js_path from it (/home/rsc/project/public/js/aa/lol.js => aa/lol.js)
|
159
|
+
url = File.join(prefix, filename.split(get_path type).join(''))
|
160
|
+
|
161
|
+
# Remove duplicate slashes
|
162
|
+
url = url.split('/').inject([]) { |arr, item| arr << item unless item.empty?; arr }
|
163
|
+
'/' + url.join('/')
|
164
|
+
end
|
165
|
+
|
166
|
+
# Returns a list of assets of a given type for a given set.
|
167
|
+
#
|
168
|
+
# Params:
|
169
|
+
# - `type` (Symbol) - Either `:js` or `:css`.
|
170
|
+
# - `set` (String) - The set name, as defined in `config/assets.yml`.
|
171
|
+
#
|
172
|
+
# Returns:
|
173
|
+
# An array of objects.
|
174
|
+
#
|
175
|
+
# Example:
|
176
|
+
#
|
177
|
+
# puts assets(:js, 'base').to_json
|
178
|
+
# # Possible output:
|
179
|
+
# # [ { 'url': '/js/app.js', 'path': '/home/rsc/projects/assets/public/js/app.js' },
|
180
|
+
# # { 'url': '/js/main.js', 'path': '/home/rsc/projects/assets/public/js/main.js' },
|
181
|
+
# # ...
|
182
|
+
# # ]
|
183
|
+
#
|
184
|
+
# See also:
|
185
|
+
# - js_assets
|
186
|
+
#
|
187
|
+
def assets( type, set )
|
188
|
+
# type is either js or css
|
189
|
+
specs = (assets_config type) [set]
|
190
|
+
path = get_path type
|
191
|
+
ret = []
|
192
|
+
done = []
|
193
|
+
# `specs` will be a list of filespecs. Find all files that
|
194
|
+
# match all specs.
|
195
|
+
if specs.class == Array
|
196
|
+
specs.each do |spec|
|
197
|
+
Dir["#{path}/#{spec}"].each do |filename|
|
198
|
+
unless done.include? filename
|
199
|
+
ret << {
|
200
|
+
:url => get_url(type, filename),
|
201
|
+
:path => filename
|
202
|
+
}
|
203
|
+
done << filename
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
ret
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
data/lib/tasks.rake
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
namespace :minify do
|
2
|
+
desc "Builds the minified CSS and JS assets."
|
3
|
+
task :build do
|
4
|
+
require 'init'
|
5
|
+
puts "Building..."
|
6
|
+
files = Sinatra::Minify::Builder.new.build
|
7
|
+
files.each { |f| puts " * #{File.basename f}" }
|
8
|
+
puts "Construction complete!"
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{sinatra-minify}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["sinefunc"]
|
12
|
+
s.date = %q{2010-04-22}
|
13
|
+
s.description = %q{sinatra-minify is an extension for Sinatra to compress assets.}
|
14
|
+
s.email = %q{info@sinefunc.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"README.md",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"lib/sinatra/minify.rb",
|
24
|
+
"lib/sinatra/minify/builder.rb",
|
25
|
+
"lib/tasks.rake",
|
26
|
+
"sinatra-minify.gemspec"
|
27
|
+
]
|
28
|
+
s.homepage = %q{http://www.github.com/sinefunc/sinatra-minify}
|
29
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
30
|
+
s.require_paths = ["lib"]
|
31
|
+
s.rubygems_version = %q{1.3.6}
|
32
|
+
s.summary = %q{CSS/JS compressor for Sinatra}
|
33
|
+
|
34
|
+
if s.respond_to? :specification_version then
|
35
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
36
|
+
s.specification_version = 3
|
37
|
+
|
38
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
39
|
+
s.add_runtime_dependency(%q<jsmin>, [">= 1.0.1"])
|
40
|
+
else
|
41
|
+
s.add_dependency(%q<jsmin>, [">= 1.0.1"])
|
42
|
+
end
|
43
|
+
else
|
44
|
+
s.add_dependency(%q<jsmin>, [">= 1.0.1"])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sinatra-minify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- sinefunc
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-04-22 00:00:00 +08:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: jsmin
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 0
|
30
|
+
- 1
|
31
|
+
version: 1.0.1
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
description: sinatra-minify is an extension for Sinatra to compress assets.
|
35
|
+
email: info@sinefunc.com
|
36
|
+
executables: []
|
37
|
+
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files:
|
41
|
+
- README.md
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- README.md
|
45
|
+
- Rakefile
|
46
|
+
- VERSION
|
47
|
+
- lib/sinatra/minify.rb
|
48
|
+
- lib/sinatra/minify/builder.rb
|
49
|
+
- lib/tasks.rake
|
50
|
+
- sinatra-minify.gemspec
|
51
|
+
has_rdoc: true
|
52
|
+
homepage: http://www.github.com/sinefunc/sinatra-minify
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options:
|
57
|
+
- --charset=UTF-8
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.3.6
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: CSS/JS compressor for Sinatra
|
81
|
+
test_files: []
|
82
|
+
|