jekyll-simple-assets 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5cb1966e7b454db1edfa880583d7ae1e9342cde2614435f1d297f0e8f7dd280a
4
- data.tar.gz: aa8d28e89449c5af18e1cb43f22723d7cc0be644991bcac971fa5b7786de66c4
3
+ metadata.gz: 33de2b5bfcba3d41e98a6b9563c8991bc91a84b29b3bccfde8db15fce364a73b
4
+ data.tar.gz: 955d21f9c5f563afa9fe1ac125844fc3ade01f4bf8ed3314963402b2f7eb10c4
5
5
  SHA512:
6
- metadata.gz: 434b43a8291227d93d6f385e364101a226abd6405147f0dec9e98219093aa0c55f4ccde0a0a5680946e44bdb38513f0196da1287121dd777a7838201bcb2e1fd
7
- data.tar.gz: c38b73fd7c9efbfa362221367bcd3362792f5377682161ecff673d0da2d9fda03fc0349163a47bbbe43ea7df6759a9b6dd221fe4c1b9017f0b3d2cce23782833
6
+ metadata.gz: 45cd69ba7ef27c6660e6e6b4b46d148e6b19f0f7d3f0ee5b0cbfec6bba6e90a39b36c932cda1d668c03881e0a200adbf701cbb6e4cacec4332c96a173479b516
7
+ data.tar.gz: 8c6905fd79f86ce0fed4828bc9258f0952992a316a88ae5364b636a0dcf841515be2edf3d9d6816c94e69cdda52c66e001dd0491cea2973874709f10f11000c5
data/README.md CHANGED
@@ -109,6 +109,14 @@ esbuild_flags: --target=es5 # pass any flags to esbuild for this file
109
109
  To bundle javascript [esbuild](https://github.com/evanw/esbuild) must be
110
110
  installed.
111
111
 
112
+ ## Javascript minification
113
+
114
+ The uglifier package is also included and will minify files if `uglifier_enabled`
115
+ is set to true in config.yml, or if JEKYLL_ENV is set to production. Any
116
+ options can be passed to uglifier under the `uglifer` key in config.yml
117
+ (see configuration for example). Additionally you can set uglifier settings in
118
+ the liquid frontmatter of a js file in the same manner as in config.yml.
119
+
112
120
  ## Configuration
113
121
 
114
122
  ```
@@ -145,4 +153,11 @@ simple_assets:
145
153
  # Options for bundling javascript/typescript with the `esbuild` npm module
146
154
  # Set to true to enable
147
155
  bundle: true
156
+
157
+ # Options for javascript minification with uglifier
158
+ uglifier:
159
+ # any options for uglifier can be put here and will be passed to it
160
+ harmony: true
161
+ output:
162
+ ascii_only: true
148
163
  ```
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_runtime_dependency "jekyll"
22
22
  spec.add_runtime_dependency "css_parser"
23
+ spec.add_runtime_dependency "uglifier"
23
24
 
24
25
  spec.add_development_dependency "bundler"
25
26
  end
@@ -8,11 +8,14 @@ require 'shellwords'
8
8
  require 'jekyll-simple-assets/content-hash'
9
9
  require 'jekyll-simple-assets/critical'
10
10
  require 'jekyll-simple-assets/esbuild'
11
+ require 'jekyll-simple-assets/uglify'
11
12
 
12
13
  module Jekyll
13
14
  module SimpleAssets
14
15
  def self.site (site = nil)
15
- @@site ||= site
16
+ @@site = site if site
17
+
18
+ @@site
16
19
  end
17
20
 
18
21
  def self.config
@@ -35,6 +38,10 @@ module Jekyll
35
38
  @@esbuild_config_file ||= file
36
39
  end
37
40
 
41
+ def self.uglifier_enabled?
42
+ config['uglifier_enabled'] || ENV['JEKYLL_ENV'] == 'production'
43
+ end
44
+
38
45
  module SimpleAssetsFilters
39
46
  def md5 (input)
40
47
  Digest::MD5.hexdigest(input)
@@ -7,19 +7,21 @@ module Jekyll
7
7
  module SimpleAssets
8
8
 
9
9
 
10
- def self.critical_css_source_files
11
- @@critical_css_source_files ||= []
10
+ def self.critical_css_source_files ()
11
+ @@critical_css_source_files ||= {}
12
12
  end
13
13
 
14
14
  def self.make_temp_css_files_for_critical (asset)
15
15
  SimpleAssets::config['critical_css']['css_files'].each do |path|
16
16
  next unless asset.path == path || asset.path == path.sub(/\.css$/, '.scss')
17
17
 
18
- f = Tempfile.new('css-source')
18
+ f = Tempfile.new([ 'css-source', '.css' ])
19
19
  f.write asset.output
20
20
  f.close
21
21
 
22
- SimpleAssets::critical_css_source_files << { 'file' => f, 'page' => asset }
22
+ Jekyll.logger.debug("SimpleAssets:", "Created new temp file for css: #{ asset.path } at: #{ f.path }")
23
+
24
+ SimpleAssets::critical_css_source_files[path] = { 'file' => f, 'page' => asset }
23
25
  end
24
26
  end
25
27
 
@@ -40,7 +42,7 @@ end
40
42
  def self.generate_critical_css (site)
41
43
  css_files_str = ''
42
44
 
43
- SimpleAssets::critical_css_source_files.each do |f|
45
+ SimpleAssets::critical_css_source_files.each do |_, f|
44
46
  css_files_str += "--css #{ f['file'].path } "
45
47
 
46
48
  f['css'] = CssParser::Parser.new
@@ -91,7 +93,7 @@ def self.generate_critical_css (site)
91
93
 
92
94
  critical_css.load_string! critical_css_str
93
95
 
94
- SimpleAssets::critical_css_source_files.each do |f|
96
+ SimpleAssets::critical_css_source_files.each do |_, f|
95
97
  f['css'].each_rule_set do |source_rule_set, source_media_type|
96
98
  critical_css.each_rule_set do |critical_rule_set, critical_media_type|
97
99
  if critical_rule_set.selectors.join(',') == source_rule_set.selectors.join(',')
@@ -107,13 +109,19 @@ def self.generate_critical_css (site)
107
109
  end
108
110
  end
109
111
 
110
- SimpleAssets::critical_css_source_files.each do |f|
111
- f['page'].output = f['css'].to_s if f['extract']
112
+ SimpleAssets::critical_css_source_files.each do |_, f|
113
+ leftover_css = f['css'].to_s if f['extract']
114
+
115
+ # css_parser leaves blank keyframes so fix them
116
+ keyframes = f['page'].output.scan(/@keyframes\s+(?:.*?)\s*{(?:\s*\S*?\s*{.*?}\s*)+}/m)
117
+ keyframes.each { |keyframe| leftover_css += keyframe }
118
+
119
+ f['page'].output
112
120
  end
113
121
  end
114
122
 
115
123
  def self.resolve_critical_css_content_hashes (site)
116
- SimpleAssets::critical_css_source_files.each do |source_file|
124
+ SimpleAssets::critical_css_source_files.each do |_, source_file|
117
125
  page = source_file['page']
118
126
  page_path = page.path.sub("#{ site.config['source'] }/", '')
119
127
 
@@ -0,0 +1,105 @@
1
+ require 'uglifier'
2
+
3
+ module Jekyll
4
+
5
+ module SimpleAssets
6
+ def self.symbolize_keys (hash)
7
+ return {} if hash.nil?
8
+
9
+ hash.inject({}) do |result, (key, value)|
10
+
11
+ new_key = case key
12
+ when String then key.to_sym
13
+ else key
14
+ end
15
+ new_value = case value
16
+ when Hash then symbolize_keys(value)
17
+ else value
18
+ end
19
+
20
+ if new_value.is_a?(String) and new_value.match(/^\/.*\/$/)
21
+ new_value = /#{ Regexp.quote(new_value[1..-2]) }/
22
+ end
23
+
24
+ result[new_key] = new_value
25
+
26
+ result
27
+ end
28
+ end
29
+
30
+ module UglifyFilter
31
+ def uglify (input)
32
+ return if input.nil?
33
+
34
+ return input.split('\n').join('\\\n') unless SimpleAssets::uglifier_enabled?
35
+
36
+ config = @context.registers[:site].config['simple_assets']
37
+
38
+ uglifier_config = SimpleAssets::symbolize_keys(config['uglifier'])
39
+
40
+ Uglifier.new(uglifier_config).compile input
41
+ end
42
+ end
43
+ end
44
+
45
+ module Converters
46
+
47
+ class SimpleAssetsUglify < Converter
48
+ safe true
49
+ priority :lowest
50
+
51
+ def initialize (config={})
52
+ super(config)
53
+
54
+ @config = SimpleAssets::symbolize_keys(config['simple_assets']['uglifier'])
55
+
56
+ Jekyll::Hooks.register :pages, :pre_render do |page|
57
+ ext = '.' + page.path.split('.').last
58
+
59
+ if matches(ext)
60
+ @meta = SimpleAssets::symbolize_keys(page.data['uglifier'])
61
+ end
62
+ end
63
+
64
+ Jekyll::Hooks.register :pages, :post_render do |page|
65
+ ext = '.' + page.path.split('.').last
66
+
67
+ if matches(ext)
68
+ @meta = nil
69
+ end
70
+ end
71
+ end
72
+
73
+ def merge_recursively(a, b)
74
+ a.merge(b) {|key, a_item, b_item| merge_recursively(a_item, b_item) }
75
+ end
76
+
77
+ def get_config ()
78
+ merge_recursively(@config || {}, @meta || {})
79
+ end
80
+
81
+ def matches (ext)
82
+ return nil unless ext
83
+
84
+ ext.downcase == '.js'
85
+ end
86
+
87
+ def output_ext (ext)
88
+ '.js'
89
+ end
90
+
91
+ def convert (content)
92
+ return content unless SimpleAssets::uglifier_enabled?
93
+
94
+ config = get_config
95
+
96
+ return content if config[:do_not_compress] == true
97
+
98
+ Uglifier.new(config).compile content
99
+ end
100
+ end
101
+
102
+ end
103
+ end
104
+
105
+ Liquid::Template.register_filter(Jekyll::SimpleAssets::UglifyFilter)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module SimpleAssets
5
- VERSION = "0.4.0"
5
+ VERSION = "0.5.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-simple-assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sophie Askew
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-24 00:00:00.000000000 Z
11
+ date: 2020-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: uglifier
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -69,6 +83,7 @@ files:
69
83
  - lib/jekyll-simple-assets/content-hash.rb
70
84
  - lib/jekyll-simple-assets/critical.rb
71
85
  - lib/jekyll-simple-assets/esbuild.rb
86
+ - lib/jekyll-simple-assets/uglify.rb
72
87
  - lib/jekyll-simple-assets/version.rb
73
88
  homepage: https://github.com/syldexiahime/jekyll-simple-assets
74
89
  licenses: