jekyll-sass-converter 2.1.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: ca94d9c890d30769bc4e8f02c40c36204492b3756d812832545811de2f9adbe2
4
- data.tar.gz: ca4c611652bb77f15c0ddedfef1c49c5921b323a97c097fb8a9e6bbb906258ab
3
+ metadata.gz: 209c38f2d63adbcdca7275d57fa6e967f7adcdc8bd91d5b4b1e789e91d523889
4
+ data.tar.gz: 81cc00baf45c4d2375dd1b9bbe004b0c76daaaefbfb391e2b3233743704e51e6
5
5
  SHA512:
6
- metadata.gz: 34cbbcef544e99bed2b8373ce339cf8040e123e2428beec54f0affb6895bfc2a4d47b4549d0c73d131719afaa375a109da07da51ab0b05abcbef7add1ac77ebd
7
- data.tar.gz: 4d877c97804a9a59ef2febe1298c34bf9fa9a80199b6c664792aa5937c1c2a0844f6b49bb6bdf13fb6022355bdb0c79eb1321e1225cd5464e0fff9c2d3f9babd
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,7 +40,7 @@ module Jekyll
35
40
  end
36
41
  end
37
42
 
38
- ALLOWED_STYLES = %w(nested expanded compact compressed).freeze
43
+ ALLOWED_STYLES = %w(expanded compressed).freeze
39
44
 
40
45
  # Associate this Converter with the "page" object that manages input and output files for
41
46
  # this converter.
@@ -84,25 +89,12 @@ module Jekyll
84
89
  @jekyll_sass_configuration ||= begin
85
90
  options = @config["sass"] || {}
86
91
  unless options["style"].nil?
87
- options["style"] = options["style"].to_s.gsub(%r!\A:!, "").to_sym
92
+ options["style"] = options["style"].to_s.delete_prefix(":").to_sym
88
93
  end
89
94
  options
90
95
  end
91
96
  end
92
97
 
93
- def sass_build_configuration_options(overrides)
94
- if safe?
95
- overrides
96
- else
97
- Jekyll::Utils.symbolize_hash_keys(
98
- Jekyll::Utils.deep_merge_hashes(
99
- jekyll_sass_configuration,
100
- overrides
101
- )
102
- )
103
- end
104
- end
105
-
106
98
  def syntax
107
99
  :scss
108
100
  end
@@ -114,8 +106,8 @@ module Jekyll
114
106
  end
115
107
 
116
108
  def sass_style
117
- style = jekyll_sass_configuration.fetch("style", :compact)
118
- ALLOWED_STYLES.include?(style.to_s) ? style.to_sym : :compact
109
+ style = jekyll_sass_configuration["style"]
110
+ ALLOWED_STYLES.include?(style.to_s) ? style.to_sym : :expanded
119
111
  end
120
112
 
121
113
  def user_sass_load_paths
@@ -123,31 +115,24 @@ module Jekyll
123
115
  end
124
116
 
125
117
  def sass_dir_relative_to_site_source
126
- @sass_dir_relative_to_site_source ||= begin
118
+ @sass_dir_relative_to_site_source ||=
127
119
  Jekyll.sanitized_path(site_source, sass_dir).sub(site.source + "/", "")
128
- end
129
120
  end
130
121
 
131
122
  # rubocop:disable Metrics/AbcSize
132
123
  def sass_load_paths
133
124
  paths = user_sass_load_paths + [sass_dir_relative_to_site_source]
134
125
 
135
- if safe?
136
- # Sanitize paths to prevent any attack vectors (.e.g. `/**/*`)
137
- paths.map! { |path| Jekyll.sanitized_path(site_source, path) }
138
- end
126
+ # Sanitize paths to prevent any attack vectors (.e.g. `/**/*`)
127
+ paths.map! { |path| Jekyll.sanitized_path(site_source, path) } if safe?
139
128
 
140
129
  # Expand file globs (e.g. `node_modules/*/node_modules` )
141
130
  Dir.chdir(site_source) do
142
131
  paths = paths.flat_map { |path| Dir.glob(path) }
143
132
 
144
133
  paths.map! do |path|
145
- if safe?
146
- # Sanitize again in case globbing was able to do something crazy.
147
- Jekyll.sanitized_path(site_source, path)
148
- else
149
- File.expand_path(path)
150
- end
134
+ # Sanitize again in case globbing was able to do something crazy.
135
+ safe? ? Jekyll.sanitized_path(site_source, path) : File.expand_path(path)
151
136
  end
152
137
  end
153
138
 
@@ -157,37 +142,37 @@ module Jekyll
157
142
  end
158
143
  # rubocop:enable Metrics/AbcSize
159
144
 
160
- def allow_caching?
161
- !safe?
162
- end
163
-
164
- def add_charset?
165
- !!jekyll_sass_configuration["add_charset"]
166
- end
167
-
168
145
  def sass_configs
169
- sass_build_configuration_options(
170
- :style => sass_style,
171
- :syntax => syntax,
172
- :filename => filename,
173
- :output_path => output_path,
174
- :source_map_file => source_map_file,
175
- :load_paths => sass_load_paths,
176
- :omit_source_map_url => !sourcemap_required?,
177
- :source_map_contents => true,
178
- :line_comments_option => line_comments_option
179
- )
146
+ {
147
+ :load_paths => sass_load_paths,
148
+ :charset => !associate_page_failed?,
149
+ :source_map => sourcemap_required?,
150
+ :source_map_include_sources => true,
151
+ :style => sass_style,
152
+ :syntax => syntax,
153
+ :url => sass_file_url,
154
+ :quiet_deps => quiet_deps_option,
155
+ :verbose => verbose_option,
156
+ }
180
157
  end
181
158
 
182
159
  def convert(content)
183
- config = sass_configs
184
- engine = SassC::Engine.new(content.dup, config)
185
- output = engine.render
186
- generate_source_map(engine) if sourcemap_required?
187
- replacement = add_charset? ? '@charset "UTF-8";' : ""
188
- output.sub(BYTE_ORDER_MARK, replacement)
189
- rescue SassC::SyntaxError => e
190
- raise SyntaxError, e.to_s
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
173
+ rescue ::Sass::CompileError => e
174
+ Jekyll.logger.error e.full_message
175
+ raise SyntaxError, e.message
191
176
  end
192
177
 
193
178
  private
@@ -199,23 +184,11 @@ module Jekyll
199
184
  !sass_page
200
185
  end
201
186
 
202
- # The name of the input scss (or sass) file. This information will be used for error
203
- # reporting and will written into the source map file as main source.
204
- #
205
- # Returns the name of the input file or "stdin" if #associate_page failed
206
- def filename
207
- return "stdin" if associate_page_failed?
208
-
209
- sass_page.name
210
- end
187
+ # The URL of the input scss (or sass) file. This information will be used for error reporting.
188
+ def sass_file_url
189
+ return if associate_page_failed?
211
190
 
212
- # The value of the `line_comments` option.
213
- # When set to `true` causes the line number and filename of the source be emitted into the
214
- # compiled CSS-file. Useful for debugging when the source-map is not available.
215
- #
216
- # Returns the value of the `line_comments`-option chosen by the user or 'false' by default.
217
- def line_comments_option
218
- jekyll_sass_configuration.fetch("line_comments", false)
191
+ file_url_from_path(Jekyll.sanitized_path(site_source, sass_page.relative_path))
219
192
  end
220
193
 
221
194
  # The value of the `sourcemap` option chosen by the user.
@@ -237,55 +210,72 @@ module Jekyll
237
210
  !(sourcemap_option == :development && Jekyll.env != "development")
238
211
  end
239
212
 
240
- # The name of the generated css file. This information will be written into the source map
241
- # file as a backward reference to the input.
242
- #
243
- # Returns the name of the css file or "stdin.css" if #associate_page failed
244
- def output_path
245
- return "stdin.css" if associate_page_failed?
213
+ def source_map_page
214
+ return if associate_page_failed?
246
215
 
247
- sass_page.basename + ".css"
216
+ @source_map_page ||= SourceMapPage.new(sass_page)
248
217
  end
249
218
 
250
- # The name of the generated source map file. This information will be written into the
251
- # css file to reference to the source map.
252
- #
253
- # Returns the name of the css file or "" if #associate_page failed
254
- def source_map_file
255
- return "" if associate_page_failed?
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
256
227
 
257
- sass_page.basename + ".css.map"
228
+ # Converts file urls in source map to relative paths.
229
+ #
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)
258
241
  end
259
242
 
260
- def source_map_page
243
+ # Adds the source-map to the source-map-page and adds it to `site.pages`.
244
+ def generate_source_map_page(source_map)
261
245
  return if associate_page_failed?
262
246
 
263
- @source_map_page ||= SourceMapPage.new(sass_page)
247
+ source_map_page.source_map(source_map)
248
+ site.pages << source_map_page
264
249
  end
265
250
 
266
- # Reads the source-map from the engine and adds it to the source-map-page.
267
- #
268
- # @param [::SassC::Engine] engine The sass Compiler engine.
269
- def generate_source_map(engine)
251
+ # Returns a source mapping url for given source-map.
252
+ def source_mapping_url
270
253
  return if associate_page_failed?
271
254
 
272
- source_map_page.source_map(engine.source_map)
273
- site.pages << source_map_page
274
- rescue ::SassC::NotRenderedError => e
275
- Jekyll.logger.warn "Could not generate source map #{e.message} => #{e.cause}"
255
+ Addressable::URI.encode(sass_page.basename + ".css.map")
276
256
  end
277
257
 
278
258
  def site
279
- if associate_page_failed?
280
- Jekyll.sites.last
281
- else
282
- sass_page.site
283
- end
259
+ associate_page_failed? ? Jekyll.sites.last : sass_page.site
284
260
  end
285
261
 
286
262
  def site_source
287
263
  site.source
288
264
  end
265
+
266
+ def file_url_from_path(path)
267
+ Addressable::URI.encode("file://#{path.start_with?("/") ? "" : "/"}#{path}")
268
+ end
269
+
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)
273
+ end
274
+
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)
278
+ end
289
279
  end
290
280
  end
291
281
  end
@@ -29,6 +29,10 @@ module Jekyll
29
29
  true
30
30
  end
31
31
 
32
+ def render_with_liquid?
33
+ false
34
+ end
35
+
32
36
  # @return[String] the object as a debug String.
33
37
  def inspect
34
38
  "#<#{self.class} @name=#{name.inspect}>"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllSassConverter
4
- VERSION = "2.1.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.1.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: 2020-02-05 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
@@ -78,14 +72,14 @@ dependencies:
78
72
  requirements:
79
73
  - - "~>"
80
74
  - !ruby/object:Gem::Version
81
- version: '0.4'
75
+ version: 0.12.0
82
76
  type: :development
83
77
  prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
85
79
  requirements:
86
80
  - - "~>"
87
81
  - !ruby/object:Gem::Version
88
- version: '0.4'
82
+ version: 0.12.0
89
83
  description:
90
84
  email:
91
85
  - parkrmoore@gmail.com
@@ -110,14 +104,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
104
  requirements:
111
105
  - - ">="
112
106
  - !ruby/object:Gem::Version
113
- version: 2.4.0
107
+ version: 2.6.0
114
108
  required_rubygems_version: !ruby/object:Gem::Requirement
115
109
  requirements:
116
110
  - - ">="
117
111
  - !ruby/object:Gem::Version
118
112
  version: '0'
119
113
  requirements: []
120
- rubygems_version: 3.0.6
114
+ rubygems_version: 3.1.6
121
115
  signing_key:
122
116
  specification_version: 4
123
117
  summary: A basic Sass converter for Jekyll.