jekyll-sass-converter 2.2.0 → 3.1.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: 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: []