diff --git a/features/coffee-script.feature b/features/coffee-script.feature index ec9ee85f..4ed8dba0 100644 --- a/features/coffee-script.feature +++ b/features/coffee-script.feature @@ -1,7 +1,12 @@ Feature: Support coffee-script In order to offer an alternative when writing Javascript - + Scenario: Rendering coffee script Given the Server is running When I go to "/javascripts/coffee_test.js" + Then I should see "Array.prototype.slice" + + Scenario: Rendering coffee-script with :coffeescript haml-filter + Given the Server is running + When I go to "/inline-coffeescript.html" Then I should see "Array.prototype.slice" \ No newline at end of file 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/config.rb b/fixtures/test-app/config.rb index 1ccf22a6..ea851387 100644 --- a/fixtures/test-app/config.rb +++ b/fixtures/test-app/config.rb @@ -1,6 +1,7 @@ with_layout false do page "/inline-css.html" page "/inline-js.html" + page "/inline-coffeescript.html" end get "/page-class.html" do diff --git a/fixtures/test-app/source/inline-coffeescript.html.haml b/fixtures/test-app/source/inline-coffeescript.html.haml new file mode 100644 index 00000000..5204064c --- /dev/null +++ b/fixtures/test-app/source/inline-coffeescript.html.haml @@ -0,0 +1,3 @@ +:coffeescript + race = (winner, runners...) -> + print winner, runners \ No newline at end of file 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..bc29066c 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,31 @@ module Middleman 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(/()/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 diff --git a/lib/middleman/renderers/haml.rb b/lib/middleman/renderers/haml.rb index 107404d3..4a3c782b 100755 --- a/lib/middleman/renderers/haml.rb +++ b/lib/middleman/renderers/haml.rb @@ -1,4 +1,5 @@ require "haml" +require "coffee-filter" module Middleman module Renderers diff --git a/middleman.gemspec b/middleman.gemspec index 66b744c8..40947443 100644 --- a/middleman.gemspec +++ b/middleman.gemspec @@ -30,6 +30,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("rack-test", ["~> 0.5.0"]) s.add_runtime_dependency("uglifier", ["~> 0.5.0"]) s.add_runtime_dependency("haml", ["~> 3.1.0"]) + s.add_runtime_dependency("coffee-filter", ["~> 0.1.0"]) s.add_runtime_dependency("sass", ["~> 3.1.0"]) s.add_runtime_dependency("compass", ["~> 0.11.1"]) s.add_runtime_dependency("coffee-script", ["~> 2.2.0"])