class Middleman::Extensions::MinifyJavaScript
Minify JavaScript Extension
def ignore?(path)
def ignore?(path) @ignore.any? { |ignore| ::Middleman::Util.path_match(ignore, path) } end
def initialize(app, options_hash = ::Middleman::EMPTY_HASH, &block)
def initialize(app, options_hash = ::Middleman::EMPTY_HASH, &block) super @ignore = Array(options[:ignore]) + [/\.min\./] @compressor = options[:compressor] @compressor = @compressor.to_proc if @compressor.respond_to? :to_proc @compressor = @compressor.call if @compressor.is_a? Proc end
def manipulate_resource_list_container!(resource_list)
def manipulate_resource_list_container!(resource_list) resource_list.by_binary(false).each do |r| type = r.content_type.try(:slice, /^[^;]*/) if options[:inline] && minifiable_inline?(type) r.add_filter method(:minify_inline) elsif minifiable?(type) && !ignore?(r.destination_path) r.add_filter method(:minify) end end end
def minifiable?(content_type)
def minifiable?(content_type) options[:content_types].include?(content_type) end
def minifiable_inline?(content_type)
def minifiable_inline?(content_type) options[:inline_content_types].include?(content_type) end
def minify(content)
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)
def minify_inline(content) content.gsub(INLINE_JS_REGEX) do |match| first = Regexp.last_match(1) inline_content = Regexp.last_match(2) last = Regexp.last_match(3) # Only compress script tags that contain JavaScript (as opposed to # something like jQuery templates, identified with a "text/html" type). if !first.include?('type=') || first.include?('text/javascript') first + minify(inline_content) + last else match end end end