class Middleman::Extensions::MinifyJavascript::Rack

Rack middleware to look for JS and compress it

def call(env)

Returns:
  • (Array) -

Parameters:
  • env (Rack::Environmemt) --
def call(env)
  status, headers, response = @app.call(env)
  type = headers['Content-Type'].try(:slice, /^[^;]*/)
  @path = env['PATH_INFO']
  minified = if @inline && minifiable_inline?(type)
    minify_inline(::Middleman::Util.extract_response_text(response))
  elsif minifiable?(type) && !ignore?(@path)
    minify(::Middleman::Util.extract_response_text(response))
  end
  if minified
    headers['Content-Length'] = ::Rack::Utils.bytesize(minified).to_s
    response = [minified]
  end
  [status, headers, response]
end

def ignore?(path)

Returns:
  • (Boolean) -

Parameters:
  • path (String) --
def ignore?(path)
  @ignore.any? { |ignore| Middleman::Util.path_match(ignore, path) }
end

def initialize(app, options={})

def initialize(app, options={})
  @app = app
  @ignore = options.fetch(:ignore)
  @inline = options.fetch(:inline)
  @compressor = options.fetch(:compressor)
  @compressor = @compressor.to_proc if @compressor.respond_to? :to_proc
  @compressor = @compressor.call if @compressor.is_a? Proc
  @content_types = options[:content_types]
  @inline_content_types = options[:inline_content_types]
end

def minifiable?(content_type)

Returns:
  • (Boolean) -

Parameters:
  • content_type (String, nil) --
def minifiable?(content_type)
  @content_types.include?(content_type)
end

def minifiable_inline?(content_type)

Returns:
  • (Boolean) -

Parameters:
  • content_type (String, nil) --
def minifiable_inline?(content_type)
  @inline_content_types.include?(content_type)
end

def minify(content)

Returns:
  • (String) -

Parameters:
  • content (String) --
def minify(content)
  @compressor.compress(content)
rescue ExecJS::ProgramError => e
  warn "WARNING: Couldn't compress JavaScript in #{@path}: #{e.message}"
  content
end

def minify_inline(content)

Returns:
  • (String) -

Parameters:
  • content (String) --
def minify_inline(content)
  content.gsub(INLINE_JS_REGEX) do |match|
    first = $1
    inline_content = $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.include?('<script>') || first.include?('text/javascript')
      first + minify(inline_content) + last
    else
      match
    end
  end
end