Module: Jekyll::Zopfli::Compressor

Defined in:
lib/jekyll/zopfli/compressor.rb

Overview

The module that does the compressing using Zopfli.

Class Method Summary collapse

Class Method Details

.compress_directory(dir, site) ⇒ Object

Takes a directory path and maps over the files within compressing them in place.

Examples:

Jekyll::Zopfli::Compressor.compress_directory("~/blog/_site", site)

Parameters:

  • dir (Pathname, String)

    The path to a directory of files ready for compression.

  • site (Jekyll::Site)

    An instance of the ‘Jekyll::Site` used for config.

Returns:

  • void



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/jekyll/zopfli/compressor.rb', line 51

def self.compress_directory(dir, site)
  extensions = zippable_extensions(site).join(',')
  files = Dir.glob(File.join(dir, "**", "*{#{extensions}}"))
  files.each do |file|
    next unless regenerate? file, site

    compress_file(
      file,
      extensions: zippable_extensions(site),
      replace_file: replace_files(site)
    )
  end
end

.compress_file(file_name, extensions: [], replace_file: false) ⇒ Object

Takes a file name and an array of extensions. If the file name extension matches one of the extensions in the array then the file is loaded and compressed using Zopfli, outputting the gzipped file under the name of the original file with an extra .gz extension.

Examples:

Jekyll::Zopfli::Compressor.compress_file("~/blog/_site/index.html", ['.html')

Parameters:

  • file_name (String)

    The file name of the file we want to compress

  • extensions (Array<String>) (defaults to: [])

    The extensions of files that will be compressed.

  • replace_file (Boolean) (defaults to: false)

    Whether the original file should be replaced or written alongside the original with a ‘.gz` extension

Returns:

  • void



81
82
83
84
85
86
87
88
89
# File 'lib/jekyll/zopfli/compressor.rb', line 81

def self.compress_file(file_name, extensions: [], replace_file: false)
  return unless extensions.include?(File.extname(file_name))
  zipped = replace_file ? file_name : "#{file_name}.gz"
  contents = ::Zopfli.deflate(File.binread(file_name), format: :gzip)
  File.open(zipped, "w+") do |file|
    file << contents
  end
  File.utime(File.atime(file_name), File.mtime(file_name), zipped)
end

.compress_site(site) ⇒ Object

Takes an instance of Jekyll::Site and maps over the site files compressing them in the destination directory.

Examples:

site = Jekyll::Site.new(site_config)
Jekyll::Zopfli::Compressor.compress_site(site)

Parameters:

  • site (Jekyll::Site)

    A Jekyll::Site object that has generated its site files ready for compression.

Returns:

  • void



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/jekyll/zopfli/compressor.rb', line 26

def self.compress_site(site)
  site.each_site_file do |file|
    next unless regenerate? file.destination(site.dest), site

    compress_file(
      file.destination(site.dest),
      extensions: zippable_extensions(site),
      replace_file: replace_files(site)
    )
  end
end