jekyll-sass-converter 2.2.0 → 3.0.0

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.
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
  - - ">="