From 57c80f00e75b0d5f3ab875aba20715e76f43d68f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20D=C3=B6ring?= Date: Sun, 29 May 2011 17:26:58 +0200 Subject: [PATCH] minifiy inline js --- features/minify_javascript.feature | 20 +++++++++---- features/step_definitions/middleman_steps.rb | 5 ++++ fixtures/test-app/source/inline-js.html.haml | 2 +- .../features/minify_javascript/rack.rb | 29 +++++++++++++++---- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/features/minify_javascript.feature b/features/minify_javascript.feature index ce63d2d9..a5ff4a59 100644 --- a/features/minify_javascript.feature +++ b/features/minify_javascript.feature @@ -1,12 +1,20 @@ Feature: Minify Javascript In order reduce bytes sent to client and appease YSlow - + + Background: + Given current environment is "build" + Scenario: Rendering inline js with the feature disabled Given "minify_javascript" feature is "disabled" When I go to "/inline-js.html" Then I should see "10" lines - - # Scenario: Rendering inline js with the feature enabled - # Given "minify_javascript" feature is "enabled" - # When I go to "/inline-js.html" - # Then I should see "1" lines \ No newline at end of file + + Scenario: Rendering inline js with the feature enabled + Given "minify_javascript" feature is "enabled" + When I go to "/inline-js.html" + Then I should see "5" lines + + Scenario: Rendering inline js (coffeescript) with the feature enabled + Given "minify_javascript" feature is "enabled" + When I go to "/inline-coffeescript.html" + Then I should see "5" lines \ No newline at end of file diff --git a/features/step_definitions/middleman_steps.rb b/features/step_definitions/middleman_steps.rb index cb793bef..80ec4821 100644 --- a/features/step_definitions/middleman_steps.rb +++ b/features/step_definitions/middleman_steps.rb @@ -2,9 +2,14 @@ Given /^"([^\"]*)" feature is "([^\"]*)"$/ do |feature, state| if state == "enabled" Middleman::Server.activate(feature.to_sym) end + Middleman::Server.environment = @current_env || :development @browser = Rack::Test::Session.new(Rack::MockSession.new(Middleman::Server.new)) end +Given /^current environment is "([^\"]*)"$/ do |env| + @current_env = env.to_sym +end + Given /^the Server is running$/ do @browser = Rack::Test::Session.new(Rack::MockSession.new(Middleman::Server.new)) end diff --git a/fixtures/test-app/source/inline-js.html.haml b/fixtures/test-app/source/inline-js.html.haml index 27d3ca64..06197239 100755 --- a/fixtures/test-app/source/inline-js.html.haml +++ b/fixtures/test-app/source/inline-js.html.haml @@ -4,4 +4,4 @@ should(); all.be(); on = { one: line }; - }); \ No newline at end of file + })(); \ No newline at end of file diff --git a/lib/middleman/features/minify_javascript/rack.rb b/lib/middleman/features/minify_javascript/rack.rb index 9177ddb0..b4cef2ff 100644 --- a/lib/middleman/features/minify_javascript/rack.rb +++ b/lib/middleman/features/minify_javascript/rack.rb @@ -3,10 +3,10 @@ begin 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 @@ -14,10 +14,10 @@ module Middleman 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 @@ -27,10 +27,27 @@ module Middleman headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s response = [minified] end - + + if env["PATH_INFO"].match(/\.html$/) + compressor = ::Uglifier.new + + uncompressed_source = response.join + + minified = uncompressed_source.gsub(/()/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