jekyll-zopfli 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/CHANGELOG.md +19 -2
- data/README.md +70 -5
- data/lib/jekyll-zopfli.rb +2 -0
- data/lib/jekyll/zopfli.rb +25 -4
- data/lib/jekyll/zopfli/compressor.rb +65 -25
- data/lib/jekyll/zopfli/config.rb +20 -0
- data/lib/jekyll/zopfli/version.rb +3 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77a932d1c765327ad80c8acb0b7ffe107bd5b90b5937f48693ed8579a8fd816f
|
4
|
+
data.tar.gz: d1b62939ee22db47dbaec6c23ab6561b4cb138223c87f8bb8d11d288ffcac116
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d6b369cb4341a67c837aa99b8cbe0a3ee28881ffe2afde2a6d70651293bb9b366a37d2d0e3a376a0eb4af0bb9470ff7ebde1b4d1ff46f3cdf913d2d7b961473
|
7
|
+
data.tar.gz: 419182038aa67dcd245e035687ea3a016280f3aca5b3c0c590ba957229759df795bb75a606ef9cd72afb63f355839b89aed6a40d2962d034f4ec21b210577937
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,29 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
##
|
3
|
+
## Ongoing [☰](https://github.com/philnash/jekyll-gzip/compare/v1.1.0...master)
|
4
|
+
|
5
|
+
...
|
6
|
+
|
7
|
+
## 2.0.0 (2018-11-24) [☰](https://github.com/philnash/jekyll-zopfli/compare/v1.1.0...v2.0.0)
|
8
|
+
|
9
|
+
### Added
|
10
|
+
|
11
|
+
* Hooks into Jekyll::Assets if available
|
12
|
+
* Adds frozen string literal comment
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
|
16
|
+
* Uses built in `Jekyll.env` instead of `ENV["JEKYLL_ENV"]`
|
17
|
+
* Changes `Jekyll::Zopfli::Compressor` to a module and implements a `compress_directory` method
|
18
|
+
* Moves Jekyll::Zopfli::ZIPPABLE_EXTENSIONS into plugin config that can overwritten in the site config
|
19
|
+
|
20
|
+
## 1.1.0 (2018-01-03) [☰](https://github.com/philnash/jekyll-zopfli/compare/v1.0.0...v1.1.0)
|
4
21
|
|
5
22
|
### Changed
|
6
23
|
|
7
24
|
* Only run the post write hook when the environment variable `JEKYLL_ENV` is `production`
|
8
25
|
|
9
|
-
## 1.0.0
|
26
|
+
## 1.0.0 (2018-01-02) [☰](https://github.com/philnash/jekyll-zopfli/commits/v1.0.0)
|
10
27
|
|
11
28
|
### Added
|
12
29
|
|
data/README.md
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
|
3
3
|
Generate gzipped assets and files for your Jekyll site at build time using [Zopfli](https://github.com/google/zopfli) compression.
|
4
4
|
|
5
|
-
[](https://travis-ci.org/philnash/jekyll-zopfli)
|
5
|
+
[](https://rubygems.org/gems/jekyll-zopfli) [](https://travis-ci.org/philnash/jekyll-zopfli) [](https://codeclimate.com/github/philnash/jekyll-zopfli/maintainability) [](https://inch-ci.org/github/philnash/jekyll-zopfli)
|
6
|
+
|
7
|
+
[API docs](http://www.rubydoc.info/gems/jekyll-zopfli/) | [GitHub repo](https://github.com/philnash/jekyll-zopfli)
|
8
|
+
|
9
|
+
## Why?
|
6
10
|
|
7
11
|
Performance in web applications is important. You know that, which is why you have created a static site using Jekyll. But you want a bit more performance. You're serving your assets and files gzipped, but you're making your webserver do it?
|
8
12
|
|
@@ -14,12 +18,18 @@ Why not just generate those gzip files at build time? And with Google's Zopfli a
|
|
14
18
|
|
15
19
|
Zopfli is a much slower algorithm than Zlib, so this will likely significantly slow down your site build. If you still want to generate gzip files at build time with a faster build time and Zlib's compression level, check out [`Jekyll::Gzip`](https://github.com/philnash/jekyll-gzip).
|
16
20
|
|
21
|
+
### Want even more compression?
|
22
|
+
|
23
|
+
Zopfli is about the best compression we can get out of the gzip format, but there's more! [Brotli](https://en.wikipedia.org/wiki/Brotli) is a relatively new compression format that is now [supported by many browsers](https://caniuse.com/#search=brotli) and can produce even smaller files. You can use brotli compression alongside gzip in your Sinatra app with [`Jekyll::Brotli`](http://github.com/philnash/jekyll-brotli).
|
24
|
+
|
17
25
|
## Installation
|
18
26
|
|
19
27
|
Add this line to your application's Gemfile:
|
20
28
|
|
21
29
|
```ruby
|
22
|
-
|
30
|
+
group :jekyll_plugins do
|
31
|
+
gem 'jekyll-zopfli'
|
32
|
+
end
|
23
33
|
```
|
24
34
|
|
25
35
|
And then execute:
|
@@ -28,11 +38,55 @@ And then execute:
|
|
28
38
|
bundle install
|
29
39
|
```
|
30
40
|
|
41
|
+
Then add the plugin to the `plugins` key in your `_config.yml`
|
42
|
+
|
43
|
+
```yml
|
44
|
+
plugins:
|
45
|
+
- jekyll-zopfli
|
46
|
+
```
|
47
|
+
|
31
48
|
## Usage
|
32
49
|
|
33
|
-
Once you have the gem installed,
|
50
|
+
Once you have the gem installed, build your Jekyll site in production mode. On Mac/Linux you can run
|
51
|
+
|
52
|
+
```bash
|
53
|
+
JEKYLL_ENV=production bundle exec jekyll build
|
54
|
+
```
|
55
|
+
|
56
|
+
On Windows, set the `JEKYLL_ENV` environment variable to `"production"`. Check out [this blog post on setting environment variables on Windows](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html). Then run:
|
57
|
+
|
58
|
+
```bash
|
59
|
+
bundle exec jekyll build
|
60
|
+
```
|
61
|
+
|
62
|
+
In your destination directory (`_site` by default) you will find gzipped versions of all your text files.
|
63
|
+
|
64
|
+
`Jekyll::Zopfli` only runs when the environment variable `JEKYLL_ENV` is set to `production` as dealing with gzipping files is unnecessary in development mode and just slows down the site build.
|
65
|
+
|
66
|
+
### Configuration
|
67
|
+
|
68
|
+
By default, `Jekyll::Zopfli` will compress all files with the following extensions:
|
69
|
+
|
70
|
+
- '.html'
|
71
|
+
- '.css'
|
72
|
+
- '.js'
|
73
|
+
- '.txt'
|
74
|
+
- '.ttf'
|
75
|
+
- '.atom'
|
76
|
+
- '.stl'
|
77
|
+
- '.xml'
|
78
|
+
- '.svg'
|
79
|
+
- '.eot'
|
80
|
+
|
81
|
+
You can supply your own extensions by adding a `zopfli` key to your site's `_config.yml` listing the extensions that you want to compress. For example to only compress HTML, CSS and JavaScript files, add the following to `_config.yml`:
|
34
82
|
|
35
|
-
|
83
|
+
```yml
|
84
|
+
zopfli:
|
85
|
+
extensions:
|
86
|
+
- '.html'
|
87
|
+
- '.css'
|
88
|
+
- '.js
|
89
|
+
```
|
36
90
|
|
37
91
|
### Serving pre-compiled gzip files
|
38
92
|
|
@@ -48,9 +102,20 @@ gzip_static on;
|
|
48
102
|
|
49
103
|
The `ngx_http_gzip_static_module` module is not built by default, so you may need to enable using the `--with-http_gzip_static_module` configuration parameter.
|
50
104
|
|
105
|
+
#### Apache
|
106
|
+
|
107
|
+
In either a `<Directory>` section in your Apache config or in an `.htaccess` file, add the following:
|
108
|
+
|
109
|
+
```
|
110
|
+
AddEncoding gzip .gz
|
111
|
+
RewriteCond %{HTTP:Accept-encoding} gzip
|
112
|
+
RewriteCond %{REQUEST_FILENAME}.gz -f
|
113
|
+
RewriteRule ^(.*)$ $1.gz [QSA,L]
|
114
|
+
```
|
115
|
+
|
51
116
|
#### Other web servers
|
52
117
|
|
53
|
-
TODO: instructions for other web servers like
|
118
|
+
TODO: instructions for other web servers like HAProxy, h2o etc.
|
54
119
|
|
55
120
|
Do you know how to do this for a different server? Please open a [pull request](https://github.com/philnash/jekyll-zopfli/pulls) or an [issue](https://github.com/philnash/jekyll-zopfli/issues) with the details!
|
56
121
|
|
data/lib/jekyll-zopfli.rb
CHANGED
data/lib/jekyll/zopfli.rb
CHANGED
@@ -1,13 +1,34 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jekyll/zopfli/version'
|
4
|
+
require 'jekyll/zopfli/config'
|
5
|
+
require 'jekyll/zopfli/compressor'
|
6
|
+
require 'pathname'
|
3
7
|
|
4
8
|
module Jekyll
|
5
9
|
module Zopfli
|
6
10
|
end
|
7
11
|
end
|
8
12
|
|
13
|
+
Jekyll::Hooks.register :site, :after_init do |site|
|
14
|
+
config = site.config['zopfli'] || {}
|
15
|
+
site.config['zopfli'] = Jekyll::Zopfli::DEFAULT_CONFIG.merge(config) || {}
|
16
|
+
end
|
17
|
+
|
9
18
|
Jekyll::Hooks.register :site, :post_write do |site|
|
10
|
-
if
|
11
|
-
|
19
|
+
Jekyll::Zopfli::Compressor.compress_site(site) if Jekyll.env == 'production'
|
20
|
+
end
|
21
|
+
|
22
|
+
begin
|
23
|
+
require 'jekyll-assets'
|
24
|
+
|
25
|
+
Jekyll::Assets::Hook.register :env, :after_write do |env|
|
26
|
+
if Jekyll.env == 'production'
|
27
|
+
path = Pathname.new("#{env.jekyll.config['destination']}#{env.prefix_url}")
|
28
|
+
Jekyll::Zopfli::Compressor.compress_directory(path, env.jekyll)
|
29
|
+
end
|
12
30
|
end
|
31
|
+
rescue LoadError
|
32
|
+
# The Jekyll site doesn't use Jekyll::Assets, so no need to compress those
|
33
|
+
# files.
|
13
34
|
end
|
@@ -1,29 +1,69 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jekyll/zopfli/config'
|
4
|
+
require 'zopfli'
|
2
5
|
|
3
6
|
module Jekyll
|
7
|
+
##
|
8
|
+
# The main namespace for +Jekyll::Zopfli+. Includes the +Compressor+ module
|
9
|
+
# which is used to map over files, either using an instance of +Jekyll::Site+
|
10
|
+
# or a directory path, and compress them using Zopfli.
|
4
11
|
module Zopfli
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
##
|
13
|
+
# The module that does the compressing using Zopfli.
|
14
|
+
module Compressor
|
15
|
+
##
|
16
|
+
# Takes an instance of +Jekyll::Site+ and maps over the site files
|
17
|
+
# compressing them in the destination directory.
|
18
|
+
# @example
|
19
|
+
# site = Jekyll::Site.new(site_config)
|
20
|
+
# Jekyll::Zopfli::Compressor.compress_site(site)
|
21
|
+
#
|
22
|
+
# @param site [Jekyll::Site] A Jekyll::Site object that has generated its
|
23
|
+
# site files ready for compression.
|
24
|
+
#
|
25
|
+
# @return void
|
26
|
+
def self.compress_site(site)
|
27
|
+
site.each_site_file do |file|
|
28
|
+
compress_file(file.destination(site.dest), zippable_extensions(site))
|
29
|
+
end
|
30
|
+
end
|
20
31
|
|
21
|
-
|
22
|
-
|
32
|
+
##
|
33
|
+
# Takes a directory path and maps over the files within compressing them
|
34
|
+
# in place.
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# Jekyll::Zopfli::Compressor.compress_directory("~/blog/_site", site)
|
38
|
+
#
|
39
|
+
# @param dir [Pathname, String] The path to a directory of files ready for
|
40
|
+
# compression.
|
41
|
+
# @param site [Jekyll::Site] An instance of the `Jekyll::Site` used for
|
42
|
+
# config.
|
43
|
+
#
|
44
|
+
# @return void
|
45
|
+
def self.compress_directory(dir, site)
|
46
|
+
extensions = zippable_extensions(site).join(',')
|
47
|
+
files = Dir.glob(dir + "**/*{#{extensions}}")
|
48
|
+
files.each { |file| compress_file(file, zippable_extensions(site)) }
|
23
49
|
end
|
24
50
|
|
25
|
-
|
26
|
-
|
51
|
+
##
|
52
|
+
# Takes a file name and an array of extensions. If the file name extension
|
53
|
+
# matches one of the extensions in the array then the file is loaded and
|
54
|
+
# compressed using Zopfli, outputting the gzipped file under the name of
|
55
|
+
# the original file with an extra .gz extension.
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# Jekyll::Zopfli::Compressor.compress_file("~/blog/_site/index.html", ['.html')
|
59
|
+
#
|
60
|
+
# @param file_name [String] The file name of the file we want to compress
|
61
|
+
# @param extensions [Array<String>] The extensions of files that will be
|
62
|
+
# compressed.
|
63
|
+
#
|
64
|
+
# @return void
|
65
|
+
def self.compress_file(file_name, extensions)
|
66
|
+
return unless extensions.include?(File.extname(file_name))
|
27
67
|
zipped = "#{file_name}.gz"
|
28
68
|
contents = ::Zopfli.deflate(File.read(file_name), format: :gzip)
|
29
69
|
File.open(zipped, "w+") do |file|
|
@@ -32,11 +72,11 @@ module Jekyll
|
|
32
72
|
File.utime(File.atime(file_name), File.mtime(file_name), zipped)
|
33
73
|
end
|
34
74
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
75
|
+
private
|
76
|
+
|
77
|
+
def self.zippable_extensions(site)
|
78
|
+
site.config['zopfli'] && site.config['zopfli']['extensions'] || Jekyll::Zopfli::DEFAULT_CONFIG['extensions']
|
39
79
|
end
|
40
80
|
end
|
41
81
|
end
|
42
|
-
end
|
82
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module Zopfli
|
5
|
+
DEFAULT_CONFIG = {
|
6
|
+
'extensions' => [
|
7
|
+
'.html',
|
8
|
+
'.css',
|
9
|
+
'.js',
|
10
|
+
'.txt',
|
11
|
+
'.ttf',
|
12
|
+
'.atom',
|
13
|
+
'.stl',
|
14
|
+
'.xml',
|
15
|
+
'.svg',
|
16
|
+
'.eot'
|
17
|
+
].freeze
|
18
|
+
}.freeze
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-zopfli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phil Nash
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- lib/jekyll-zopfli.rb
|
118
118
|
- lib/jekyll/zopfli.rb
|
119
119
|
- lib/jekyll/zopfli/compressor.rb
|
120
|
+
- lib/jekyll/zopfli/config.rb
|
120
121
|
- lib/jekyll/zopfli/version.rb
|
121
122
|
homepage: https://github.com/philnash/jekyll-zopfli
|
122
123
|
licenses:
|
@@ -138,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
139
|
version: '0'
|
139
140
|
requirements: []
|
140
141
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.7.
|
142
|
+
rubygems_version: 2.7.7
|
142
143
|
signing_key:
|
143
144
|
specification_version: 4
|
144
145
|
summary: Generate gzipped assets and files for your Jekyll site at build time using
|