Class: Middleman::Extensions::MinifyJavascript::Rack

Inherits:
Object
  • Object
show all
Defined in:
lib/middleman-more/extensions/minify_javascript.rb

Overview

Rack middleware to look for JS and compress it

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Rack

Init

Parameters:

  • app (Class)
  • options (Hash) (defaults to: {})


40
41
42
43
44
45
# File 'lib/middleman-more/extensions/minify_javascript.rb', line 40

def initialize(app, options={})
  @app = app
  @compressor = options[:compressor]
  @ignore = options[:ignore]
  @inline = options[:inline]
end

Instance Method Details

#call(env) ⇒ Array

Rack interface

Parameters:

  • env (Rack::Environmemt)

Returns:

  • (Array)


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/middleman-more/extensions/minify_javascript.rb', line 50

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(/(<script[^>]*>\s*(?:\/\/(?:(?:<!--)|(?:<!\[CDATA\[))\n)?)(.*?)((?:(?:\n\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 =~ /<script>/ || first.include?('text/javascript')
          minified_js = @compressor.compress(javascript)

          first << minified_js << last
        else
          match
        end
      end

      headers["Content-Length"] = ::Rack::Utils.bytesize(minified).to_s
      response = [minified]
    elsif path.end_with?('.js') && @ignore.none? {|ignore| Middleman::Util.path_match(ignore, path) }
      uncompressed_source = ::Middleman::Util.extract_response_text(response)
      minified_js = @compressor.compress(uncompressed_source)

      headers["Content-Length"] = ::Rack::Utils.bytesize(minified_js).to_s
      response = [minified_js]
    end
  rescue ExecJS::ProgramError => e
    warn "WARNING: Couldn't compress JavaScript in #{path}: #{e.message}"
  end

  [status, headers, response]
end