jekyll-assets 2.1.3 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -2
- data/LICENSE +2 -2
- data/README.md +38 -31
- data/Rakefile +1 -40
- data/lib/jekyll-assets.rb +3 -1
- data/lib/jekyll/assets.rb +18 -16
- data/lib/jekyll/assets/addons.rb +3 -9
- data/lib/jekyll/assets/addons/autoprefixer.rb +6 -2
- data/lib/jekyll/assets/addons/bootstrap.rb +3 -1
- data/lib/jekyll/assets/addons/fontawesome.rb +7 -0
- data/lib/jekyll/assets/addons/{js_es6.rb → javascript.rb} +3 -1
- data/lib/jekyll/assets/addons/less.rb +9 -0
- data/lib/jekyll/assets/cached.rb +13 -2
- data/lib/jekyll/assets/config.rb +24 -14
- data/lib/jekyll/assets/env.rb +92 -40
- data/lib/jekyll/assets/hook.rb +14 -4
- data/lib/jekyll/assets/hooks.rb +5 -5
- data/lib/jekyll/assets/hooks/cache.rb +11 -3
- data/lib/jekyll/assets/hooks/compression.rb +12 -2
- data/lib/jekyll/assets/hooks/{configuration.rb → config.rb} +3 -1
- data/lib/jekyll/assets/hooks/erb.rb +15 -0
- data/lib/jekyll/assets/hooks/helpers.rb +4 -3
- data/lib/jekyll/assets/hooks/jekyll/drops.rb +3 -1
- data/lib/jekyll/assets/hooks/jekyll/setup.rb +6 -8
- data/lib/jekyll/assets/hooks/jekyll/write.rb +6 -2
- data/lib/jekyll/assets/hooks/logger.rb +6 -2
- data/lib/jekyll/assets/hooks/sources.rb +4 -1
- data/lib/jekyll/assets/hooks/sprockets.rb +3 -1
- data/lib/jekyll/assets/hooks/version.rb +6 -2
- data/lib/jekyll/assets/liquid.rb +3 -1
- data/lib/jekyll/assets/liquid/drop.rb +20 -2
- data/lib/jekyll/assets/liquid/filters.rb +13 -14
- data/lib/jekyll/assets/liquid/tag.rb +101 -39
- data/lib/jekyll/assets/liquid/tag/defaults.rb +2 -0
- data/lib/jekyll/assets/liquid/tag/defaults/image.rb +25 -5
- data/lib/jekyll/assets/liquid/tag/parser.rb +27 -19
- data/lib/jekyll/assets/liquid/tag/proxied_asset.rb +33 -20
- data/lib/jekyll/assets/liquid/tag/proxies.rb +21 -16
- data/lib/jekyll/assets/logger.rb +29 -15
- data/lib/jekyll/assets/manifest.rb +98 -0
- data/lib/jekyll/assets/patches.rb +4 -2
- data/lib/jekyll/assets/patches/jekyll/site.rb +0 -4
- data/lib/jekyll/assets/patches/kernel.rb +4 -14
- data/lib/jekyll/assets/patches/sprockets/asset.rb +10 -4
- data/lib/jekyll/assets/patches/sprockets/helpers.rb +31 -0
- data/lib/jekyll/assets/processors.rb +1 -0
- data/lib/jekyll/assets/processors/less.rb +68 -0
- data/lib/jekyll/assets/processors/liquid.rb +46 -0
- data/lib/jekyll/assets/proxies.rb +1 -0
- data/lib/jekyll/assets/proxies/magick.rb +167 -0
- data/lib/jekyll/assets/version.rb +4 -2
- metadata +52 -23
- data/lib/jekyll/assets/addons/compass.rb +0 -11
- data/lib/jekyll/assets/addons/font_awesome.rb +0 -5
- data/lib/jekyll/assets/addons/processors/liquid.rb +0 -31
- data/lib/jekyll/assets/addons/proxies/magick.rb +0 -126
- data/lib/jekyll/assets/hooks/context_patches.rb +0 -17
- data/lib/jekyll/assets/hooks/disable_erb.rb +0 -10
- data/lib/jekyll/assets/patches/jekyll/cleaner.rb +0 -15
@@ -5,8 +5,10 @@ module Jekyll
|
|
5
5
|
module Defaults
|
6
6
|
require_relative "defaults/image"
|
7
7
|
|
8
|
+
# ------------------------------------------------------------------
|
8
9
|
# TODO: In 3.0 env needs to be enforced, right now it's not
|
9
10
|
# because it's maintain 2.0 API.
|
11
|
+
# ------------------------------------------------------------------
|
10
12
|
|
11
13
|
module_function
|
12
14
|
def set_defaults_for!(tag, args, asset, env = nil)
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
1
2
|
# Frozen-string-literal: true
|
2
|
-
# Copyright: 2012-
|
3
|
+
# Copyright: 2012 - 2016 - MIT License
|
3
4
|
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
4
6
|
|
5
7
|
module Jekyll
|
6
8
|
module Assets
|
@@ -12,8 +14,10 @@ module Jekyll
|
|
12
14
|
tag == "img" || tag == "image"
|
13
15
|
end
|
14
16
|
|
17
|
+
# ----------------------------------------------------------------
|
15
18
|
# TODO: In 3.0 env needs to be enforced if this is not changed,
|
16
19
|
# for now it's not enforced to maintain the 2.0 API.
|
20
|
+
# ----------------------------------------------------------------
|
17
21
|
|
18
22
|
def initialize(args, asset, env = nil)
|
19
23
|
@args = args
|
@@ -21,14 +25,16 @@ module Jekyll
|
|
21
25
|
@env = env
|
22
26
|
end
|
23
27
|
|
24
|
-
#
|
28
|
+
# ----------------------------------------------------------------
|
25
29
|
|
26
30
|
def set!
|
27
31
|
set_img_dimensions
|
28
32
|
set_img_alt
|
29
33
|
end
|
30
34
|
|
35
|
+
# ----------------------------------------------------------------
|
31
36
|
# TODO: 3.0 - Remove the `!@env`
|
37
|
+
# ----------------------------------------------------------------
|
32
38
|
|
33
39
|
private
|
34
40
|
def set_img_alt
|
@@ -40,17 +46,31 @@ module Jekyll
|
|
40
46
|
end
|
41
47
|
end
|
42
48
|
|
49
|
+
# ----------------------------------------------------------------
|
43
50
|
# TODO: 3.0 - Remove the `!@env`
|
51
|
+
# ----------------------------------------------------------------
|
44
52
|
|
45
53
|
private
|
46
54
|
def set_img_dimensions
|
47
|
-
|
55
|
+
resize_image = @env.asset_config["features"]["automatic_img_size"]
|
56
|
+
|
57
|
+
if !@env || resize_image
|
48
58
|
dimensions = FastImage.new(@asset.filename).size
|
49
59
|
return unless dimensions
|
50
60
|
@args[:html] ||= {}
|
51
61
|
|
52
|
-
|
53
|
-
|
62
|
+
if resize_image =~ /^\d+$/
|
63
|
+
width = (dimensions.first / resize_image.to_f).floor
|
64
|
+
height = (dimensions. last / resize_image.to_f).floor
|
65
|
+
|
66
|
+
else
|
67
|
+
width = dimensions.first
|
68
|
+
height = dimensions. last
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
@args[:html][ "width"] ||= width
|
73
|
+
@args[:html]["height"] ||= height
|
54
74
|
end
|
55
75
|
end
|
56
76
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
1
2
|
# Frozen-string-literal: true
|
2
|
-
# Copyright: 2012-
|
3
|
+
# Copyright: 2012 - 2016 - MIT License
|
3
4
|
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
4
6
|
|
5
7
|
require_relative "proxies"
|
6
8
|
require "forwardable"
|
@@ -9,6 +11,7 @@ module Jekyll
|
|
9
11
|
module Assets
|
10
12
|
module Liquid
|
11
13
|
|
14
|
+
# ----------------------------------------------------------------------
|
12
15
|
# Examples:
|
13
16
|
# - {% tag value argument:value %}
|
14
17
|
# - {% tag value "argument:value" %}
|
@@ -16,6 +19,7 @@ module Jekyll
|
|
16
19
|
# - {% tag value argument:value\:with\:colon %}
|
17
20
|
# - {% tag value argument:"I can even escape \\: here too!" %}
|
18
21
|
# - {% tag value proxy:key:value %}
|
22
|
+
# ----------------------------------------------------------------------
|
19
23
|
|
20
24
|
class Tag
|
21
25
|
class Parser
|
@@ -30,13 +34,13 @@ module Jekyll
|
|
30
34
|
def_delegator :@args, :[]=
|
31
35
|
def_delegator :@args, :[]
|
32
36
|
|
33
|
-
#
|
37
|
+
# ------------------------------------------------------------------
|
34
38
|
|
35
39
|
ACCEPT = {
|
36
40
|
"css" => "text/css", "js" => "application/javascript"
|
37
41
|
}
|
38
42
|
|
39
|
-
#
|
43
|
+
# ------------------------------------------------------------------
|
40
44
|
|
41
45
|
class UnescapedColonError < StandardError
|
42
46
|
def initialize
|
@@ -44,7 +48,7 @@ module Jekyll
|
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
47
|
-
#
|
51
|
+
# ------------------------------------------------------------------
|
48
52
|
|
49
53
|
class UnknownProxyError < StandardError
|
50
54
|
def initialize
|
@@ -52,7 +56,7 @@ module Jekyll
|
|
52
56
|
end
|
53
57
|
end
|
54
58
|
|
55
|
-
#
|
59
|
+
# ------------------------------------------------------------------
|
56
60
|
|
57
61
|
def initialize(args, tag, processed: false, raw_args: nil)
|
58
62
|
if processed && raw_args
|
@@ -72,23 +76,27 @@ module Jekyll
|
|
72
76
|
end
|
73
77
|
end
|
74
78
|
|
75
|
-
#
|
79
|
+
# ------------------------------------------------------------------
|
76
80
|
|
77
81
|
def parse_liquid(context)
|
78
82
|
return self unless context.is_a?(Object::Liquid::Context)
|
79
83
|
liquid = context.registers[:site].liquid_renderer.file("(jekyll:assets)")
|
80
84
|
out = parse_hash_liquid(to_h, liquid, context)
|
81
|
-
self.class.new(out, @tag,
|
82
|
-
|
85
|
+
self.class.new(out, @tag, {
|
86
|
+
:raw_args => @raw_args,
|
87
|
+
:processed => true
|
88
|
+
})
|
83
89
|
end
|
84
90
|
|
91
|
+
# ------------------------------------------------------------------
|
92
|
+
|
85
93
|
def to_html
|
86
94
|
(self[:html] || {}).map do |key, val|
|
87
|
-
%
|
95
|
+
%( #{key}="#{val}")
|
88
96
|
end.join
|
89
97
|
end
|
90
98
|
|
91
|
-
#
|
99
|
+
# ------------------------------------------------------------------
|
92
100
|
|
93
101
|
def proxies
|
94
102
|
keys = (args.keys - Proxies.base_keys - [:file, :html])
|
@@ -97,13 +105,13 @@ module Jekyll
|
|
97
105
|
end
|
98
106
|
end
|
99
107
|
|
100
|
-
#
|
108
|
+
# ------------------------------------------------------------------
|
101
109
|
|
102
110
|
def proxies?
|
103
111
|
proxies.any?
|
104
112
|
end
|
105
113
|
|
106
|
-
#
|
114
|
+
# ------------------------------------------------------------------
|
107
115
|
|
108
116
|
private
|
109
117
|
def parse_hash_liquid(hash_, liquid, context)
|
@@ -114,7 +122,7 @@ module Jekyll
|
|
114
122
|
end
|
115
123
|
end
|
116
124
|
|
117
|
-
#
|
125
|
+
# ------------------------------------------------------------------
|
118
126
|
|
119
127
|
private
|
120
128
|
def parse_raw
|
@@ -131,17 +139,17 @@ module Jekyll
|
|
131
139
|
end
|
132
140
|
end
|
133
141
|
|
134
|
-
#
|
142
|
+
# ------------------------------------------------------------------
|
135
143
|
|
136
144
|
private
|
137
145
|
def parse_col(hash, key)
|
138
146
|
key.push(key.delete_at(-1).gsub(/\\:/, ":"))
|
139
147
|
return as_proxy hash, key if key.size == 3
|
140
|
-
return as_bool_or_html hash, key if key.size == 2
|
148
|
+
return as_bool_or_html hash, key if key.size == 2 || key.size == 1
|
141
149
|
raise UnescapedColonError
|
142
150
|
end
|
143
151
|
|
144
|
-
#
|
152
|
+
# ------------------------------------------------------------------
|
145
153
|
|
146
154
|
private
|
147
155
|
def as_bool_or_html(hash, key)
|
@@ -155,7 +163,7 @@ module Jekyll
|
|
155
163
|
end
|
156
164
|
end
|
157
165
|
|
158
|
-
#
|
166
|
+
# ------------------------------------------------------------------
|
159
167
|
|
160
168
|
private
|
161
169
|
def as_proxy(hash, key)
|
@@ -169,7 +177,7 @@ module Jekyll
|
|
169
177
|
end
|
170
178
|
end
|
171
179
|
|
172
|
-
#
|
180
|
+
# ------------------------------------------------------------------
|
173
181
|
|
174
182
|
private
|
175
183
|
def set_accept
|
@@ -181,7 +189,7 @@ module Jekyll
|
|
181
189
|
end
|
182
190
|
end
|
183
191
|
|
184
|
-
#
|
192
|
+
# ------------------------------------------------------------------
|
185
193
|
|
186
194
|
private
|
187
195
|
def from_shellwords
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
1
2
|
# Frozen-string-literal: true
|
2
|
-
# Copyright: 2012-
|
3
|
+
# Copyright: 2012 - 2016 - MIT License
|
3
4
|
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
4
6
|
|
5
7
|
require "forwardable"
|
6
8
|
|
@@ -12,9 +14,14 @@ module Jekyll
|
|
12
14
|
attr_reader :args, :asset, :env
|
13
15
|
extend Forwardable
|
14
16
|
|
17
|
+
# ------------------------------------------------------------------
|
18
|
+
|
15
19
|
def_delegator :@asset, :liquid_tags
|
16
20
|
def_delegator :@asset, :filename, :source_filename
|
17
21
|
def_delegator :@asset, :content_type
|
22
|
+
def_delegator :@asset, :mtime
|
23
|
+
|
24
|
+
# ------------------------------------------------------------------
|
18
25
|
|
19
26
|
def initialize(asset, args, env, tag)
|
20
27
|
@env = env
|
@@ -26,56 +33,58 @@ module Jekyll
|
|
26
33
|
proxy_file
|
27
34
|
end
|
28
35
|
|
29
|
-
#
|
36
|
+
# ------------------------------------------------------------------
|
30
37
|
|
31
38
|
def cached?
|
32
39
|
@_cached
|
33
40
|
end
|
34
41
|
|
35
|
-
#
|
42
|
+
# ------------------------------------------------------------------
|
43
|
+
|
44
|
+
def write_to(name)
|
45
|
+
FileUtils.mkdir_p File.dirname(name)
|
46
|
+
Sprockets::PathUtils.atomic_write(name) do |f|
|
47
|
+
f.write source
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# ------------------------------------------------------------------
|
36
52
|
|
37
53
|
def source
|
38
54
|
File.binread(filename)
|
39
55
|
end
|
40
56
|
|
41
|
-
#
|
57
|
+
# ------------------------------------------------------------------
|
42
58
|
|
43
59
|
def filename
|
44
60
|
env.in_cache_dir(digest_path)
|
45
61
|
end
|
46
62
|
|
47
|
-
#
|
63
|
+
# ------------------------------------------------------------------
|
48
64
|
|
49
65
|
def digest
|
50
66
|
Digest::SHA2.hexdigest(args.proxies.to_s)
|
51
67
|
end
|
52
68
|
|
69
|
+
# ------------------------------------------------------------------
|
53
70
|
# We always digest a proxied asset so it's uniq based on what
|
54
71
|
# proxies you give us, it would be ignorant to treat it otherwise,
|
55
72
|
# we also make sure they are URL safe by digesting the args.
|
73
|
+
# ------------------------------------------------------------------
|
56
74
|
|
57
75
|
def logical_path
|
58
76
|
digest_path
|
59
77
|
end
|
60
78
|
|
61
|
-
#
|
79
|
+
# ------------------------------------------------------------------
|
62
80
|
|
63
81
|
def digest_path
|
64
82
|
name = asset.logical_path
|
65
83
|
ext = File.extname(name)
|
66
|
-
"#{
|
84
|
+
"#{name.chomp(ext)}-#{digest}#{ext}"
|
67
85
|
end
|
68
86
|
|
69
|
-
#
|
70
|
-
|
71
|
-
def write_to(name)
|
72
|
-
FileUtils.mkdir_p File.dirname(name)
|
73
|
-
Sprockets::PathUtils.atomic_write(name) do |f|
|
74
|
-
f.write source
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
#
|
87
|
+
# ------------------------------------------------------------------
|
79
88
|
|
80
89
|
private
|
81
90
|
def proxy_file
|
@@ -86,13 +95,17 @@ module Jekyll
|
|
86
95
|
end
|
87
96
|
end
|
88
97
|
|
89
|
-
#
|
98
|
+
# ------------------------------------------------------------------
|
90
99
|
|
91
100
|
private
|
92
101
|
def cache_file
|
93
102
|
@_cached = File.file?(filename)
|
94
|
-
|
95
|
-
|
103
|
+
return @_cached if @_cached
|
104
|
+
|
105
|
+
dir = File.dirname(filename)
|
106
|
+
FileUtils.mkdir_p dir unless dir == env.in_cache_dir
|
107
|
+
FileUtils.cp asset.filename, filename
|
108
|
+
true
|
96
109
|
end
|
97
110
|
end
|
98
111
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
1
2
|
# Frozen-string-literal: true
|
2
|
-
# Copyright: 2012-
|
3
|
+
# Copyright: 2012 - 2016 - MIT License
|
3
4
|
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
4
6
|
|
5
7
|
module Jekyll
|
6
8
|
module Assets
|
@@ -19,13 +21,13 @@ module Jekyll
|
|
19
21
|
all
|
20
22
|
end
|
21
23
|
|
22
|
-
#
|
24
|
+
# ------------------------------------------------------------------
|
23
25
|
|
24
26
|
def self.add(name, tag, *args, &block)
|
25
27
|
add_by_class(*generate_class(name, tag, &block), *args)
|
26
28
|
end
|
27
29
|
|
28
|
-
#
|
30
|
+
# ------------------------------------------------------------------
|
29
31
|
|
30
32
|
def self.keys
|
31
33
|
all.select { |val| !val[:class].is_a?(Symbol) }.map do |val|
|
@@ -33,7 +35,7 @@ module Jekyll
|
|
33
35
|
end.flatten
|
34
36
|
end
|
35
37
|
|
36
|
-
#
|
38
|
+
# ------------------------------------------------------------------
|
37
39
|
|
38
40
|
def self.base_keys
|
39
41
|
all.select { |val| val[:class].is_a?(Symbol) }.map do |val|
|
@@ -41,13 +43,13 @@ module Jekyll
|
|
41
43
|
end.flatten
|
42
44
|
end
|
43
45
|
|
44
|
-
#
|
46
|
+
# ------------------------------------------------------------------
|
45
47
|
|
46
48
|
def self.has?(name, tag = nil, arg = nil)
|
47
49
|
get(name, tag, arg).any?
|
48
50
|
end
|
49
51
|
|
50
|
-
#
|
52
|
+
# ------------------------------------------------------------------
|
51
53
|
|
52
54
|
def self.get(name, tag = nil, arg = nil)
|
53
55
|
if name && tag && arg then get_by_name_and_tag_and_arg(name, tag, arg)
|
@@ -61,7 +63,7 @@ module Jekyll
|
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
64
|
-
#
|
66
|
+
# ------------------------------------------------------------------
|
65
67
|
|
66
68
|
def self.get_by_name_and_tag_and_arg(name, tag, arg)
|
67
69
|
all.select do |val|
|
@@ -70,7 +72,7 @@ module Jekyll
|
|
70
72
|
end
|
71
73
|
end
|
72
74
|
|
73
|
-
#
|
75
|
+
# ------------------------------------------------------------------
|
74
76
|
|
75
77
|
def self.get_by_name_and_tag(name, tag)
|
76
78
|
all.select do |val|
|
@@ -79,33 +81,36 @@ module Jekyll
|
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
|
-
#
|
84
|
+
# ------------------------------------------------------------------
|
83
85
|
|
84
86
|
def self.all
|
85
87
|
@_all ||= Set.new
|
86
88
|
end
|
87
89
|
|
88
|
-
#
|
90
|
+
# ------------------------------------------------------------------
|
89
91
|
|
90
|
-
|
92
|
+
private_class_method
|
91
93
|
def self.generate_class(name, tag, &block)
|
92
94
|
class_ = const_set(random_name, Class.new)
|
93
95
|
class_.class_eval(&block)
|
94
96
|
return class_, name, tag
|
95
97
|
end
|
96
98
|
|
97
|
-
#
|
99
|
+
# ------------------------------------------------------------------
|
98
100
|
|
99
|
-
|
101
|
+
private_class_method
|
100
102
|
def self.random_name
|
101
103
|
(0...12).map { ("a".."z").to_a.values_at(rand(26)) }.join.capitalize
|
102
104
|
end
|
103
105
|
|
106
|
+
# ------------------------------------------------------------------
|
104
107
|
# TODO: Put in a better place.
|
108
|
+
# ------------------------------------------------------------------
|
109
|
+
|
105
110
|
add_by_class :internal, :data, :all, ["@uri"]
|
106
|
-
add_by_class :internal, :sprockets, :all,
|
107
|
-
|
108
|
-
|
111
|
+
add_by_class :internal, :sprockets, :all, %W(
|
112
|
+
accept write_to
|
113
|
+
)
|
109
114
|
end
|
110
115
|
end
|
111
116
|
end
|