File hugo-compress-site of Package hugo

#!/usr/bin/ruby
#
# License: GNU Affero General Public License v3.0 only
#
require 'find'
require 'pathname'

class CompressMeNow
  attr_reader :sizes
  def initialize(filename)
    @filename = filename
    @sizes={}
    @stat_input_file = File.stat(filename)
    @sizes[:source] = @stat_input_file.size
    do_brotli
    do_gzip
  end

  private
  def conditional_compression(output_filename, cmdline)
    if !File.exist?(output_filename) or File.stat(output_filename).mtime < @stat_input_file.mtime
      system(cmdline)
    end
  end

  def do_gzip
    output_filename = "#{@filename}.gz"
    cmdline = "gzip -k -f --best '#{@filename}'"

    conditional_compression(output_filename, cmdline)
    @sizes[:gz] = File.stat(output_filename).size
  end

  def do_brotli
    output_filename = "#{@filename}.br"
    cmdline = "brotli -f --quality=11 --output='#{output_filename}' '#{@filename}'"

    conditional_compression(output_filename, cmdline)
    @sizes[:br] = File.stat(output_filename).size
  end
end

class CompressMeWalker
  def initialize(basedir, extensionlist= %w{ .css .html .js .svg .xml .map .woff .woff2 })
    @basedir = basedir
    @extensionlist = extensionlist
    @start_time = Time.now
    @source_size = 0
    @br_size = 0
    @gz_size = 0
    puts "Compression job started ..."
    run
    puts "Compressing files done in #{Time.now - @start_time}s: Compressed #{@source_size} bytes via brotli to #{@br_size} bytes and via gzip to #{@gz_size} bytes."
  end

  def run
    Find.find(@basedir) do |path|
      if FileTest.file?(path)
        pn=Pathname.new(path)
        next unless @extensionlist.include? pn.extname
        result = CompressMeNow.new(path).sizes
        @source_size += result[:source]
        @br_size     += result[:br]
        @gz_size     += result[:gz]
      end
    end
  end
end

CompressMeWalker.new(ARGV.first)
openSUSE Build Service is sponsored by