jekyll-sass-converter 1.5.2 → 2.0.0.pre.beta
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/fake-sass.rb +33 -0
- data/lib/jekyll-sass-converter.rb +1 -0
- data/lib/jekyll-sass-converter/version.rb +1 -1
- data/lib/jekyll/converters/sass.rb +3 -5
- data/lib/jekyll/converters/scss.rb +177 -23
- data/lib/jekyll/source_map_page.rb +37 -0
- metadata +24 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32ee65ba1a116c08b27670f7927808870566b835f04f2e6306635feeab013d52
|
4
|
+
data.tar.gz: e92c052e3d395c0b9fe6ca3337a8815eb752b7db09805597988f1eabf02bc40e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32b9663ca870b8a92a8abad9fe6e4cc1d3367821a08c4f9d78888e0e52444cb9469844148c2ba1de364b4022d70186dbbb3ef3ea264093a6c4980e7e26cb4b99
|
7
|
+
data.tar.gz: 5f2041e1f9b46900bad242431ce1a686dd8919657f0a9810c7256e93986dd7cec36f8506ebbc1a1261fb372ab56bcb230ee2645dfbe35134f7c88c5dec0b7589
|
data/lib/fake-sass.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This module helps to get rid of the now deprecated
|
4
|
+
# [ruby-sass](https://github.com/sass/ruby-sass).
|
5
|
+
#
|
6
|
+
# Some modules used in jekyll depend on the function `Sass.load_paths`
|
7
|
+
# from ruby-sass. (see for example `Jekyll::Theme.configure_sass`).
|
8
|
+
#
|
9
|
+
# This module provides a workaround when ruby-sass is not installed
|
10
|
+
# by faking this functionality...
|
11
|
+
#
|
12
|
+
# Please note that this module should never be installed __together__ with ruby-sass.
|
13
|
+
module Sass
|
14
|
+
# The global load paths for Sass files. This is meant for plugins and libraries to register
|
15
|
+
# the paths to their Sass stylesheets to that they may be `@imported`. This load path is used
|
16
|
+
# by every instance of {Sass::Engine}.
|
17
|
+
# They are lower-precedence than any load paths passed in via the
|
18
|
+
# {file:SASS_REFERENCE.md#load_paths-option `:load_paths` option}.
|
19
|
+
#
|
20
|
+
# If the `SASS_PATH` environment variable is set, the initial value of `load_paths` will be
|
21
|
+
# initialized based on that. The variable should be a colon-separated list of path names
|
22
|
+
# (semicolon-separated on Windows).
|
23
|
+
#
|
24
|
+
# Note that files on the global load path are never compiled to CSS themselves, even if they
|
25
|
+
# aren't partials. They exist only to be imported.
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# Sass.load_paths << File.dirname(__FILE__ + '/sass')
|
29
|
+
# @return [Array<String, Pathname, Sass::Importers::Base>]
|
30
|
+
def self.load_paths
|
31
|
+
@load_paths ||= ENV["SASS_PATH"].to_s.split(File::PATH_SEPARATOR)
|
32
|
+
end
|
33
|
+
end
|
@@ -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,12 @@ 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
|
-
paths = user_sass_load_paths +
|
127
|
+
paths = user_sass_load_paths +
|
128
|
+
[sass_dir_relative_to_site_source] +
|
129
|
+
Array(::Sass.load_paths)
|
130
|
+
paths << site.theme.sass_path if site.theme&.sass_path
|
79
131
|
|
80
132
|
if safe?
|
81
133
|
# Sanitize paths to prevent any attack vectors (.e.g. `/**/*`)
|
@@ -98,6 +150,7 @@ module Jekyll
|
|
98
150
|
|
99
151
|
paths.select { |path| File.directory?(path) }
|
100
152
|
end
|
153
|
+
# rubocop:enable Metrics/AbcSize
|
101
154
|
|
102
155
|
def allow_caching?
|
103
156
|
!safe?
|
@@ -108,24 +161,125 @@ module Jekyll
|
|
108
161
|
end
|
109
162
|
|
110
163
|
def sass_configs
|
111
|
-
sass_build_configuration_options(
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
164
|
+
sass_build_configuration_options(
|
165
|
+
:style => sass_style,
|
166
|
+
:syntax => syntax,
|
167
|
+
:filename => filename,
|
168
|
+
:output_path => output_path,
|
169
|
+
:source_map_file => source_map_file,
|
170
|
+
:load_paths => sass_load_paths,
|
171
|
+
:omit_source_map_url => !sourcemap_required?,
|
172
|
+
:source_map_contents => true,
|
173
|
+
:line_comments_option => line_comments_option
|
174
|
+
)
|
116
175
|
end
|
117
176
|
|
118
177
|
def convert(content)
|
119
|
-
|
178
|
+
config = sass_configs
|
179
|
+
engine = SassC::Engine.new(content.dup, config)
|
180
|
+
output = engine.render
|
181
|
+
generate_source_map(engine) if sourcemap_required?
|
120
182
|
replacement = add_charset? ? '@charset "UTF-8";' : ""
|
121
183
|
output.sub(BYTE_ORDER_MARK, replacement)
|
122
|
-
rescue ::
|
123
|
-
raise SyntaxError,
|
184
|
+
rescue SassC::SyntaxError => e
|
185
|
+
raise SyntaxError, e.to_s
|
124
186
|
end
|
125
187
|
|
126
188
|
private
|
189
|
+
|
190
|
+
# The Page instance for which this object acts as a converter.
|
191
|
+
attr_reader :sass_page
|
192
|
+
|
193
|
+
def associate_page_failed?
|
194
|
+
!sass_page
|
195
|
+
end
|
196
|
+
|
197
|
+
# The name of the input scss (or sass) file. This information will be used for error
|
198
|
+
# reporting and will written into the source map file as main source.
|
199
|
+
#
|
200
|
+
# Returns the name of the input file or "stdin" if #associate_page failed
|
201
|
+
def filename
|
202
|
+
return "stdin" if associate_page_failed?
|
203
|
+
|
204
|
+
sass_page.name
|
205
|
+
end
|
206
|
+
|
207
|
+
# The value of the `line_comments` option.
|
208
|
+
# When set to `true` causes the line number and filename of the source be emitted into the
|
209
|
+
# compiled CSS-file. Useful for debugging when the source-map is not available.
|
210
|
+
#
|
211
|
+
# Returns the value of the `line_comments`-option chosen by the user or 'false' by default.
|
212
|
+
def line_comments_option
|
213
|
+
jekyll_sass_configuration.fetch("line_comments", false)
|
214
|
+
end
|
215
|
+
|
216
|
+
# The value of the `sourcemap` option chosen by the user.
|
217
|
+
#
|
218
|
+
# This option controls when sourcemaps shall be generated or not.
|
219
|
+
#
|
220
|
+
# Returns the value of the `sourcemap`-option chosen by the user or ':always' by default.
|
221
|
+
def sourcemap_option
|
222
|
+
jekyll_sass_configuration.fetch("sourcemap", :always).to_sym
|
223
|
+
end
|
224
|
+
|
225
|
+
# Determines whether a sourcemap shall be generated or not.
|
226
|
+
#
|
227
|
+
# Returns `true` if a sourcemap shall be generated, `false` otherwise.
|
228
|
+
def sourcemap_required?
|
229
|
+
return false if associate_page_failed? || sourcemap_option == :never
|
230
|
+
return true if sourcemap_option == :always
|
231
|
+
|
232
|
+
!(sourcemap_option == :development && Jekyll.env != "development")
|
233
|
+
end
|
234
|
+
|
235
|
+
# The name of the generated css file. This information will be written into the source map
|
236
|
+
# file as a backward reference to the input.
|
237
|
+
#
|
238
|
+
# Returns the name of the css file or "stdin.css" if #associate_page failed
|
239
|
+
def output_path
|
240
|
+
return "stdin.css" if associate_page_failed?
|
241
|
+
|
242
|
+
sass_page.basename + ".css"
|
243
|
+
end
|
244
|
+
|
245
|
+
# The name of the generated source map file. This information will be written into the
|
246
|
+
# css file to reference to the source map.
|
247
|
+
#
|
248
|
+
# Returns the name of the css file or "" if #associate_page failed
|
249
|
+
def source_map_file
|
250
|
+
return "" if associate_page_failed?
|
251
|
+
|
252
|
+
sass_page.basename + ".css.map"
|
253
|
+
end
|
254
|
+
|
255
|
+
def source_map_page
|
256
|
+
return if associate_page_failed?
|
257
|
+
|
258
|
+
@source_map_page ||= SourceMapPage.new(sass_page)
|
259
|
+
end
|
260
|
+
|
261
|
+
# Reads the source-map from the engine and adds it to the source-map-page.
|
262
|
+
#
|
263
|
+
# @param [::SassC::Engine] engine The sass Compiler engine.
|
264
|
+
def generate_source_map(engine)
|
265
|
+
return if associate_page_failed?
|
266
|
+
|
267
|
+
source_map_page.source_map(engine.source_map)
|
268
|
+
site.pages << source_map_page
|
269
|
+
rescue ::SassC::NotRenderedError => e
|
270
|
+
Jekyll.logger.warn "Could not generate source map #{e.message} => #{e.cause}"
|
271
|
+
end
|
272
|
+
|
273
|
+
def site
|
274
|
+
if associate_page_failed?
|
275
|
+
Jekyll.sites.last
|
276
|
+
else
|
277
|
+
sass_page.site
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
127
281
|
def site_source
|
128
|
-
|
282
|
+
site.source
|
129
283
|
end
|
130
284
|
end
|
131
285
|
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,57 @@
|
|
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.pre.beta
|
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-04 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
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: jekyll
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,19 +81,19 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name: rubocop
|
84
|
+
name: rubocop-jekyll
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
89
|
+
version: '0.4'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
96
|
+
version: '0.4'
|
97
97
|
description:
|
98
98
|
email:
|
99
99
|
- parkrmoore@gmail.com
|
@@ -101,10 +101,12 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
+
- lib/fake-sass.rb
|
104
105
|
- lib/jekyll-sass-converter.rb
|
105
106
|
- lib/jekyll-sass-converter/version.rb
|
106
107
|
- lib/jekyll/converters/sass.rb
|
107
108
|
- lib/jekyll/converters/scss.rb
|
109
|
+
- lib/jekyll/source_map_page.rb
|
108
110
|
homepage: https://github.com/jekyll/jekyll-sass-converter
|
109
111
|
licenses:
|
110
112
|
- MIT
|
@@ -117,15 +119,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
117
119
|
requirements:
|
118
120
|
- - ">="
|
119
121
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
122
|
+
version: 2.4.0
|
121
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
124
|
requirements:
|
123
|
-
- - "
|
125
|
+
- - ">"
|
124
126
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
127
|
+
version: 1.3.1
|
126
128
|
requirements: []
|
127
|
-
|
128
|
-
rubygems_version: 2.7.4
|
129
|
+
rubygems_version: 3.0.4
|
129
130
|
signing_key:
|
130
131
|
specification_version: 4
|
131
132
|
summary: A basic Sass converter for Jekyll.
|