jekyll-sass-converter 2.2.0 → 3.1.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: 103c0bfb64880d66c26803c4ab4152989630d2de956c5804c34cb499403c9f56
4
+ data.tar.gz: 95df7cdae357c75703ce0382443caf68f26ecf3163b2f4ed47c9d6bddf37d79e
5
5
  SHA512:
6
- metadata.gz: 8e5420795ee103377c6562ec3e9435991af4a85981f96605f6e2c99e8ec203182ed9b21ea0a5ceabc4a7e5335fc4558fd53920f1958efafac22c0d3da4783c64
7
- data.tar.gz: 2da5d0b5f96885c5e3357d1790679c62d129bb2cfa261578ead2e9dc5be562a7baf488118b441effd3c6619adebe7a10698c756d4a7e2eac92c2560d63fd2518
6
+ metadata.gz: 17eccbb64b470845fb69d43a92885be52d6d9744323cab930a102b8b98ae9c81bf630bbe23fc9bef330324fc132df9f6214f97935c21f192b47ca358ae87d5f4
7
+ data.tar.gz: dc9faee94ce564f6b7cc5cd0af8c53ebdc783f60662682a85ba0a5b70e6e70b6649bc5f6524ff9bfa044b5c1254a0c71daa1b17e640f1cc538dadf7c6b5749c8
@@ -1,19 +1,17 @@
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
8
6
  module Converters
9
7
  class Sass < Scss
10
- EXTENSION_PATTERN = %r!^\.sass$!i.freeze
8
+ EXTENSION_PATTERN = %r!^\.sass$!i
11
9
 
12
10
  safe true
13
11
  priority :low
14
12
 
15
13
  def syntax
16
- :sass
14
+ :indented
17
15
  end
18
16
  end
19
17
  end
@@ -1,14 +1,19 @@
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
- EXTENSION_PATTERN = %r!^\.scss$!i.freeze
16
+ EXTENSION_PATTERN = %r!^\.scss$!i
12
17
 
13
18
  SyntaxError = Class.new(ArgumentError)
14
19
 
@@ -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
131
- Jekyll.sanitized_path(site_source, sass_dir).sub(site.source + "/", "")
132
- end
118
+ @sass_dir_relative_to_site_source ||=
119
+ Jekyll.sanitized_path(site_source, sass_dir).delete_prefix("#{site.source}/")
133
120
  end
134
121
 
135
122
  # rubocop:disable Metrics/AbcSize
@@ -155,74 +142,48 @@ 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,
156
+ :fatal_deprecations => fatal_deprecations,
157
+ :future_deprecations => future_deprecations,
158
+ :silence_deprecations => silence_deprecations,
211
159
  }
212
160
  end
213
161
 
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
162
+ def convert(content)
163
+ output = ::Sass.compile_string(content, **sass_configs)
164
+ result = output.css
165
+
166
+ if sourcemap_required?
167
+ source_map = process_source_map(output.source_map)
168
+ generate_source_map_page(source_map)
169
+
170
+ if (sm_url = source_mapping_url)
171
+ result += "#{sass_style == :compressed ? "" : "\n\n"}/*# sourceMappingURL=#{sm_url} */"
172
+ end
173
+ end
174
+
175
+ result
221
176
  rescue ::Sass::CompileError => e
222
177
  Jekyll.logger.error e.full_message
223
- raise SyntaxError, e.message
178
+ if livereload?
179
+ e.to_css # Render error message in browser window
180
+ else
181
+ raise SyntaxError, e.message
182
+ end
224
183
  end
225
184
 
185
+ private
186
+
226
187
  # The Page instance for which this object acts as a converter.
227
188
  attr_reader :sass_page
228
189
 
@@ -230,30 +191,16 @@ module Jekyll
230
191
  !sass_page
231
192
  end
232
193
 
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)
194
+ # Returns `true` if jekyll is serving with livereload.
195
+ def livereload?
196
+ !!(@config["serving"] && @config["livereload"])
241
197
  end
242
198
 
243
199
  # The URL of the input scss (or sass) file. This information will be used for error reporting.
244
200
  def sass_file_url
245
201
  return if associate_page_failed?
246
202
 
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)
203
+ file_url_from_path(Jekyll.sanitized_path(site_source, sass_page.relative_path))
257
204
  end
258
205
 
259
206
  # The value of the `sourcemap` option chosen by the user.
@@ -275,56 +222,49 @@ module Jekyll
275
222
  !(sourcemap_option == :development && Jekyll.env != "development")
276
223
  end
277
224
 
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
225
  def source_map_page
299
226
  return if associate_page_failed?
300
227
 
301
228
  @source_map_page ||= SourceMapPage.new(sass_page)
302
229
  end
303
230
 
304
- # Reads the source-map from the engine and adds it to the source-map-page.
231
+ # Returns the directory that source map sources are relative to.
232
+ def sass_source_root
233
+ if associate_page_failed?
234
+ site_source
235
+ else
236
+ Jekyll.sanitized_path(site_source, File.dirname(sass_page.relative_path))
237
+ end
238
+ end
239
+
240
+ # Converts file urls in source map to relative paths.
305
241
  #
306
- # @param [::SassC::Engine] engine The sass Compiler engine.
307
- def sass_generate_source_map(engine)
242
+ # Returns processed source map string.
243
+ def process_source_map(source_map)
244
+ map_data = JSON.parse(source_map)
245
+ unless associate_page_failed?
246
+ map_data["file"] = Addressable::URI.encode("#{sass_page.basename}.css")
247
+ end
248
+ source_root_url = Addressable::URI.parse(file_url_from_path("#{sass_source_root}/"))
249
+ map_data["sources"].map! do |s|
250
+ s.start_with?("file:") ? Addressable::URI.parse(s).route_from(source_root_url).to_s : s
251
+ end
252
+ JSON.generate(map_data)
253
+ end
254
+
255
+ # Adds the source-map to the source-map-page and adds it to `site.pages`.
256
+ def generate_source_map_page(source_map)
308
257
  return if associate_page_failed?
309
258
 
310
- source_map_page.source_map(engine.source_map)
259
+ source_map_page.source_map(source_map)
311
260
  site.pages << source_map_page
312
- rescue ::SassC::NotRenderedError => e
313
- Jekyll.logger.warn "Could not generate source map #{e.message} => #{e.cause}"
314
261
  end
315
262
 
316
- # Reads the source-map and adds it to the source-map-page.
317
- def sass_embedded_generate_source_map(source_map)
263
+ # Returns a source mapping url for given source-map.
264
+ def source_mapping_url
318
265
  return if associate_page_failed?
319
266
 
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
267
+ Addressable::URI.encode("#{sass_page.basename}.css.map")
328
268
  end
329
269
 
330
270
  def site
@@ -335,17 +275,33 @@ module Jekyll
335
275
  site.source
336
276
  end
337
277
 
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
278
+ def file_url_from_path(path)
279
+ Addressable::URI.encode("file://#{path.start_with?("/") ? "" : "/"}#{path}")
341
280
  end
342
281
 
343
- def site_source_url
344
- @site_source_url ||= file_url_from_path("#{site_source}/")
282
+ # Returns the value of the `quiet_deps`-option chosen by the user or 'false' by default.
283
+ def quiet_deps_option
284
+ !!jekyll_sass_configuration.fetch("quiet_deps", false)
345
285
  end
346
286
 
347
- def file_url_from_path(path)
348
- Addressable::URI.encode("file://#{path.start_with?("/") ? "" : "/"}#{path}")
287
+ # Returns the value of the `verbose`-option chosen by the user or 'false' by default.
288
+ def verbose_option
289
+ !!jekyll_sass_configuration.fetch("verbose", false)
290
+ end
291
+
292
+ # Returns the value of the `fatal_deprecations`-option or '[]' by default.
293
+ def fatal_deprecations
294
+ Array(jekyll_sass_configuration["fatal_deprecations"])
295
+ end
296
+
297
+ # Returns the value of the `future_deprecations`-option or '[]' by default.
298
+ def future_deprecations
299
+ Array(jekyll_sass_configuration["future_deprecations"])
300
+ end
301
+
302
+ # Returns the value of the `silence_deprecations`-option or '[]' by default.
303
+ def silence_deprecations
304
+ Array(jekyll_sass_configuration["silence_deprecations"])
349
305
  end
350
306
  end
351
307
  end
@@ -11,7 +11,7 @@ module Jekyll
11
11
  @site = css_page.site
12
12
  @dir = css_page.dir
13
13
  @data = css_page.data
14
- @name = css_page.basename + ".css.map"
14
+ @name = "#{css_page.basename}.css.map"
15
15
 
16
16
  process(@name)
17
17
  Jekyll::Hooks.trigger :pages, :post_init, self
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllSassConverter
4
- VERSION = "2.2.0"
4
+ VERSION = "3.1.0"
5
5
  end
metadata CHANGED
@@ -1,92 +1,30 @@
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.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Parker Moore
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-28 00:00:00.000000000 Z
11
+ date: 2025-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: sassc
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">"
18
- - !ruby/object:Gem::Version
19
- version: 2.0.1
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '3.0'
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - ">"
28
- - !ruby/object:Gem::Version
29
- version: 2.0.1
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '3.0'
33
- - !ruby/object:Gem::Dependency
34
- name: bundler
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: '0'
40
- type: :development
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: '0'
47
- - !ruby/object:Gem::Dependency
48
- name: rake
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: '0'
61
- - !ruby/object:Gem::Dependency
62
- name: rspec
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: '0'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
- - !ruby/object:Gem::Dependency
76
- name: rubocop-jekyll
14
+ name: sass-embedded
77
15
  requirement: !ruby/object:Gem::Requirement
78
16
  requirements:
79
17
  - - "~>"
80
18
  - !ruby/object:Gem::Version
81
- version: 0.12.0
82
- type: :development
19
+ version: '1.75'
20
+ type: :runtime
83
21
  prerelease: false
84
22
  version_requirements: !ruby/object:Gem::Requirement
85
23
  requirements:
86
24
  - - "~>"
87
25
  - !ruby/object:Gem::Version
88
- version: 0.12.0
89
- description:
26
+ version: '1.75'
27
+ description:
90
28
  email:
91
29
  - parkrmoore@gmail.com
92
30
  executables: []
@@ -102,7 +40,7 @@ homepage: https://github.com/jekyll/jekyll-sass-converter
102
40
  licenses:
103
41
  - MIT
104
42
  metadata: {}
105
- post_install_message:
43
+ post_install_message:
106
44
  rdoc_options: []
107
45
  require_paths:
108
46
  - lib
@@ -110,15 +48,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
48
  requirements:
111
49
  - - ">="
112
50
  - !ruby/object:Gem::Version
113
- version: 2.5.0
51
+ version: 3.1.0
114
52
  required_rubygems_version: !ruby/object:Gem::Requirement
115
53
  requirements:
116
54
  - - ">="
117
55
  - !ruby/object:Gem::Version
118
56
  version: '0'
119
57
  requirements: []
120
- rubygems_version: 3.1.6
121
- signing_key:
58
+ rubygems_version: 3.3.27
59
+ signing_key:
122
60
  specification_version: 4
123
61
  summary: A basic Sass converter for Jekyll.
124
62
  test_files: []