jekyll-sass-converter 2.2.0 → 3.0.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: 8210a4fb569272e154c0f114f04ec1a3d71ae306c9c4f2afc1fa19d96437f0c7
4
- data.tar.gz: 02be36d0eef40d451be28efb65396093de0e1cee3b44843bb41cc19fb0e5a02b
3
+ metadata.gz: 209c38f2d63adbcdca7275d57fa6e967f7adcdc8bd91d5b4b1e789e91d523889
4
+ data.tar.gz: 81cc00baf45c4d2375dd1b9bbe004b0c76daaaefbfb391e2b3233743704e51e6
5
5
  SHA512:
6
- metadata.gz: 8e5420795ee103377c6562ec3e9435991af4a85981f96605f6e2c99e8ec203182ed9b21ea0a5ceabc4a7e5335fc4558fd53920f1958efafac22c0d3da4783c64
7
- data.tar.gz: 2da5d0b5f96885c5e3357d1790679c62d129bb2cfa261578ead2e9dc5be562a7baf488118b441effd3c6619adebe7a10698c756d4a7e2eac92c2560d63fd2518
6
+ metadata.gz: 5a35508f75db53b77b32b8d662a29857086b83e9f7d73608d6d25ff0daf56e48b1d43b54be20efe54b4ac1093a292c68f3054bf734d9153b632059d6edd1065c
7
+ data.tar.gz: d53beb7e645c9da162debcfae72246ead2d2fd71381eb5f2da65e6bd77f41e1cc05902ddb88136e9145674bdf68d6290f83ba42c3f44977bc4b7042eff09b811
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "sassc"
4
- require "jekyll/utils"
5
3
  require "jekyll/converters/scss"
6
4
 
7
5
  module Jekyll
@@ -13,7 +11,7 @@ module Jekyll
13
11
  priority :low
14
12
 
15
13
  def syntax
16
- :sass
14
+ :indented
17
15
  end
18
16
  end
19
17
  end
@@ -1,13 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "sassc"
4
- require "jekyll/utils"
5
- require "jekyll/source_map_page"
3
+ # stdlib
4
+ require "json"
5
+
6
+ # 3rd party
7
+ require "addressable/uri"
8
+ require "sass-embedded"
9
+
10
+ # internal
11
+ require_relative "../source_map_page"
6
12
 
7
13
  module Jekyll
8
14
  module Converters
9
15
  class Scss < Converter
10
- BYTE_ORDER_MARK = %r!^\xEF\xBB\xBF!.freeze
11
16
  EXTENSION_PATTERN = %r!^\.scss$!i.freeze
12
17
 
13
18
  SyntaxError = Class.new(ArgumentError)
@@ -35,8 +40,7 @@ module Jekyll
35
40
  end
36
41
  end
37
42
 
38
- ALLOWED_IMPLEMENTATIONS = %w(sassc sass-embedded).freeze
39
- ALLOWED_STYLES = %w(nested expanded compact compressed).freeze
43
+ ALLOWED_STYLES = %w(expanded compressed).freeze
40
44
 
41
45
  # Associate this Converter with the "page" object that manages input and output files for
42
46
  # this converter.
@@ -85,20 +89,12 @@ module Jekyll
85
89
  @jekyll_sass_configuration ||= begin
86
90
  options = @config["sass"] || {}
87
91
  unless options["style"].nil?
88
- options["style"] = options["style"].to_s.gsub(%r!\A:!, "").to_sym
92
+ options["style"] = options["style"].to_s.delete_prefix(":").to_sym
89
93
  end
90
94
  options
91
95
  end
92
96
  end
93
97
 
94
- def sass_build_configuration_options(overrides)
95
- return overrides if safe?
96
-
97
- Jekyll::Utils.symbolize_hash_keys(
98
- Jekyll::Utils.deep_merge_hashes(jekyll_sass_configuration, overrides)
99
- )
100
- end
101
-
102
98
  def syntax
103
99
  :scss
104
100
  end
@@ -109,17 +105,9 @@ module Jekyll
109
105
  jekyll_sass_configuration["sass_dir"]
110
106
  end
111
107
 
112
- def sass_implementation
113
- implementation = jekyll_sass_configuration["implementation"]
114
- ALLOWED_IMPLEMENTATIONS.include?(implementation) ? implementation : "sassc"
115
- end
116
-
117
108
  def sass_style
118
- # `:expanded` is the default output style for newer sass implementations.
119
- # For backward compatibility, `:compact` is kept as the default output style for sassc.
120
- default = sass_implementation == "sassc" ? :compact : :expanded
121
- style = jekyll_sass_configuration.fetch("style", default)
122
- ALLOWED_STYLES.include?(style.to_s) ? style.to_sym : default
109
+ style = jekyll_sass_configuration["style"]
110
+ ALLOWED_STYLES.include?(style.to_s) ? style.to_sym : :expanded
123
111
  end
124
112
 
125
113
  def user_sass_load_paths
@@ -127,9 +115,8 @@ module Jekyll
127
115
  end
128
116
 
129
117
  def sass_dir_relative_to_site_source
130
- @sass_dir_relative_to_site_source ||= begin
118
+ @sass_dir_relative_to_site_source ||=
131
119
  Jekyll.sanitized_path(site_source, sass_dir).sub(site.source + "/", "")
132
- end
133
120
  end
134
121
 
135
122
  # rubocop:disable Metrics/AbcSize
@@ -155,74 +142,41 @@ module Jekyll
155
142
  end
156
143
  # rubocop:enable Metrics/AbcSize
157
144
 
158
- def allow_caching?
159
- !safe?
160
- end
161
-
162
- def add_charset?
163
- !!jekyll_sass_configuration["add_charset"]
164
- end
165
-
166
145
  def sass_configs
167
- sass_build_configuration_options(
168
- :style => sass_style,
169
- :syntax => syntax,
170
- :filename => filename,
171
- :output_path => output_path,
172
- :source_map_file => source_map_file,
173
- :load_paths => sass_load_paths,
174
- :omit_source_map_url => !sourcemap_required?,
175
- :source_map_contents => true,
176
- :line_comments_option => line_comments_option
177
- )
178
- end
179
-
180
- def convert(content)
181
- case sass_implementation
182
- when "sass-embedded"
183
- Jekyll::External.require_with_graceful_fail("sass-embedded")
184
- sass_embedded_convert(content)
185
- when "sassc"
186
- sass_convert(content)
187
- end
188
- end
189
-
190
- private
191
-
192
- def sass_convert(content)
193
- config = sass_configs
194
- engine = SassC::Engine.new(content.dup, config)
195
- output = engine.render
196
- sass_generate_source_map(engine) if sourcemap_required?
197
- replacement = add_charset? ? '@charset "UTF-8";' : ""
198
- output.sub(BYTE_ORDER_MARK, replacement)
199
- rescue SassC::SyntaxError => e
200
- raise SyntaxError, e.to_s
201
- end
202
-
203
- def sass_embedded_config
204
146
  {
205
147
  :load_paths => sass_load_paths,
148
+ :charset => !associate_page_failed?,
206
149
  :source_map => sourcemap_required?,
207
150
  :source_map_include_sources => true,
208
151
  :style => sass_style,
209
- :syntax => syntax == :sass ? :indented : syntax,
152
+ :syntax => syntax,
210
153
  :url => sass_file_url,
154
+ :quiet_deps => quiet_deps_option,
155
+ :verbose => verbose_option,
211
156
  }
212
157
  end
213
158
 
214
- def sass_embedded_convert(content)
215
- output = ::Sass.compile_string(content, **sass_embedded_config)
216
- sass_embedded_generate_source_map(output.source_map) if sourcemap_required?
217
- replacement = add_charset? ? '@charset "UTF-8";' : ""
218
- source_mapping_url = Addressable::URI.encode(File.basename(source_map_file))
219
- eof = sourcemap_required? ? "\n\n/*# sourceMappingURL=#{source_mapping_url} */" : "\n"
220
- output.css.sub(BYTE_ORDER_MARK, replacement) + eof
159
+ def convert(content)
160
+ output = ::Sass.compile_string(content, **sass_configs)
161
+ result = output.css
162
+
163
+ if sourcemap_required?
164
+ source_map = process_source_map(output.source_map)
165
+ generate_source_map_page(source_map)
166
+
167
+ if (sm_url = source_mapping_url)
168
+ result += "#{sass_style == :compressed ? "" : "\n\n"}/*# sourceMappingURL=#{sm_url} */"
169
+ end
170
+ end
171
+
172
+ result
221
173
  rescue ::Sass::CompileError => e
222
174
  Jekyll.logger.error e.full_message
223
175
  raise SyntaxError, e.message
224
176
  end
225
177
 
178
+ private
179
+
226
180
  # The Page instance for which this object acts as a converter.
227
181
  attr_reader :sass_page
228
182
 
@@ -230,30 +184,11 @@ module Jekyll
230
184
  !sass_page
231
185
  end
232
186
 
233
- # The name of the input scss (or sass) file. This information will be used for error
234
- # reporting and will written into the source map file as main source.
235
- #
236
- # Returns the name of the input file or "stdin" if #associate_page failed
237
- def filename
238
- return "stdin" if associate_page_failed?
239
-
240
- File.join(site_source_relative_from_pwd, sass_page.name)
241
- end
242
-
243
187
  # The URL of the input scss (or sass) file. This information will be used for error reporting.
244
188
  def sass_file_url
245
189
  return if associate_page_failed?
246
190
 
247
- file_url_from_path(File.join(site_source, sass_page.relative_path))
248
- end
249
-
250
- # The value of the `line_comments` option.
251
- # When set to `true` causes the line number and filename of the source be emitted into the
252
- # compiled CSS-file. Useful for debugging when the source-map is not available.
253
- #
254
- # Returns the value of the `line_comments`-option chosen by the user or 'false' by default.
255
- def line_comments_option
256
- jekyll_sass_configuration.fetch("line_comments", false)
191
+ file_url_from_path(Jekyll.sanitized_path(site_source, sass_page.relative_path))
257
192
  end
258
193
 
259
194
  # The value of the `sourcemap` option chosen by the user.
@@ -275,56 +210,49 @@ module Jekyll
275
210
  !(sourcemap_option == :development && Jekyll.env != "development")
276
211
  end
277
212
 
278
- # The name of the generated css file. This information will be written into the source map
279
- # file as a backward reference to the input.
280
- #
281
- # Returns the name of the css file or "stdin.css" if #associate_page failed
282
- def output_path
283
- return "stdin.css" if associate_page_failed?
284
-
285
- File.join(site_source_relative_from_pwd, sass_page.basename + ".css")
286
- end
287
-
288
- # The name of the generated source map file. This information will be written into the
289
- # css file to reference to the source map.
290
- #
291
- # Returns the name of the css file or "" if #associate_page failed
292
- def source_map_file
293
- return "" if associate_page_failed?
294
-
295
- File.join(site_source_relative_from_pwd, sass_page.basename + ".css.map")
296
- end
297
-
298
213
  def source_map_page
299
214
  return if associate_page_failed?
300
215
 
301
216
  @source_map_page ||= SourceMapPage.new(sass_page)
302
217
  end
303
218
 
304
- # Reads the source-map from the engine and adds it to the source-map-page.
219
+ # Returns the directory that source map sources are relative to.
220
+ def sass_source_root
221
+ if associate_page_failed?
222
+ site_source
223
+ else
224
+ Jekyll.sanitized_path(site_source, File.dirname(sass_page.relative_path))
225
+ end
226
+ end
227
+
228
+ # Converts file urls in source map to relative paths.
305
229
  #
306
- # @param [::SassC::Engine] engine The sass Compiler engine.
307
- def sass_generate_source_map(engine)
230
+ # Returns processed source map string.
231
+ def process_source_map(source_map)
232
+ map_data = JSON.parse(source_map)
233
+ unless associate_page_failed?
234
+ map_data["file"] = Addressable::URI.encode(sass_page.basename + ".css")
235
+ end
236
+ source_root_url = Addressable::URI.parse(file_url_from_path("#{sass_source_root}/"))
237
+ map_data["sources"].map! do |s|
238
+ s.start_with?("file:") ? Addressable::URI.parse(s).route_from(source_root_url).to_s : s
239
+ end
240
+ JSON.generate(map_data)
241
+ end
242
+
243
+ # Adds the source-map to the source-map-page and adds it to `site.pages`.
244
+ def generate_source_map_page(source_map)
308
245
  return if associate_page_failed?
309
246
 
310
- source_map_page.source_map(engine.source_map)
247
+ source_map_page.source_map(source_map)
311
248
  site.pages << source_map_page
312
- rescue ::SassC::NotRenderedError => e
313
- Jekyll.logger.warn "Could not generate source map #{e.message} => #{e.cause}"
314
249
  end
315
250
 
316
- # Reads the source-map and adds it to the source-map-page.
317
- def sass_embedded_generate_source_map(source_map)
251
+ # Returns a source mapping url for given source-map.
252
+ def source_mapping_url
318
253
  return if associate_page_failed?
319
254
 
320
- map_data = JSON.parse(source_map)
321
- map_data["file"] = Addressable::URI.encode(File.basename(output_path))
322
- map_data["sources"].map! do |s|
323
- s.start_with?("file:") ? Addressable::URI.parse(s).route_from(site_source_url) : s
324
- end
325
-
326
- source_map_page.source_map(JSON.generate(map_data))
327
- site.pages << source_map_page
255
+ Addressable::URI.encode(sass_page.basename + ".css.map")
328
256
  end
329
257
 
330
258
  def site
@@ -335,17 +263,18 @@ module Jekyll
335
263
  site.source
336
264
  end
337
265
 
338
- def site_source_relative_from_pwd
339
- @site_source_relative_from_pwd ||=
340
- Pathname.new(site_source).relative_path_from(Pathname.new(Dir.pwd)).to_s
266
+ def file_url_from_path(path)
267
+ Addressable::URI.encode("file://#{path.start_with?("/") ? "" : "/"}#{path}")
341
268
  end
342
269
 
343
- def site_source_url
344
- @site_source_url ||= file_url_from_path("#{site_source}/")
270
+ # Returns the value of the `quiet_deps`-option chosen by the user or 'false' by default.
271
+ def quiet_deps_option
272
+ !!jekyll_sass_configuration.fetch("quiet_deps", false)
345
273
  end
346
274
 
347
- def file_url_from_path(path)
348
- Addressable::URI.encode("file://#{path.start_with?("/") ? "" : "/"}#{path}")
275
+ # Returns the value of the `verbose`-option chosen by the user or 'false' by default.
276
+ def verbose_option
277
+ !!jekyll_sass_configuration.fetch("verbose", false)
349
278
  end
350
279
  end
351
280
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllSassConverter
4
- VERSION = "2.2.0"
4
+ VERSION = "3.0.0"
5
5
  end
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-sass-converter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Parker Moore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-28 00:00:00.000000000 Z
11
+ date: 2022-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: sassc
14
+ name: sass-embedded
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">"
18
- - !ruby/object:Gem::Version
19
- version: 2.0.1
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '3.0'
19
+ version: '1.54'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">"
28
- - !ruby/object:Gem::Version
29
- version: 2.0.1
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: '3.0'
26
+ version: '1.54'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: bundler
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -110,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
104
  requirements:
111
105
  - - ">="
112
106
  - !ruby/object:Gem::Version
113
- version: 2.5.0
107
+ version: 2.6.0
114
108
  required_rubygems_version: !ruby/object:Gem::Requirement
115
109
  requirements:
116
110
  - - ">="