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)