From 1c4e6cb835b5619114167b17fecf42f0c8487cd8 Mon Sep 17 00:00:00 2001 From: Thomas Reynolds Date: Sat, 20 Apr 2013 14:29:51 -0700 Subject: [PATCH] update minify js extension --- middleman-more/lib/middleman-more.rb | 6 +- .../extensions/minify_javascript.rb | 151 ++++++++---------- 2 files changed, 72 insertions(+), 85 deletions(-) diff --git a/middleman-more/lib/middleman-more.rb b/middleman-more/lib/middleman-more.rb index 6c786e91..4e3b99a2 100644 --- a/middleman-more/lib/middleman-more.rb +++ b/middleman-more/lib/middleman-more.rb @@ -59,10 +59,8 @@ module Middleman Middleman::Extensions::MinifyCss.register # MinifyJavascript compresses JS - Middleman::Extensions.register(:minify_javascript) do - require "middleman-more/extensions/minify_javascript" - Middleman::Extensions::MinifyJavascript - end + require "middleman-more/extensions/minify_javascript" + Middleman::Extensions::MinifyJavascript.register # RelativeAssets allow any asset path in dynamic templates to be either # relative to the root of the project or use an absolute URL. diff --git a/middleman-more/lib/middleman-more/extensions/minify_javascript.rb b/middleman-more/lib/middleman-more/extensions/minify_javascript.rb index 9a1e91e6..c3c6e0bf 100644 --- a/middleman-more/lib/middleman-more/extensions/minify_javascript.rb +++ b/middleman-more/lib/middleman-more/extensions/minify_javascript.rb @@ -1,94 +1,83 @@ -# Extension namespace -module Middleman - module Extensions +# Minify Javascript Extension +class Middleman::Extensions::MinifyJavascript < ::Middleman::Extension + option :compressor, nil, 'Set the JS compressor to use.' + option :inline, false, 'Whether to minify JS inline within HTML files' + option :ignore, [], 'Patterns to avoid minifying' - # Minify Javascript Extension - module MinifyJavascript + def initialize(app, options_hash={}, &block) + super - # Setup extension - class << self + app.config.define_setting :js_compressor, nil, 'Set the JS compressor to use. Deprecated in favor of the :compressor option when activating :minify_js' + end - # Once registered - def registered(app, options={}) - app.config.define_setting :js_compressor, nil, 'Set the JS compressor to use. Deprecated in favor of the :compressor option when activating :minify_js' + def after_configuration + chosen_compressor = app.config[:js_compressor] || options[:compressor] || begin + require 'uglifier' + ::Uglifier.new + end - ignore = Array(options[:ignore]) << /\.min\./ - inline = options[:inline] || false + # Setup Rack middleware to minify CSS + app.use Rack, :compressor => chosen_compressor, + :ignore => options[:ignore] + [/\.min\./], + :inline => options[:inline] + end - # Once config is parsed - app.after_configuration do - chosen_compressor = js_compressor || options[:compressor] || begin - require 'uglifier' - ::Uglifier.new + # Rack middleware to look for JS and compress it + class Rack + + # Init + # @param [Class] app + # @param [Hash] options + def initialize(app, options={}) + @app = app + @compressor = options[:compressor] + @ignore = options[:ignore] + @inline = options[:inline] + end + + # Rack interface + # @param [Rack::Environmemt] env + # @return [Array] + def call(env) + status, headers, response = @app.call(env) + + path = env["PATH_INFO"] + + begin + if (path.end_with?('.html') || path.end_with?('.php')) && @inline + uncompressed_source = ::Middleman::Util.extract_response_text(response) + + minified = uncompressed_source.gsub(/(]*>\s*(?:\/\/(?:(?:)|(?:\]\]>)))?\s*<\/script>)/m) do |match| + first = $1 + javascript = $2 + last = $3 + + # Only compress script tags that contain JavaScript (as opposed + # to something like jQuery templates, identified with a "text/html" + # type. + if first =~ /