Sprockets v2 support for JS
This commit is contained in:
parent
142e6b9f24
commit
cf574800c8
6 changed files with 86 additions and 76 deletions
6
features/sprockets.feature
Normal file
6
features/sprockets.feature
Normal file
|
@ -0,0 +1,6 @@
|
|||
Feature: Sprockets
|
||||
|
||||
Scenario: Sprockets require
|
||||
Given the Server is running
|
||||
When I go to "/javascripts/sprockets_base.js"
|
||||
Then I should see "sprockets_sub_function"
|
5
fixtures/test-app/source/javascripts/sprockets_base.js
Normal file
5
fixtures/test-app/source/javascripts/sprockets_base.js
Normal file
|
@ -0,0 +1,5 @@
|
|||
//= require "sprockets_sub"
|
||||
|
||||
function base() {
|
||||
|
||||
}
|
3
fixtures/test-app/source/javascripts/sprockets_sub.js
Normal file
3
fixtures/test-app/source/javascripts/sprockets_sub.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
function sprockets_sub_function() {
|
||||
|
||||
}
|
|
@ -3,27 +3,49 @@ require "sprockets"
|
|||
module Middleman::CoreExtensions::Sprockets
|
||||
class << self
|
||||
def registered(app)
|
||||
# app.map '/assets' do
|
||||
# run ::Sprockets::Environment.new
|
||||
app.set :js_compressor, false
|
||||
|
||||
app.map "/#{app.js_dir}" do
|
||||
run JavascriptEnvironment.new(app)
|
||||
end
|
||||
# app.map "/#{app.css_dir}" do
|
||||
# run StylesheetEnvironment.new(app)
|
||||
# end
|
||||
end
|
||||
alias :included :registered
|
||||
end
|
||||
|
||||
class Environment < Sprockets::Environment
|
||||
|
||||
# Pass in the project you want the pipeline to manage.
|
||||
def initialize(app, mode = :debug)
|
||||
# Views/ ?
|
||||
super app.root
|
||||
|
||||
# Disable css for now
|
||||
# unregister_processor "text/css", Sprockets::DirectiveProcessor
|
||||
class MiddlemanEnvironment < Sprockets::Environment
|
||||
def initialize(app)
|
||||
super File.expand_path(app.views)
|
||||
end
|
||||
end
|
||||
|
||||
class JavascriptEnvironment < MiddlemanEnvironment
|
||||
def initialize(app)
|
||||
super
|
||||
|
||||
# Disable css
|
||||
unregister_processor "text/css", ::Sprockets::DirectiveProcessor
|
||||
|
||||
self.js_compressor = app.settings.js_compressor
|
||||
|
||||
# configure search paths
|
||||
# append_path File.dirname project_path
|
||||
# append_path File.join project_path, 'assets'
|
||||
javascripts_path = File.join(File.expand_path(app.views), app.js_dir)
|
||||
append_path javascripts_path
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# class StylesheetEnvironment < MiddlemanEnvironment
|
||||
# def initialize(app)
|
||||
# super
|
||||
#
|
||||
# # Disable js
|
||||
# unregister_processor "application/javascript", ::Sprockets::DirectiveProcessor
|
||||
#
|
||||
# # configure search paths
|
||||
# stylesheets_path = File.join(File.expand_path(app.views), app.css_dir)
|
||||
# append_path stylesheets_path
|
||||
# end
|
||||
# end
|
||||
end
|
|
@ -1,12 +1,43 @@
|
|||
module Middleman::Features::MinifyJavascript
|
||||
class << self
|
||||
def registered(app)
|
||||
# Only do minification on build or prod mode
|
||||
return unless app.build? || app.production?
|
||||
|
||||
require "middleman/features/minify_javascript/rack"
|
||||
app.use Middleman::Rack::MinifyJavascript
|
||||
require 'uglifier'
|
||||
app.set :js_compressor, ::Uglifier.new
|
||||
app.use InlineJavascriptRack
|
||||
end
|
||||
alias :included :registered
|
||||
end
|
||||
|
||||
class InlineJavascriptRack
|
||||
def initialize(app, options={})
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
status, headers, response = @app.call(env)
|
||||
|
||||
if env["PATH_INFO"].match(/\.html$/)
|
||||
compressor = ::Uglifier.new
|
||||
|
||||
if response.is_a?(::Rack::File) or response.is_a?(::Sinatra::Helpers::StaticFile)
|
||||
uncompressed_source = File.read(response.path)
|
||||
else
|
||||
uncompressed_source = response.join
|
||||
end
|
||||
|
||||
minified = uncompressed_source.gsub(/(<scri.*?\/\/<!\[CDATA\[\n)(.*?)(\/\/\]\].*?<\/script>)/m) do |m|
|
||||
first = $1
|
||||
uncompressed_source = $2
|
||||
last = $3
|
||||
minified_js = compressor.compile(uncompressed_source)
|
||||
|
||||
first << minified_js << "\n" << last
|
||||
end
|
||||
headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
|
||||
response = [minified]
|
||||
end
|
||||
|
||||
[status, headers, response]
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,57 +0,0 @@
|
|||
begin
|
||||
require 'uglifier'
|
||||
rescue LoadError
|
||||
puts "UglifyJS not available. Install it with: gem install uglifier"
|
||||
end
|
||||
|
||||
module Middleman
|
||||
module Rack
|
||||
|
||||
class MinifyJavascript
|
||||
def initialize(app, options={})
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
status, headers, response = @app.call(env)
|
||||
|
||||
if env["PATH_INFO"].match(/\.js$/)
|
||||
compressor = ::Uglifier.new
|
||||
|
||||
if response.is_a?(::Rack::File) or response.is_a?(Sinatra::Helpers::StaticFile)
|
||||
uncompressed_source = File.read(response.path)
|
||||
else
|
||||
uncompressed_source = response.join
|
||||
end
|
||||
minified = compressor.compile(uncompressed_source)
|
||||
headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
|
||||
response = [minified]
|
||||
end
|
||||
|
||||
if env["PATH_INFO"].match(/\.html$/)
|
||||
compressor = ::Uglifier.new
|
||||
|
||||
if response.is_a?(::Rack::File) or response.is_a?(Sinatra::Helpers::StaticFile)
|
||||
uncompressed_source = File.read(response.path)
|
||||
else
|
||||
uncompressed_source = response.join
|
||||
end
|
||||
|
||||
minified = uncompressed_source.gsub(/(<scri.*?\/\/<!\[CDATA\[\n)(.*?)(\/\/\]\].*?<\/script>)/m) do |m|
|
||||
first = $1
|
||||
uncompressed_source = $2
|
||||
last = $3
|
||||
minified_js = compressor.compile(uncompressed_source)
|
||||
|
||||
first << minified_js << "\n" << last
|
||||
end
|
||||
headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
|
||||
response = [minified]
|
||||
end
|
||||
|
||||
[status, headers, response]
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue