jekyll-assets 3.0.7 → 3.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,13 +10,9 @@ module Jekyll
10
10
  class HTML < Extensible
11
11
  attr_reader :doc
12
12
 
13
- # --
14
- # rubocop:disable Style/RedundantReturn
15
13
  # --
16
14
  def self.skips
17
- return %i(
18
- inline path data pic
19
- )
15
+ %i(inline path data pic)
20
16
  end
21
17
 
22
18
  # --
@@ -31,7 +27,6 @@ module Jekyll
31
27
  # Search for plugins and runners and then run them.
32
28
  # @param [Sprockets::Asset] the current asset.
33
29
  # @note look inside of plugins for examples.
34
- # rubocop:enable Style/RedundantReturn
35
30
  # @return [String] the final result.
36
31
  # @param [Env] env the env.
37
32
  # --
@@ -6,15 +6,13 @@ module Jekyll
6
6
  module Assets
7
7
  module Patches
8
8
  module SassFunctions
9
+ SprocketsString = ::Sprockets::Autoload::Sass::Script::String
10
+
9
11
  def asset_path(path, options = {})
10
12
  path, args = path.value.split(%r!\s+!, 2)
11
- path, = URI.split(path)[5..8]
12
- path = "#{path} #{args}"
13
-
14
- # We strip the query string, and the fragment.
15
- path = sprockets_context.asset_path(path, options)
16
- ::Sprockets::Autoload::Sass::Script::String.new \
17
- path, :string
13
+ path, fragment = URI.split(path).values_at(5, 8)
14
+ path = sprockets_context.asset_path("#{path} #{args}", options)
15
+ SprocketsString.new [path, fragment].compact.join("#")
18
16
  end
19
17
  end
20
18
  end
@@ -0,0 +1,79 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2012 - 2018 - MIT License
3
+ # Encoding: utf-8
4
+
5
+ if Jekyll::Assets::Utils.activate("crass")
6
+ module Jekyll
7
+ module Assets
8
+ module Plugins
9
+ NODER = %r!/\*\! @alternate \*/!
10
+ RTEST = %r!#{Regexp.union(%w(-ms- -webkit- -moz- -o-).freeze)}!
11
+ NODE1 = { node: :whitespace, pos: 28, raw: " " }.freeze
12
+ NODE2 = {
13
+ raw: "/*! @alternate */",
14
+ pos: 0, # It's ignored. @see Crass::Parser.stringify
15
+ value: "! @alternate ",
16
+ node: :comment,
17
+ }.freeze
18
+
19
+ NODE3 = {
20
+ raw: "/* @alternate */",
21
+ pos: 0, # It's ignored. @see Crass::Parser.stringify
22
+ value: "@alternate ",
23
+ node: :comment,
24
+ }.freeze
25
+
26
+ class Alternates
27
+ def call(input)
28
+ comp = input[:environment].asset_config[:compression]
29
+ data = Crass.parse(input[:data] || "", preserve_comments: true)
30
+ data.each do |v|
31
+ next unless v[:node] == :style_rule
32
+ v[:children] = v[:children].each_with_object([]) do |c, a|
33
+ if alternate?(c)
34
+ a << (comp ? NODE2 : NODE3)
35
+ a << NODE1
36
+ end
37
+
38
+ a << c
39
+ end
40
+ end
41
+
42
+ {
43
+ data: Crass::Parser.stringify(data, {
44
+ preserve_comments: true,
45
+ }),
46
+ }
47
+ end
48
+
49
+ private
50
+ def alternate?(c)
51
+ c[:node] == :property && (
52
+ c[:name] =~ RTEST || c[:value] =~ RTEST
53
+ )
54
+ end
55
+ end
56
+
57
+ # --
58
+ # When compression is enabled we need to make sure to
59
+ # run an extra step, because when compression is being
60
+ # ran, we have to guard with /*! so we've to strip.
61
+ # --
62
+ Hook.register :asset, :after_compression do |_, o, t|
63
+ next unless t == "text/css"
64
+
65
+ o.update({
66
+ # Remember we guard against compression.
67
+ data: o[:data].gsub(NODER, " #{NODE3[:raw]} "),
68
+ })
69
+ end
70
+
71
+ # --
72
+ Hook.register :env, :after_init, priority: 2 do
73
+ register_bundle_processor "text/css",
74
+ Alternates.new
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -1,4 +1,3 @@
1
- # rubocop:disable Naming/FileName
2
1
  # Frozen-string-literal: true
3
2
  # Copyright: 2012 - 2018 - MIT License
4
3
  # Encoding: utf-8
@@ -36,7 +36,7 @@ module Jekyll
36
36
  def complex(doc)
37
37
  @args[:img] ||= {}
38
38
  args = @args.to_h(html: true, skip: HTML.skips)
39
- @args[:img][:src] = asset.digest_path
39
+ @args[:img][:src] = @args[:src]
40
40
  _, sources = kv
41
41
 
42
42
  doc.picture @args[:picture] do
@@ -39,7 +39,7 @@ module Jekyll
39
39
  # Because we need to keep some support for 3.x we register it
40
40
  # two different ways depending on the type of Sprockets.
41
41
  # --
42
- if !Env.old_sprockets?
42
+ if !Utils.old_sprockets?
43
43
  Liquid::TYPES.each do |k, v|
44
44
  to = Utils.strip_secondary_content_type(k)
45
45
  charset = Sprockets.mime_types[to][:charset]
@@ -18,7 +18,7 @@ Jekyll::Assets::Utils.javascript? do
18
18
  })
19
19
  end
20
20
 
21
- Jekyll::Assets::Hook.register :env, :after_init do
21
+ Jekyll::Assets::Hook.register :env, :after_init, priority: 1 do
22
22
  config = asset_config[:plugins][:css][:autoprefixer]
23
23
  AutoprefixerRails.install(self, jekyll.safe ? config : {
24
24
  # Your configuration here.
@@ -27,8 +27,12 @@ module Jekyll
27
27
  img = ::MiniMagick::Image.open(@file)
28
28
  magick_format(img) if @args[:magick][:format]
29
29
  img.combine_options do |c|
30
- runners.each do |m|
31
- method(m).arity == 2 ? send(m, img, c) : send(m, c)
30
+ @args[:magick].keys.reject { |k| k == :format }.each do |k|
31
+ m = "magick_#{k}"
32
+
33
+ if self.class.private_method_defined?(m)
34
+ method(m).arity == 2 ? send(m, img, c) : send(m, c)
35
+ end
32
36
  end
33
37
  end
34
38
 
@@ -125,6 +129,10 @@ module Jekyll
125
129
  width, height = img.width / 2, img.height / 2 if @args[:magick].key?(:half)
126
130
  cmd.resize "#{width}x#{height}" if width && height
127
131
  end
132
+
133
+ alias magick_double magick_preset_resize
134
+ alias magick_quarter magick_preset_resize
135
+ alias magick_half magick_preset_resize
128
136
  end
129
137
  end
130
138
  end
@@ -78,7 +78,7 @@ Jekyll::Assets::Hook.register :config, :before_merge do |c|
78
78
  end
79
79
 
80
80
  # --
81
- Jekyll::Hooks.register [:pages, :documents, :posts], :post_render do |d|
81
+ Jekyll::Hooks.register %i(pages documents posts), :post_render do |d|
82
82
  if d.site.sprockets.asset_config["plugins"]["img"]["searcher"]
83
83
  if d.output_ext == ".html"
84
84
  Jekyll::Assets::Plugins::Searcher.new(d).run
@@ -0,0 +1,47 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2012 - 2018 - MIT License
3
+ # Encoding: utf-8
4
+
5
+ unless Jekyll::Assets::Utils.old_sprockets?
6
+ require_relative "srcmap/css"
7
+ require_relative "srcmap/javascript"
8
+ require_relative "srcmap/writer"
9
+
10
+ module Jekyll
11
+ module Assets
12
+ module Plugins
13
+ module SrcMap
14
+ NAME = "%<name>s.map"
15
+ DIR_NAME = "source-maps"
16
+ DIR = Pathutil.new(DIR_NAME)
17
+ EXT = ".map"
18
+
19
+ # --
20
+ # @return [String] the map name.
21
+ # Take the path, and attach the map extension.
22
+ # @note this just saves logic.
23
+ # --
24
+ def self.map_path(env:, asset:)
25
+ [
26
+ path({
27
+ asset: asset,
28
+ env: env,
29
+ }),
30
+ EXT,
31
+ ].join
32
+ end
33
+
34
+ # --
35
+ # @note this is used for anything in source-maps.
36
+ # Strip the filename and return a relative sourcemap path.
37
+ # @return [Pathutil] the path.
38
+ # --
39
+ def self.path(env:, asset:)
40
+ DIR.join(env.strip_paths(asset.is_a?(Sprockets::Asset) ?
41
+ asset.filename : asset))
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,35 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2012 - 2018 - MIT License
3
+ # Encoding: utf-8
4
+
5
+ module Jekyll
6
+ module Assets
7
+ module Plugins
8
+ Hook.register :asset, :after_compression, priority: 3 do |i, o, t|
9
+ next unless t == "text/css"
10
+
11
+ env = i[:environment]
12
+ asset = env.find_asset!(i[:filename], pipeline: :source)
13
+ path = asset.filename.sub(env.jekyll.in_source_dir + "/", "")
14
+ url = SrcMap.map_path(asset: asset, env: env)
15
+ url = env.prefix_url(url)
16
+
17
+ o.update({
18
+ data: <<~CSS
19
+ #{o[:data].strip}
20
+ /*# sourceMappingURL=#{url} */
21
+ /*# sourceURL=#{path} */
22
+ CSS
23
+ })
24
+ end
25
+
26
+ # --
27
+ Hook.register :env, :after_init, priority: 1 do
28
+ next if asset_config[:compression]
29
+ if asset_config[:source_maps]
30
+ then asset_config[:compression] = true
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2012 - 2018 - MIT License
3
+ # Encoding: utf-8
4
+
5
+ require "sprockets"
6
+
7
+ module Jekyll
8
+ module Assets
9
+ module Plugins
10
+ Hook.register :asset, :after_compression, priority: 3 do |i, o, t|
11
+ next unless t == "application/javascript"
12
+
13
+ env = i[:environment]
14
+ asset = env.find_asset!(i[:filename], pipeline: :source)
15
+ path = asset.filename.sub(env.jekyll.in_source_dir + "/", "")
16
+ url = SrcMap.map_path(asset: asset, env: env)
17
+ url = env.prefix_url(url)
18
+
19
+ o.update({
20
+ data: <<~TXT
21
+ #{o[:data].strip}
22
+ //# sourceMappingURL=#{url}
23
+ //# sourceURL=#{path}
24
+ TXT
25
+ })
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,187 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2012 - 2018 - MIT License
3
+ # Encoding: utf-8
4
+
5
+ require "sprockets"
6
+ require "pathutil"
7
+
8
+ module Jekyll
9
+ module Assets
10
+ module Plugins
11
+ module SrcMap
12
+ class Writer < Sprockets::Exporters::Base
13
+ alias env environment
14
+
15
+ def skip?(_)
16
+ !env.asset_config[:source_maps] ||
17
+ !asset.metadata[:map]
18
+ end
19
+
20
+ # --
21
+ def call
22
+ clean_file!
23
+ clean_sources!
24
+ write_map!
25
+ write_src!
26
+ end
27
+
28
+ # --
29
+ # Provides our custom manifest key, full of files.
30
+ # @note We push everything from the file we are writing to the maps.
31
+ # @return [Array<String>]
32
+ # --
33
+ def files
34
+ @files ||= begin
35
+ key = "sourceMapFiles"
36
+ out = env.manifest.data[key] ||= []
37
+ unless Manifest.keep_keys.include?(key)
38
+ Manifest.keep_keys << key
39
+ end
40
+
41
+ out
42
+ end
43
+ end
44
+
45
+ # --
46
+ # @return [HashWithIndifferentAccess]
47
+ # @note do not modify the original map.
48
+ # Provides a modifible SourceMap
49
+ # --
50
+ private
51
+ def map
52
+ @map ||= asset.metadata[:map]
53
+ .with_indifferent_access
54
+ end
55
+
56
+ # --
57
+ # @return [HashWithIndifferentAccess]
58
+ # @note this is frozen so you can't modify.
59
+ # Provides an unmodifiable SourceMap
60
+ # --
61
+ private
62
+ def original_map
63
+ @original_map ||= asset.metadata[:map]
64
+ .with_indifferent_access.freeze
65
+ end
66
+
67
+ # --
68
+ # @note something like _assets/*
69
+ # Makes sure that the name sits in the asset path.
70
+ # @return [String]
71
+ # --
72
+ private
73
+ def clean_file!
74
+ map[:file] = base.join(map[:file]).to_s
75
+ end
76
+
77
+ # --
78
+ private
79
+ def clean_sources!
80
+ if map[:sources]
81
+ then map[:sources] = map[:sources].map do |v|
82
+ base.join(strip_src(v))
83
+ end
84
+ else
85
+ map[:sections].each do |v|
86
+ v[:map][:sources] = v[:map][:sources].map do |vv|
87
+ base.join(strip_src(vv))
88
+ end
89
+ end
90
+ end
91
+
92
+ map
93
+ end
94
+
95
+ # --
96
+ private
97
+ def strip_src(path)
98
+ path = Pathutil.new(path)
99
+ base = path.basename.gsub(%r!\.source!, "")
100
+ return path.dirname.join(base).to_s unless path.dirname == "."
101
+ base.to_s if path.dirname == "."
102
+ end
103
+
104
+ # --
105
+ # @note we shim this on name.
106
+ # Privates the base directory in the source.
107
+ # @return [String]
108
+ # --
109
+ private
110
+ def base
111
+ Pathutil.new(asset.filename.sub(env.jekyll
112
+ .in_source_dir + "/", "")).dirname
113
+ end
114
+
115
+ # --
116
+ # rubocop:disable Layout/BlockEndNewline
117
+ # rubocop:disable Layout/MultilineBlockLayout
118
+ # rubocop:disable Style/BlockDelimiters
119
+ # --
120
+ private
121
+ def map_files
122
+ return original_map[:sources] if original_map.key?(:sources)
123
+ original_map[:sections].map { |v| v[:map][:sources] \
124
+ if v.key?(:map) }.flatten.compact
125
+ end
126
+
127
+ # --
128
+ # rubocop:enable Layout/BlockEndNewline
129
+ # rubocop:enable Layout/MultilineBlockLayout
130
+ # rubocop:enable Style/BlockDelimiters
131
+ # --
132
+ private
133
+ def write_map!
134
+ path = SrcMap.map_path(asset: asset, env: env)
135
+ write(env.in_dest_dir(path)) do |f|
136
+ files.push(path)
137
+ f.write(map.to_json)
138
+ files.uniq!
139
+ end
140
+ end
141
+
142
+ # --
143
+ private
144
+ def strip_base(asset)
145
+ return asset if asset.is_a?(Sprockets::Asset)
146
+ asset.sub(base + "/", "")
147
+ end
148
+
149
+ # --
150
+ private
151
+ def write_src!
152
+ [asset_path, map_files].flatten.compact.uniq.each do |v|
153
+ next unless (v = env.find_asset(strip_base(v), pipeline: :source))
154
+ path = map_path(v.filename)
155
+
156
+ write(environment.in_dest_dir(path)) do |f|
157
+ f.write(v.source)
158
+ files.push(path.to_s)
159
+ .uniq!
160
+ end
161
+ end
162
+ end
163
+
164
+ # --
165
+ private
166
+ def asset_path
167
+ base.join(env.strip_paths(@asset.filename)).to_s
168
+ end
169
+
170
+ # --
171
+ private
172
+ def map_path(file)
173
+ asset = base.join(env.strip_paths(file))
174
+ SrcMap.path({
175
+ asset: asset, env: env
176
+ })
177
+ end
178
+ end
179
+
180
+ # --
181
+ Hook.register :env, :after_init, priority: 3 do
182
+ register_exporter("*/*", Writer)
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end