jekyll-sass-converter 1.5.2 → 2.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 +4 -4
- data/lib/jekyll-sass-converter/version.rb +1 -1
- data/lib/jekyll/converters/sass.rb +3 -5
- data/lib/jekyll/converters/scss.rb +175 -23
- data/lib/jekyll/source_map_page.rb +37 -0
- metadata +23 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c051522099eb9c977d893591246ad37863d0ff38feec276b8992c9f16cfa6b3b
|
4
|
+
data.tar.gz: 388b71b1d56dcde5f45b9860b28ba932291951cf2385e42560032b3c4e144c5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b2c4cd74ba4ee2612c92394011d98f6db389078d3668ccebe3cf96ef855c5a1a72c9dbe47057f3cc586b1dac2937379ee02356e289fdbf96869ad860e2ad1c3
|
7
|
+
data.tar.gz: 275e76080d121f8693b42d1ca46088a0328013b111c8eddc4a998baafd04990ed9ff6cad5ac7246198c79bf63aad7e3ff556a2bbe9d6ffd0a0582dc259daec68
|
@@ -1,19 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "sassc"
|
4
4
|
require "jekyll/utils"
|
5
5
|
require "jekyll/converters/scss"
|
6
6
|
|
7
7
|
module Jekyll
|
8
8
|
module Converters
|
9
9
|
class Sass < Scss
|
10
|
+
EXTENSION_PATTERN = %r!^\.sass$!i.freeze
|
11
|
+
|
10
12
|
safe true
|
11
13
|
priority :low
|
12
14
|
|
13
|
-
def matches(ext)
|
14
|
-
ext =~ %r!^\.sass$!i
|
15
|
-
end
|
16
|
-
|
17
15
|
def syntax
|
18
16
|
:sass
|
19
17
|
end
|
@@ -1,21 +1,71 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "sassc"
|
4
4
|
require "jekyll/utils"
|
5
|
+
require "jekyll/source_map_page"
|
5
6
|
|
6
7
|
module Jekyll
|
7
8
|
module Converters
|
8
9
|
class Scss < Converter
|
9
|
-
BYTE_ORDER_MARK = %r!^\xEF\xBB\xBF
|
10
|
+
BYTE_ORDER_MARK = %r!^\xEF\xBB\xBF!.freeze
|
11
|
+
EXTENSION_PATTERN = %r!^\.scss$!i.freeze
|
12
|
+
|
10
13
|
SyntaxError = Class.new(ArgumentError)
|
11
14
|
|
12
15
|
safe true
|
13
16
|
priority :low
|
14
17
|
|
18
|
+
# This hook is triggered just before the method {#convert(content)} is executed, it
|
19
|
+
# associates the Scss (and Sass) converters with their respective sass_page objects.
|
20
|
+
Jekyll::Hooks.register :pages, :pre_render do |page|
|
21
|
+
page.converters.each do |converter|
|
22
|
+
converter.associate_page(page) if converter.is_a?(Jekyll::Converters::Scss)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# This hook is triggered just after the method {#convert(content)} has been executed, it
|
27
|
+
# dissociates the Scss (and Sass) converters with their respective sass_page objects.
|
28
|
+
Jekyll::Hooks.register :pages, :post_render do |page|
|
29
|
+
page.converters.each do |converter|
|
30
|
+
converter.dissociate_page(page) if converter.is_a?(Jekyll::Converters::Scss)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
15
34
|
ALLOWED_STYLES = %w(nested expanded compact compressed).freeze
|
16
35
|
|
36
|
+
# Associate this Converter with the "page" object that manages input and output files for
|
37
|
+
# this converter.
|
38
|
+
#
|
39
|
+
# Note: changing the associated sass_page during the live time of this Converter instance
|
40
|
+
# may result in inconsistent results.
|
41
|
+
#
|
42
|
+
# @param [Jekyll:Page] page The sass_page for which this object acts as converter.
|
43
|
+
def associate_page(page)
|
44
|
+
if @sass_page
|
45
|
+
Jekyll.logger.debug "Sass Converter:",
|
46
|
+
"sass_page re-assigned: #{@sass_page.name} to #{page.name}"
|
47
|
+
dissociate_page(page)
|
48
|
+
return
|
49
|
+
end
|
50
|
+
@sass_page = page
|
51
|
+
end
|
52
|
+
|
53
|
+
# Dissociate this Converter with the "page" object.
|
54
|
+
#
|
55
|
+
# @param [Jekyll:Page] page The sass_page for which this object has acted as a converter.
|
56
|
+
def dissociate_page(page)
|
57
|
+
unless page.equal?(@sass_page)
|
58
|
+
Jekyll.logger.debug "Sass Converter:",
|
59
|
+
"dissociating a page that was never associated #{page.name}"
|
60
|
+
end
|
61
|
+
|
62
|
+
@source_map_page = nil
|
63
|
+
@sass_page = nil
|
64
|
+
@site = nil
|
65
|
+
end
|
66
|
+
|
17
67
|
def matches(ext)
|
18
|
-
ext =~
|
68
|
+
ext =~ self.class::EXTENSION_PATTERN
|
19
69
|
end
|
20
70
|
|
21
71
|
def output_ext(_ext)
|
@@ -27,21 +77,18 @@ module Jekyll
|
|
27
77
|
end
|
28
78
|
|
29
79
|
def jekyll_sass_configuration
|
30
|
-
|
31
|
-
|
32
|
-
|
80
|
+
@jekyll_sass_configuration ||= begin
|
81
|
+
options = @config["sass"] || {}
|
82
|
+
unless options["style"].nil?
|
83
|
+
options["style"] = options["style"].to_s.gsub(%r!\A:!, "").to_sym
|
84
|
+
end
|
85
|
+
options
|
33
86
|
end
|
34
|
-
options
|
35
87
|
end
|
36
88
|
|
37
89
|
def sass_build_configuration_options(overrides)
|
38
90
|
if safe?
|
39
|
-
|
40
|
-
:load_paths => sass_load_paths,
|
41
|
-
:syntax => syntax,
|
42
|
-
:style => sass_style,
|
43
|
-
:cache => false,
|
44
|
-
}
|
91
|
+
overrides
|
45
92
|
else
|
46
93
|
Jekyll::Utils.symbolize_hash_keys(
|
47
94
|
Jekyll::Utils.deep_merge_hashes(
|
@@ -58,6 +105,7 @@ module Jekyll
|
|
58
105
|
|
59
106
|
def sass_dir
|
60
107
|
return "_sass" if jekyll_sass_configuration["sass_dir"].to_s.empty?
|
108
|
+
|
61
109
|
jekyll_sass_configuration["sass_dir"]
|
62
110
|
end
|
63
111
|
|
@@ -74,8 +122,10 @@ module Jekyll
|
|
74
122
|
Jekyll.sanitized_path(site_source, sass_dir)
|
75
123
|
end
|
76
124
|
|
125
|
+
# rubocop:disable Metrics/AbcSize
|
77
126
|
def sass_load_paths
|
78
127
|
paths = user_sass_load_paths + [sass_dir_relative_to_site_source]
|
128
|
+
paths << site.theme.sass_path if site.theme&.sass_path
|
79
129
|
|
80
130
|
if safe?
|
81
131
|
# Sanitize paths to prevent any attack vectors (.e.g. `/**/*`)
|
@@ -84,7 +134,7 @@ module Jekyll
|
|
84
134
|
|
85
135
|
# Expand file globs (e.g. `node_modules/*/node_modules` )
|
86
136
|
Dir.chdir(site_source) do
|
87
|
-
paths = paths.
|
137
|
+
paths = paths.flat_map { |path| Dir.glob(path) }.uniq
|
88
138
|
|
89
139
|
paths.map! do |path|
|
90
140
|
if safe?
|
@@ -98,6 +148,7 @@ module Jekyll
|
|
98
148
|
|
99
149
|
paths.select { |path| File.directory?(path) }
|
100
150
|
end
|
151
|
+
# rubocop:enable Metrics/AbcSize
|
101
152
|
|
102
153
|
def allow_caching?
|
103
154
|
!safe?
|
@@ -108,24 +159,125 @@ module Jekyll
|
|
108
159
|
end
|
109
160
|
|
110
161
|
def sass_configs
|
111
|
-
sass_build_configuration_options(
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
162
|
+
sass_build_configuration_options(
|
163
|
+
:style => sass_style,
|
164
|
+
:syntax => syntax,
|
165
|
+
:filename => filename,
|
166
|
+
:output_path => output_path,
|
167
|
+
:source_map_file => source_map_file,
|
168
|
+
:load_paths => sass_load_paths,
|
169
|
+
:omit_source_map_url => !sourcemap_required?,
|
170
|
+
:source_map_contents => true,
|
171
|
+
:line_comments_option => line_comments_option
|
172
|
+
)
|
116
173
|
end
|
117
174
|
|
118
175
|
def convert(content)
|
119
|
-
|
176
|
+
config = sass_configs
|
177
|
+
engine = SassC::Engine.new(content.dup, config)
|
178
|
+
output = engine.render
|
179
|
+
generate_source_map(engine) if sourcemap_required?
|
120
180
|
replacement = add_charset? ? '@charset "UTF-8";' : ""
|
121
181
|
output.sub(BYTE_ORDER_MARK, replacement)
|
122
|
-
rescue ::
|
123
|
-
raise SyntaxError,
|
182
|
+
rescue SassC::SyntaxError => e
|
183
|
+
raise SyntaxError, e.to_s
|
124
184
|
end
|
125
185
|
|
126
186
|
private
|
187
|
+
|
188
|
+
# The Page instance for which this object acts as a converter.
|
189
|
+
attr_reader :sass_page
|
190
|
+
|
191
|
+
def associate_page_failed?
|
192
|
+
!sass_page
|
193
|
+
end
|
194
|
+
|
195
|
+
# The name of the input scss (or sass) file. This information will be used for error
|
196
|
+
# reporting and will written into the source map file as main source.
|
197
|
+
#
|
198
|
+
# Returns the name of the input file or "stdin" if #associate_page failed
|
199
|
+
def filename
|
200
|
+
return "stdin" if associate_page_failed?
|
201
|
+
|
202
|
+
sass_page.name
|
203
|
+
end
|
204
|
+
|
205
|
+
# The value of the `line_comments` option.
|
206
|
+
# When set to `true` causes the line number and filename of the source be emitted into the
|
207
|
+
# compiled CSS-file. Useful for debugging when the source-map is not available.
|
208
|
+
#
|
209
|
+
# Returns the value of the `line_comments`-option chosen by the user or 'false' by default.
|
210
|
+
def line_comments_option
|
211
|
+
jekyll_sass_configuration.fetch("line_comments", false)
|
212
|
+
end
|
213
|
+
|
214
|
+
# The value of the `sourcemap` option chosen by the user.
|
215
|
+
#
|
216
|
+
# This option controls when sourcemaps shall be generated or not.
|
217
|
+
#
|
218
|
+
# Returns the value of the `sourcemap`-option chosen by the user or ':always' by default.
|
219
|
+
def sourcemap_option
|
220
|
+
jekyll_sass_configuration.fetch("sourcemap", :always).to_sym
|
221
|
+
end
|
222
|
+
|
223
|
+
# Determines whether a sourcemap shall be generated or not.
|
224
|
+
#
|
225
|
+
# Returns `true` if a sourcemap shall be generated, `false` otherwise.
|
226
|
+
def sourcemap_required?
|
227
|
+
return false if associate_page_failed? || sourcemap_option == :never
|
228
|
+
return true if sourcemap_option == :always
|
229
|
+
|
230
|
+
!(sourcemap_option == :development && Jekyll.env != "development")
|
231
|
+
end
|
232
|
+
|
233
|
+
# The name of the generated css file. This information will be written into the source map
|
234
|
+
# file as a backward reference to the input.
|
235
|
+
#
|
236
|
+
# Returns the name of the css file or "stdin.css" if #associate_page failed
|
237
|
+
def output_path
|
238
|
+
return "stdin.css" if associate_page_failed?
|
239
|
+
|
240
|
+
sass_page.basename + ".css"
|
241
|
+
end
|
242
|
+
|
243
|
+
# The name of the generated source map file. This information will be written into the
|
244
|
+
# css file to reference to the source map.
|
245
|
+
#
|
246
|
+
# Returns the name of the css file or "" if #associate_page failed
|
247
|
+
def source_map_file
|
248
|
+
return "" if associate_page_failed?
|
249
|
+
|
250
|
+
sass_page.basename + ".css.map"
|
251
|
+
end
|
252
|
+
|
253
|
+
def source_map_page
|
254
|
+
return if associate_page_failed?
|
255
|
+
|
256
|
+
@source_map_page ||= SourceMapPage.new(sass_page)
|
257
|
+
end
|
258
|
+
|
259
|
+
# Reads the source-map from the engine and adds it to the source-map-page.
|
260
|
+
#
|
261
|
+
# @param [::SassC::Engine] engine The sass Compiler engine.
|
262
|
+
def generate_source_map(engine)
|
263
|
+
return if associate_page_failed?
|
264
|
+
|
265
|
+
source_map_page.source_map(engine.source_map)
|
266
|
+
site.pages << source_map_page
|
267
|
+
rescue ::SassC::NotRenderedError => e
|
268
|
+
Jekyll.logger.warn "Could not generate source map #{e.message} => #{e.cause}"
|
269
|
+
end
|
270
|
+
|
271
|
+
def site
|
272
|
+
if associate_page_failed?
|
273
|
+
Jekyll.sites.last
|
274
|
+
else
|
275
|
+
sass_page.site
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
127
279
|
def site_source
|
128
|
-
|
280
|
+
site.source
|
129
281
|
end
|
130
282
|
end
|
131
283
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
# A Jekyll::Page subclass to manage the source map file associated with
|
5
|
+
# a given scss / sass page.
|
6
|
+
class SourceMapPage < Page
|
7
|
+
# Initialize a new SourceMapPage.
|
8
|
+
#
|
9
|
+
# @param [Jekyll::Page] css_page The Page object that manages the css file.
|
10
|
+
def initialize(css_page)
|
11
|
+
@site = css_page.site
|
12
|
+
@dir = css_page.dir
|
13
|
+
@data = css_page.data
|
14
|
+
@name = css_page.basename + ".css.map"
|
15
|
+
|
16
|
+
process(@name)
|
17
|
+
Jekyll::Hooks.trigger :pages, :post_init, self
|
18
|
+
end
|
19
|
+
|
20
|
+
def source_map(map)
|
21
|
+
self.content = map
|
22
|
+
end
|
23
|
+
|
24
|
+
def ext
|
25
|
+
".map"
|
26
|
+
end
|
27
|
+
|
28
|
+
def asset_file?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return[String] the object as a debug String.
|
33
|
+
def inspect
|
34
|
+
"#<#{self.class} @name=#{name.inspect}>"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,57 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-sass-converter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.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:
|
11
|
+
date: 2019-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: sassc
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.1
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version: '3.
|
22
|
+
version: '3.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '3.4'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
27
|
+
- - ">"
|
32
28
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
29
|
+
version: 2.0.1
|
30
|
+
- - "<"
|
39
31
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
32
|
+
version: '3.0'
|
41
33
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
34
|
+
name: bundler
|
43
35
|
requirement: !ruby/object:Gem::Requirement
|
44
36
|
requirements:
|
45
37
|
- - ">="
|
46
38
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
39
|
+
version: '0'
|
48
40
|
type: :development
|
49
41
|
prerelease: false
|
50
42
|
version_requirements: !ruby/object:Gem::Requirement
|
51
43
|
requirements:
|
52
44
|
- - ">="
|
53
45
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
46
|
+
version: '0'
|
55
47
|
- !ruby/object:Gem::Dependency
|
56
48
|
name: rake
|
57
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,19 +73,19 @@ dependencies:
|
|
81
73
|
- !ruby/object:Gem::Version
|
82
74
|
version: '0'
|
83
75
|
- !ruby/object:Gem::Dependency
|
84
|
-
name: rubocop
|
76
|
+
name: rubocop-jekyll
|
85
77
|
requirement: !ruby/object:Gem::Requirement
|
86
78
|
requirements:
|
87
|
-
- -
|
79
|
+
- - "~>"
|
88
80
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
81
|
+
version: '0.4'
|
90
82
|
type: :development
|
91
83
|
prerelease: false
|
92
84
|
version_requirements: !ruby/object:Gem::Requirement
|
93
85
|
requirements:
|
94
|
-
- -
|
86
|
+
- - "~>"
|
95
87
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
88
|
+
version: '0.4'
|
97
89
|
description:
|
98
90
|
email:
|
99
91
|
- parkrmoore@gmail.com
|
@@ -105,6 +97,7 @@ files:
|
|
105
97
|
- lib/jekyll-sass-converter/version.rb
|
106
98
|
- lib/jekyll/converters/sass.rb
|
107
99
|
- lib/jekyll/converters/scss.rb
|
100
|
+
- lib/jekyll/source_map_page.rb
|
108
101
|
homepage: https://github.com/jekyll/jekyll-sass-converter
|
109
102
|
licenses:
|
110
103
|
- MIT
|
@@ -117,15 +110,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
117
110
|
requirements:
|
118
111
|
- - ">="
|
119
112
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
113
|
+
version: 2.4.0
|
121
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
115
|
requirements:
|
123
116
|
- - ">="
|
124
117
|
- !ruby/object:Gem::Version
|
125
118
|
version: '0'
|
126
119
|
requirements: []
|
127
|
-
|
128
|
-
rubygems_version: 2.7.4
|
120
|
+
rubygems_version: 3.0.4
|
129
121
|
signing_key:
|
130
122
|
specification_version: 4
|
131
123
|
summary: A basic Sass converter for Jekyll.
|