sass 3.3.0.rc.2 → 3.3.0.rc.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/CONTRIBUTING +1 -1
- data/README.md +7 -7
- data/Rakefile +4 -2
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/bin/sass +5 -1
- data/bin/sass-convert +5 -1
- data/bin/scss +5 -1
- data/ext/mkrf_conf.rb +23 -0
- data/lib/sass/css.rb +1 -1
- data/lib/sass/engine.rb +19 -9
- data/lib/sass/environment.rb +8 -0
- data/lib/sass/exec.rb +4 -4
- data/lib/sass/features.rb +0 -1
- data/lib/sass/importers/base.rb +13 -6
- data/lib/sass/importers/deprecated_path.rb +8 -2
- data/lib/sass/importers/filesystem.rb +33 -7
- data/lib/sass/logger.rb +1 -4
- data/lib/sass/logger/base.rb +0 -2
- data/lib/sass/logger/log_level.rb +0 -2
- data/lib/sass/plugin.rb +2 -2
- data/lib/sass/plugin/compiler.rb +23 -11
- data/lib/sass/plugin/configuration.rb +0 -1
- data/lib/sass/railtie.rb +1 -0
- data/lib/sass/script/css_lexer.rb +0 -1
- data/lib/sass/script/css_parser.rb +0 -1
- data/lib/sass/script/functions.rb +158 -96
- data/lib/sass/script/lexer.rb +29 -35
- data/lib/sass/script/parser.rb +10 -3
- data/lib/sass/script/tree.rb +0 -1
- data/lib/sass/script/tree/funcall.rb +21 -5
- data/lib/sass/script/tree/list_literal.rb +0 -1
- data/lib/sass/script/value/arg_list.rb +7 -3
- data/lib/sass/script/value/bool.rb +0 -1
- data/lib/sass/script/value/null.rb +0 -1
- data/lib/sass/script/value/number.rb +2 -6
- data/lib/sass/scss/css_parser.rb +0 -1
- data/lib/sass/scss/parser.rb +5 -5
- data/lib/sass/scss/script_lexer.rb +0 -1
- data/lib/sass/scss/script_parser.rb +0 -1
- data/lib/sass/selector.rb +11 -1
- data/lib/sass/selector/comma_sequence.rb +3 -4
- data/lib/sass/selector/sequence.rb +11 -7
- data/lib/sass/selector/simple_sequence.rb +42 -11
- data/lib/sass/source/map.rb +6 -19
- data/lib/sass/tree/at_root_node.rb +1 -1
- data/lib/sass/tree/mixin_node.rb +2 -2
- data/lib/sass/tree/prop_node.rb +0 -1
- data/lib/sass/tree/variable_node.rb +0 -5
- data/lib/sass/tree/visitors/check_nesting.rb +0 -1
- data/lib/sass/tree/visitors/convert.rb +2 -2
- data/lib/sass/tree/visitors/cssize.rb +184 -84
- data/lib/sass/tree/visitors/deep_copy.rb +0 -1
- data/lib/sass/tree/visitors/perform.rb +14 -44
- data/lib/sass/util.rb +59 -12
- data/lib/sass/util/cross_platform_random.rb +19 -0
- data/lib/sass/util/normalized_map.rb +17 -1
- data/test/sass/compiler_test.rb +10 -0
- data/test/sass/conversion_test.rb +36 -0
- data/test/sass/css2sass_test.rb +19 -0
- data/test/sass/engine_test.rb +54 -105
- data/test/sass/functions_test.rb +233 -26
- data/test/sass/importer_test.rb +72 -10
- data/test/sass/plugin_test.rb +14 -0
- data/test/sass/script_conversion_test.rb +4 -4
- data/test/sass/script_test.rb +58 -21
- data/test/sass/scss/css_test.rb +8 -1
- data/test/sass/scss/scss_test.rb +376 -179
- data/test/sass/source_map_test.rb +8 -0
- data/test/sass/templates/subdir/import_up1.scss +1 -0
- data/test/sass/templates/subdir/import_up2.scss +1 -0
- data/test/sass/util_test.rb +16 -0
- data/test/test_helper.rb +12 -4
- metadata +269 -287
- data/lib/sass/script/tree/selector.rb +0 -30
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MDU0OWFlNWFmNTQ3YzkyMzA1ZTQyYmRkNzk0ZDM5MGM4MGEyMzdmMQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
Yzg5MzQ5NDBhNmZkMWJiMGQ0NzYxNmY4MmFmMWU4MTIzNGQ1OGRmNw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZDQwYWRlNWYwODlmMzhiOTJiNmUyOWFhOTExZmU2NmRhZTVhYTdkMTNlOTUy
|
10
|
+
MjAxMDQyMTQyN2Y3ZTIwOGM0ZTVjNjJkN2Q1YWU2ZjNjMWI4ZTRjZmQ4YjM0
|
11
|
+
NjE4ZDUyZjQ1NTNlODBiMGM2YzYzYzExYjQ4N2MwODNiNDBhNGI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjhjMzNhMDU2ZDdlNmJiNmExNjYyMTAyMzg3NjhhZWJjNzFmMGFjMzU3Y2Zk
|
14
|
+
NzE5MzA3YTY5ZWJkNGQyNTc0ZmVmODliYzRkYWQ4MDAwZjQyMmFlMWIwMjE2
|
15
|
+
MzBlZjE5YmU5OWFjZjdhODQ4N2E4Mjg1YjY0YmZhYjQxZDE4Zjk=
|
data/CONTRIBUTING
CHANGED
data/README.md
CHANGED
@@ -57,7 +57,7 @@ Then any Sass files in `public/stylesheets/sass`
|
|
57
57
|
will be compiled into CSS files in `public/stylesheets` on every request.
|
58
58
|
|
59
59
|
To use Sass programmatically,
|
60
|
-
check out the [YARD documentation](http://sass-lang.com/
|
60
|
+
check out the [YARD documentation](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#using_sass).
|
61
61
|
|
62
62
|
## Formatting
|
63
63
|
|
@@ -71,10 +71,10 @@ and get small stylesheets up and running quickly,
|
|
71
71
|
particularly with the help of
|
72
72
|
[the Compass style library](http://compass-style.org).
|
73
73
|
|
74
|
-
[vars]: http://
|
75
|
-
[nested]: http://
|
76
|
-
[mixins]: http://
|
77
|
-
[imports]: http://
|
74
|
+
[vars]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#variables_
|
75
|
+
[nested]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#nested_rules
|
76
|
+
[mixins]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#mixins
|
77
|
+
[imports]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#import
|
78
78
|
|
79
79
|
Sass has two syntaxes.
|
80
80
|
The one presented here, known as "SCSS" (for "Sassy CSS"),
|
@@ -83,7 +83,7 @@ The other (older) syntax, known as the indented syntax or just "Sass",
|
|
83
83
|
is whitespace-sensitive and indentation-based.
|
84
84
|
For more information, see the [reference documentation][syntax].
|
85
85
|
|
86
|
-
[syntax]: http://
|
86
|
+
[syntax]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax
|
87
87
|
|
88
88
|
To run the following examples and see the CSS they produce,
|
89
89
|
put them in a file called `test.scss` and run `sass test.scss`.
|
@@ -152,7 +152,7 @@ You can even give them arguments.
|
|
152
152
|
}
|
153
153
|
|
154
154
|
A comprehensive list of features is available
|
155
|
-
in the [Sass reference](http://
|
155
|
+
in the [Sass reference](http://sass-lang.com/documentation/file.SASS_REFERENCE.html).
|
156
156
|
|
157
157
|
## Executables
|
158
158
|
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rubygems/package'
|
2
|
+
|
1
3
|
# ----- Utility Functions -----
|
2
4
|
|
3
5
|
def scope(path)
|
@@ -21,7 +23,7 @@ end
|
|
21
23
|
|
22
24
|
# ----- Code Style Enforcement -----
|
23
25
|
|
24
|
-
if RUBY_VERSION !~ /^(1\.8
|
26
|
+
if RUBY_VERSION !~ /^(1\.8)/ && (ENV.has_key?("RUBOCOP") && ENV["RUBOCOP"] == "true" || !(ENV.has_key?("RUBOCOP") || ENV.has_key?("TEST")))
|
25
27
|
require 'rubocop/rake_task'
|
26
28
|
Rubocop::RakeTask.new do |t|
|
27
29
|
t.patterns = FileList["lib/**/*"]
|
@@ -47,7 +49,7 @@ task :package => [:revision_file, :date_file, :submodules, :permissions] do
|
|
47
49
|
version = get_version
|
48
50
|
File.open(scope('VERSION'), 'w') {|f| f.puts(version)}
|
49
51
|
load scope('sass.gemspec')
|
50
|
-
Gem::
|
52
|
+
Gem::Package.build(SASS_GEMSPEC)
|
51
53
|
sh %{git checkout VERSION}
|
52
54
|
|
53
55
|
pkg = "#{SASS_GEMSPEC.name}-#{SASS_GEMSPEC.version}"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.3.0.rc.
|
1
|
+
3.3.0.rc.3
|
data/VERSION_DATE
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
07 February 2014 23:53:37 UTC
|
data/bin/sass
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
# The command line Sass parser.
|
3
3
|
|
4
4
|
THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
5
|
-
|
5
|
+
begin
|
6
|
+
require File.dirname(THIS_FILE) + '/../lib/sass'
|
7
|
+
rescue LoadError
|
8
|
+
require 'sass'
|
9
|
+
end
|
6
10
|
require 'sass/exec'
|
7
11
|
|
8
12
|
opts = Sass::Exec::Sass.new(ARGV)
|
data/bin/sass-convert
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
4
|
-
|
4
|
+
begin
|
5
|
+
require File.dirname(THIS_FILE) + '/../lib/sass'
|
6
|
+
rescue LoadError
|
7
|
+
require 'sass'
|
8
|
+
end
|
5
9
|
require 'sass/exec'
|
6
10
|
|
7
11
|
opts = Sass::Exec::SassConvert.new(ARGV)
|
data/bin/scss
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
# The command line Sass parser.
|
3
3
|
|
4
4
|
THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
5
|
-
|
5
|
+
begin
|
6
|
+
require File.dirname(THIS_FILE) + '/../lib/sass'
|
7
|
+
rescue LoadError
|
8
|
+
require 'sass'
|
9
|
+
end
|
6
10
|
require 'sass/exec'
|
7
11
|
|
8
12
|
opts = Sass::Exec::Scss.new(ARGV)
|
data/ext/mkrf_conf.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/command.rb'
|
3
|
+
require 'rubygems/dependency_installer.rb'
|
4
|
+
|
5
|
+
# This script installs the correct version of listen. Listen versions
|
6
|
+
# beyond 1.1 don't support Ruby 1.8, any RubyGems isn't clever enough
|
7
|
+
# to install the most recent version that works, so we have to do it
|
8
|
+
# manually.
|
9
|
+
|
10
|
+
Gem::Command.build_args = ARGV
|
11
|
+
inst = Gem::DependencyInstaller.new
|
12
|
+
if RUBY_VERSION < "1.9"
|
13
|
+
puts "Installing listen ~> 1.1.0"
|
14
|
+
inst.install "listen", "~> 1.1.0"
|
15
|
+
else
|
16
|
+
puts "Installing listen >= 1.1.0, < 2.5"
|
17
|
+
inst.install "listen", Gem::Requirement.new(">= 1.1.0", "< 2.5")
|
18
|
+
end
|
19
|
+
|
20
|
+
# Create a dummy rakefile to indicate success.
|
21
|
+
f = File.open(File.join(File.dirname(__FILE__), "Rakefile"), "w")
|
22
|
+
f.write("task :default\n")
|
23
|
+
f.close
|
data/lib/sass/css.rb
CHANGED
@@ -293,7 +293,7 @@ module Sass
|
|
293
293
|
def bubble_subject(root)
|
294
294
|
root.children.each do |child|
|
295
295
|
bubble_subject(child) if child.is_a?(Tree::RuleNode) || child.is_a?(Tree::DirectiveNode)
|
296
|
-
next unless child.is_a?(Tree::RuleNode)
|
296
|
+
next unless child.is_a?(Tree::RuleNode) && !child.children.empty?
|
297
297
|
next unless child.children.all? do |c|
|
298
298
|
next unless c.is_a?(Tree::RuleNode)
|
299
299
|
first_simple_sel(c).is_a?(Sass::Selector::Parent) && first_sseq(c).subject?
|
data/lib/sass/engine.rb
CHANGED
@@ -51,7 +51,6 @@ require 'sass/media'
|
|
51
51
|
require 'sass/supports'
|
52
52
|
|
53
53
|
module Sass
|
54
|
-
|
55
54
|
# A Sass mixin or function.
|
56
55
|
#
|
57
56
|
# `name`: `String`
|
@@ -346,16 +345,24 @@ module Sass
|
|
346
345
|
private
|
347
346
|
|
348
347
|
def _render_with_sourcemap(sourcemap_uri)
|
349
|
-
|
348
|
+
filename = @options[:filename]
|
349
|
+
importer = @options[:importer]
|
350
|
+
sourcemap_dir = @options[:sourcemap_filename] &&
|
351
|
+
File.dirname(File.expand_path(@options[:sourcemap_filename]))
|
352
|
+
if filename.nil?
|
350
353
|
raise Sass::SyntaxError.new(<<ERR)
|
351
354
|
Error generating source map: couldn't determine public URL for the source stylesheet.
|
352
355
|
No filename is available so there's nothing for the source map to link to.
|
353
356
|
ERR
|
354
|
-
elsif
|
355
|
-
|
356
|
-
|
357
|
+
elsif importer.nil?
|
358
|
+
raise Sass::SyntaxError.new(<<ERR)
|
359
|
+
Error generating source map: couldn't determine public URL for "#{filename}".
|
360
|
+
Without a public URL, there's nothing for the source map to link to.
|
361
|
+
An importer was not set for this file.
|
362
|
+
ERR
|
363
|
+
elsif Sass::Util.silence_warnings {importer.public_url(filename, sourcemap_dir).nil?}
|
357
364
|
raise Sass::SyntaxError.new(<<ERR)
|
358
|
-
Error generating source map: couldn't determine public URL for "#{
|
365
|
+
Error generating source map: couldn't determine public URL for "#{filename}".
|
359
366
|
Without a public URL, there's nothing for the source map to link to.
|
360
367
|
Custom importers should define the #public_url method.
|
361
368
|
ERR
|
@@ -367,7 +374,7 @@ ERR
|
|
367
374
|
rendered << "\n" unless compressed
|
368
375
|
rendered << "/*# sourceMappingURL="
|
369
376
|
rendered << Sass::Util.escape_uri(sourcemap_uri)
|
370
|
-
rendered << "
|
377
|
+
rendered << " */\n"
|
371
378
|
rendered = encode_and_set_charset(rendered)
|
372
379
|
return rendered, sourcemap
|
373
380
|
end
|
@@ -575,6 +582,8 @@ MSG
|
|
575
582
|
if continued_comment &&
|
576
583
|
child.line == continued_comment.line +
|
577
584
|
continued_comment.lines + 1
|
585
|
+
continued_comment.value.last.sub!(/ \*\/\Z/, '')
|
586
|
+
child.value.first.gsub!(/\A\/\*/, ' *')
|
578
587
|
continued_comment.value += ["\n"] + child.value
|
579
588
|
next
|
580
589
|
end
|
@@ -789,6 +798,7 @@ WARNING
|
|
789
798
|
# rubocop:disable MethodLength
|
790
799
|
def parse_directive(parent, line, root)
|
791
800
|
directive, whitespace, value = line.text[1..-1].split(/(\s+)/, 2)
|
801
|
+
raise SyntaxError.new("Invalid directive: '@'.") unless directive
|
792
802
|
offset = directive.size + whitespace.size + 1 if whitespace
|
793
803
|
|
794
804
|
directive_name = directive.gsub('-', '_').to_sym
|
@@ -1127,12 +1137,12 @@ WARNING
|
|
1127
1137
|
content.shift
|
1128
1138
|
end
|
1129
1139
|
|
1130
|
-
return
|
1140
|
+
return "/* */" if content.empty?
|
1131
1141
|
content.last.gsub!(/ ?\*\/ *$/, '')
|
1132
1142
|
content.map! {|l| l.gsub!(/^\*( ?)/, '\1') || (l.empty? ? "" : " ") + l}
|
1133
1143
|
content.first.gsub!(/^ /, '') unless removed_first
|
1134
1144
|
if silent
|
1135
|
-
"
|
1145
|
+
"/*" + content.join("\n *") + " */"
|
1136
1146
|
else
|
1137
1147
|
# The #gsub fixes the case of a trailing */
|
1138
1148
|
"/*" + content.join("\n *").gsub(/ \*\Z/, '') + " */"
|
data/lib/sass/environment.rb
CHANGED
@@ -76,6 +76,13 @@ module Sass
|
|
76
76
|
# Sass::Callable
|
77
77
|
inherited_hash_reader :function
|
78
78
|
|
79
|
+
# Whether a warning has been emitted for assigning to the given
|
80
|
+
# global variable. This is a set of tuples containing the name of
|
81
|
+
# the variable, its filename, and its line number.
|
82
|
+
#
|
83
|
+
# @return [Set<[String, String, int]>]
|
84
|
+
attr_reader :global_warning_given
|
85
|
+
|
79
86
|
# @param options [{Symbol => Object}] The options hash. See
|
80
87
|
# {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
|
81
88
|
# @param parent [Environment] See \{#parent}
|
@@ -83,6 +90,7 @@ module Sass
|
|
83
90
|
@parent = parent
|
84
91
|
@options = options || (parent && parent.options) || {}
|
85
92
|
@stack = Sass::Stack.new if @parent.nil?
|
93
|
+
@global_warning_given = Set.new
|
86
94
|
end
|
87
95
|
|
88
96
|
# The environment of the caller of this environment's mixin or function.
|
data/lib/sass/exec.rb
CHANGED
@@ -316,7 +316,7 @@ END
|
|
316
316
|
else
|
317
317
|
'Specify the default encoding for Sass files.'
|
318
318
|
end
|
319
|
-
opts.on('-E encoding', encoding_desc) do |encoding|
|
319
|
+
opts.on('-E', '--default-encoding ENCODING', encoding_desc) do |encoding|
|
320
320
|
if ::Sass::Util.ruby1_8?
|
321
321
|
$stderr.puts "Specifying the encoding is not supported in ruby 1.8."
|
322
322
|
exit 1
|
@@ -347,6 +347,7 @@ END
|
|
347
347
|
super
|
348
348
|
@options[:for_engine][:filename] = @options[:filename]
|
349
349
|
@options[:for_engine][:css_filename] = @options[:output] if @options[:output].is_a?(String)
|
350
|
+
@options[:for_engine][:sourcemap_filename] = @options[:sourcemap_filename]
|
350
351
|
|
351
352
|
begin
|
352
353
|
input = @options[:input]
|
@@ -535,15 +536,14 @@ MSG
|
|
535
536
|
end
|
536
537
|
|
537
538
|
def default_sass_path
|
538
|
-
if ENV['
|
539
|
+
if ENV['SASS_PATH']
|
539
540
|
# The select here prevents errors when the environment's
|
540
541
|
# load paths specified do not exist.
|
541
|
-
ENV['
|
542
|
+
ENV['SASS_PATH'].split(File::PATH_SEPARATOR).select {|d| File.directory?(d)}
|
542
543
|
else
|
543
544
|
[::Sass::Importers::DeprecatedPath.new(".")]
|
544
545
|
end
|
545
546
|
end
|
546
|
-
|
547
547
|
end
|
548
548
|
|
549
549
|
class Scss < Sass
|
data/lib/sass/features.rb
CHANGED
data/lib/sass/importers/base.rb
CHANGED
@@ -15,13 +15,9 @@ module Sass
|
|
15
15
|
# They should also implement the \{#find\_relative} method.
|
16
16
|
#
|
17
17
|
# Importers should be serializable via `Marshal.dump`.
|
18
|
-
# In addition to the standard `_dump` and `_load` methods,
|
19
|
-
# importers can define `_before_dump`, `_after_dump`, `_around_dump`,
|
20
|
-
# and `_after_load` methods as per {Sass::Util#dump} and {Sass::Util#load}.
|
21
18
|
#
|
22
19
|
# @abstract
|
23
20
|
class Base
|
24
|
-
|
25
21
|
# Find a Sass file relative to another file.
|
26
22
|
# Importers without a notion of "relative paths"
|
27
23
|
# should just return nil here.
|
@@ -129,8 +125,19 @@ module Sass
|
|
129
125
|
# from this importer.
|
130
126
|
#
|
131
127
|
# @param uri [String] A URI known to be valid for this importer.
|
132
|
-
# @
|
133
|
-
|
128
|
+
# @param sourcemap_directory [String, NilClass] The absolute path to a
|
129
|
+
# directory on disk where the sourcemap will be saved. If uri refers to
|
130
|
+
# a file on disk that's accessible relative to sourcemap_directory, this
|
131
|
+
# may return a relative URL. This may be `nil` if the sourcemap's
|
132
|
+
# eventual location is unknown.
|
133
|
+
# @return [String?] The publicly-visible URL for this file, or `nil`
|
134
|
+
# indicating that no publicly-visible URL exists.
|
135
|
+
def public_url(uri, sourcemap_directory = nil)
|
136
|
+
return if @public_url_warning_issued
|
137
|
+
@public_url_warning_issued = true
|
138
|
+
Sass::Util.sass_warn <<WARNING
|
139
|
+
WARNING: #{self.class.name} should define the #public_url method.
|
140
|
+
WARNING
|
134
141
|
nil
|
135
142
|
end
|
136
143
|
|
@@ -4,7 +4,6 @@ module Sass
|
|
4
4
|
# import a file. It is used to deprecate the current working
|
5
5
|
# directory from the list of automatic sass load paths.
|
6
6
|
class DeprecatedPath < Filesystem
|
7
|
-
|
8
7
|
# @param root [String] The absolute, expanded path to the folder that is deprecated.
|
9
8
|
def initialize(root)
|
10
9
|
@specified_root = root
|
@@ -22,6 +21,13 @@ module Sass
|
|
22
21
|
found
|
23
22
|
end
|
24
23
|
|
24
|
+
# @see Base#directories_to_watch
|
25
|
+
def directories_to_watch
|
26
|
+
# The current working directory was not watched in Sass 3.2,
|
27
|
+
# so we continue not to watch it while it's deprecated.
|
28
|
+
[]
|
29
|
+
end
|
30
|
+
|
25
31
|
# @see Sass::Importers::Base#to_s
|
26
32
|
def to_s
|
27
33
|
"#{@root} (DEPRECATED)"
|
@@ -36,7 +42,7 @@ module Sass
|
|
36
42
|
<<WARNING
|
37
43
|
DEPRECATION WARNING: Importing from #{path} will not be
|
38
44
|
automatic in future versions of Sass. To avoid future errors, you can add it
|
39
|
-
to your environment explicitly by setting `
|
45
|
+
to your environment explicitly by setting `SASS_PATH=#{@specified_root}`, by using the -I command
|
40
46
|
line option, or by changing your Sass configuration options.
|
41
47
|
WARNING
|
42
48
|
end
|
@@ -6,7 +6,6 @@ module Sass
|
|
6
6
|
# The default importer, used for any strings found in the load path.
|
7
7
|
# Simply loads Sass files from the filesystem using the default logic.
|
8
8
|
class Filesystem < Base
|
9
|
-
|
10
9
|
attr_accessor :root
|
11
10
|
|
12
11
|
# Creates a new filesystem importer that imports files relative to a given path.
|
@@ -66,6 +65,21 @@ module Sass
|
|
66
65
|
filename.start_with?(root + File::SEPARATOR)
|
67
66
|
end
|
68
67
|
|
68
|
+
def public_url(name, sourcemap_directory = nil)
|
69
|
+
if sourcemap_directory.nil?
|
70
|
+
warn_about_public_url(name)
|
71
|
+
else
|
72
|
+
file_pathname = Pathname.new(Sass::Util.absolute_path(name, @root)).cleanpath
|
73
|
+
sourcemap_pathname = Pathname.new(sourcemap_directory).cleanpath
|
74
|
+
begin
|
75
|
+
file_pathname.relative_path_from(sourcemap_pathname).to_s
|
76
|
+
rescue ArgumentError # when a relative path cannot be constructed
|
77
|
+
warn_about_public_url(name)
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
69
83
|
protected
|
70
84
|
|
71
85
|
# If a full uri is passed, this removes the root from it
|
@@ -130,10 +144,10 @@ module Sass
|
|
130
144
|
dir = dir.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless File::ALT_SEPARATOR.nil?
|
131
145
|
|
132
146
|
found = possible_files(remove_root(name)).map do |f, s|
|
133
|
-
path = dir == "." || Pathname.new(f).absolute? ? f : "#{dir}/#{f}"
|
147
|
+
path = dir == "." || Pathname.new(f).absolute? ? f : "#{escape_glob_characters(dir)}/#{f}"
|
134
148
|
Dir[path].map do |full_path|
|
135
149
|
full_path.gsub!(REDUNDANT_DIRECTORY, File::SEPARATOR)
|
136
|
-
[full_path, s]
|
150
|
+
[Pathname.new(full_path).cleanpath.to_s, s]
|
137
151
|
end
|
138
152
|
end
|
139
153
|
found = Sass::Util.flatten(found, 1)
|
@@ -181,6 +195,22 @@ WARNING
|
|
181
195
|
[dirname, basename, extension]
|
182
196
|
end
|
183
197
|
|
198
|
+
# Issues a warning about being unable to determine a public url.
|
199
|
+
#
|
200
|
+
# @param uri [String] A URI known to be valid for this importer.
|
201
|
+
# @return [NilClass] nil
|
202
|
+
def warn_about_public_url(uri)
|
203
|
+
@warnings_issued ||= Set.new
|
204
|
+
unless @warnings_issued.include?(uri)
|
205
|
+
Sass::Util.sass_warn <<WARNING
|
206
|
+
WARNING: Couldn't determine public URL for "#{uri}" while generating sourcemap.
|
207
|
+
Without a public URL, there's nothing for the source map to link to.
|
208
|
+
WARNING
|
209
|
+
@warnings_issued << uri
|
210
|
+
end
|
211
|
+
nil
|
212
|
+
end
|
213
|
+
|
184
214
|
private
|
185
215
|
|
186
216
|
def _find(dir, name, options)
|
@@ -192,10 +222,6 @@ WARNING
|
|
192
222
|
options[:importer] = self
|
193
223
|
Sass::Engine.new(File.read(full_filename), options)
|
194
224
|
end
|
195
|
-
|
196
|
-
def join(base, path)
|
197
|
-
Pathname.new(base).join(path).to_s
|
198
|
-
end
|
199
225
|
end
|
200
226
|
end
|
201
227
|
end
|