jekyll-assets 3.0.7 → 3.0.8

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.
@@ -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