sass 3.1.0 → 3.3.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 +7 -0
- data/CONTRIBUTING +1 -1
- data/MIT-LICENSE +2 -2
- data/README.md +29 -17
- data/Rakefile +43 -9
- data/VERSION +1 -1
- data/VERSION_DATE +1 -0
- data/VERSION_NAME +1 -1
- data/bin/sass +6 -1
- data/bin/sass-convert +6 -1
- data/bin/scss +6 -1
- data/ext/mkrf_conf.rb +27 -0
- data/lib/sass/cache_stores/base.rb +7 -3
- data/lib/sass/cache_stores/chain.rb +3 -2
- data/lib/sass/cache_stores/filesystem.rb +5 -7
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +2 -1
- data/lib/sass/css.rb +168 -53
- data/lib/sass/engine.rb +502 -174
- data/lib/sass/environment.rb +151 -111
- data/lib/sass/error.rb +7 -7
- data/lib/sass/exec.rb +176 -60
- data/lib/sass/features.rb +40 -0
- data/lib/sass/importers/base.rb +46 -7
- data/lib/sass/importers/deprecated_path.rb +51 -0
- data/lib/sass/importers/filesystem.rb +113 -30
- data/lib/sass/importers.rb +1 -0
- data/lib/sass/logger/base.rb +30 -0
- data/lib/sass/logger/log_level.rb +45 -0
- data/lib/sass/logger.rb +12 -0
- data/lib/sass/media.rb +213 -0
- data/lib/sass/plugin/compiler.rb +194 -104
- data/lib/sass/plugin/configuration.rb +18 -25
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +37 -11
- data/lib/sass/plugin.rb +10 -13
- data/lib/sass/railtie.rb +2 -1
- data/lib/sass/repl.rb +5 -6
- data/lib/sass/script/css_lexer.rb +8 -4
- data/lib/sass/script/css_parser.rb +5 -2
- data/lib/sass/script/functions.rb +1547 -618
- data/lib/sass/script/lexer.rb +122 -72
- data/lib/sass/script/parser.rb +304 -135
- data/lib/sass/script/tree/funcall.rb +306 -0
- data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +43 -13
- data/lib/sass/script/tree/list_literal.rb +77 -0
- data/lib/sass/script/tree/literal.rb +45 -0
- data/lib/sass/script/tree/map_literal.rb +64 -0
- data/lib/sass/script/{node.rb → tree/node.rb} +30 -12
- data/lib/sass/script/{operation.rb → tree/operation.rb} +33 -21
- data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +14 -4
- data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +21 -9
- data/lib/sass/script/tree/variable.rb +57 -0
- data/lib/sass/script/tree.rb +15 -0
- data/lib/sass/script/value/arg_list.rb +36 -0
- data/lib/sass/script/value/base.rb +238 -0
- data/lib/sass/script/value/bool.rb +40 -0
- data/lib/sass/script/{color.rb → value/color.rb} +256 -74
- data/lib/sass/script/value/deprecated_false.rb +55 -0
- data/lib/sass/script/value/helpers.rb +155 -0
- data/lib/sass/script/value/list.rb +128 -0
- data/lib/sass/script/value/map.rb +70 -0
- data/lib/sass/script/value/null.rb +49 -0
- data/lib/sass/script/{number.rb → value/number.rb} +115 -62
- data/lib/sass/script/{string.rb → value/string.rb} +9 -11
- data/lib/sass/script/value.rb +12 -0
- data/lib/sass/script.rb +35 -9
- data/lib/sass/scss/css_parser.rb +2 -12
- data/lib/sass/scss/parser.rb +657 -230
- data/lib/sass/scss/rx.rb +17 -12
- data/lib/sass/scss/static_parser.rb +37 -6
- data/lib/sass/scss.rb +0 -1
- data/lib/sass/selector/abstract_sequence.rb +35 -3
- data/lib/sass/selector/comma_sequence.rb +29 -14
- data/lib/sass/selector/sequence.rb +371 -74
- data/lib/sass/selector/simple.rb +28 -13
- data/lib/sass/selector/simple_sequence.rb +163 -36
- data/lib/sass/selector.rb +138 -36
- data/lib/sass/shared.rb +3 -5
- data/lib/sass/source/map.rb +196 -0
- data/lib/sass/source/position.rb +39 -0
- data/lib/sass/source/range.rb +41 -0
- data/lib/sass/stack.rb +126 -0
- data/lib/sass/supports.rb +228 -0
- data/lib/sass/tree/at_root_node.rb +82 -0
- data/lib/sass/tree/comment_node.rb +34 -29
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/css_import_node.rb +60 -0
- data/lib/sass/tree/debug_node.rb +3 -3
- data/lib/sass/tree/directive_node.rb +33 -3
- data/lib/sass/tree/each_node.rb +9 -9
- data/lib/sass/tree/extend_node.rb +20 -6
- data/lib/sass/tree/for_node.rb +6 -6
- data/lib/sass/tree/function_node.rb +12 -4
- data/lib/sass/tree/if_node.rb +2 -15
- data/lib/sass/tree/import_node.rb +11 -5
- data/lib/sass/tree/media_node.rb +27 -11
- data/lib/sass/tree/mixin_def_node.rb +15 -4
- data/lib/sass/tree/mixin_node.rb +27 -7
- data/lib/sass/tree/node.rb +69 -35
- data/lib/sass/tree/prop_node.rb +47 -31
- data/lib/sass/tree/return_node.rb +4 -3
- data/lib/sass/tree/root_node.rb +20 -4
- data/lib/sass/tree/rule_node.rb +37 -26
- data/lib/sass/tree/supports_node.rb +38 -0
- data/lib/sass/tree/trace_node.rb +33 -0
- data/lib/sass/tree/variable_node.rb +10 -4
- data/lib/sass/tree/visitors/base.rb +5 -8
- data/lib/sass/tree/visitors/check_nesting.rb +67 -52
- data/lib/sass/tree/visitors/convert.rb +134 -53
- data/lib/sass/tree/visitors/cssize.rb +245 -51
- data/lib/sass/tree/visitors/deep_copy.rb +102 -0
- data/lib/sass/tree/visitors/extend.rb +68 -0
- data/lib/sass/tree/visitors/perform.rb +331 -105
- data/lib/sass/tree/visitors/set_options.rb +125 -0
- data/lib/sass/tree/visitors/to_css.rb +259 -95
- data/lib/sass/tree/warn_node.rb +3 -3
- data/lib/sass/tree/while_node.rb +3 -3
- data/lib/sass/util/cross_platform_random.rb +19 -0
- data/lib/sass/util/multibyte_string_scanner.rb +157 -0
- data/lib/sass/util/normalized_map.rb +130 -0
- data/lib/sass/util/ordered_hash.rb +192 -0
- data/lib/sass/util/subset_map.rb +11 -2
- data/lib/sass/util/test.rb +9 -0
- data/lib/sass/util.rb +565 -39
- data/lib/sass/version.rb +27 -15
- data/lib/sass.rb +39 -4
- data/test/sass/cache_test.rb +15 -0
- data/test/sass/compiler_test.rb +223 -0
- data/test/sass/conversion_test.rb +901 -107
- data/test/sass/css2sass_test.rb +94 -0
- data/test/sass/engine_test.rb +1059 -164
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +933 -837
- data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/test/sass/functions_test.rb +995 -136
- data/test/sass/importer_test.rb +338 -18
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/more_results/more_import.css +2 -2
- data/test/sass/plugin_test.rb +114 -30
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/import.css +2 -2
- data/test/sass/results/import_charset.css +1 -0
- data/test/sass/results/import_charset_1_8.css +1 -0
- data/test/sass/results/import_charset_ibm866.css +1 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/script.css +1 -1
- data/test/sass/results/scss_import.css +2 -2
- data/test/sass/results/units.css +2 -2
- data/test/sass/script_conversion_test.rb +43 -1
- data/test/sass/script_test.rb +380 -36
- data/test/sass/scss/css_test.rb +257 -75
- data/test/sass/scss/scss_test.rb +2322 -110
- data/test/sass/source_map_test.rb +887 -0
- data/test/sass/templates/_cached_import_option_partial.scss +1 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/_filename_fn_import.scss +11 -0
- data/test/sass/templates/_imported_content.sass +3 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/import_charset.sass +2 -0
- data/test/sass/templates/import_charset_1_8.sass +2 -0
- data/test/sass/templates/import_charset_ibm866.sass +2 -0
- data/test/sass/templates/import_content.sass +4 -0
- data/test/sass/templates/same_name_different_ext.sass +2 -0
- data/test/sass/templates/same_name_different_ext.scss +1 -0
- data/test/sass/templates/same_name_different_partiality.scss +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/test/sass/templates/subdir/import_up1.scss +1 -0
- data/test/sass/templates/subdir/import_up2.scss +1 -0
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/normalized_map_test.rb +51 -0
- data/test/sass/util_test.rb +183 -0
- data/test/sass/value_helpers_test.rb +181 -0
- data/test/test_helper.rb +45 -5
- data/vendor/listen/CHANGELOG.md +228 -0
- data/vendor/listen/CONTRIBUTING.md +38 -0
- data/vendor/listen/Gemfile +30 -0
- data/vendor/listen/Guardfile +8 -0
- data/vendor/{fssm → listen}/LICENSE +1 -1
- data/vendor/listen/README.md +315 -0
- data/vendor/listen/Rakefile +47 -0
- data/vendor/listen/Vagrantfile +96 -0
- data/vendor/listen/lib/listen/adapter.rb +214 -0
- data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
- data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
- data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
- data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
- data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
- data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
- data/vendor/listen/lib/listen/directory_record.rb +371 -0
- data/vendor/listen/lib/listen/listener.rb +225 -0
- data/vendor/listen/lib/listen/multi_listener.rb +143 -0
- data/vendor/listen/lib/listen/turnstile.rb +28 -0
- data/vendor/listen/lib/listen/version.rb +3 -0
- data/vendor/listen/lib/listen.rb +40 -0
- data/vendor/listen/listen.gemspec +22 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
- data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
- data/vendor/listen/spec/listen/listener_spec.rb +169 -0
- data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
- data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
- data/vendor/listen/spec/listen_spec.rb +73 -0
- data/vendor/listen/spec/spec_helper.rb +21 -0
- data/vendor/listen/spec/support/adapter_helper.rb +629 -0
- data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
- data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
- data/vendor/listen/spec/support/listeners_helper.rb +156 -0
- data/vendor/listen/spec/support/platform_helper.rb +15 -0
- metadata +344 -271
- data/lib/sass/less.rb +0 -382
- data/lib/sass/script/bool.rb +0 -18
- data/lib/sass/script/funcall.rb +0 -162
- data/lib/sass/script/list.rb +0 -76
- data/lib/sass/script/literal.rb +0 -245
- data/lib/sass/script/variable.rb +0 -54
- data/lib/sass/scss/sass_parser.rb +0 -11
- data/test/sass/less_conversion_test.rb +0 -653
- data/vendor/fssm/README.markdown +0 -55
- data/vendor/fssm/Rakefile +0 -59
- data/vendor/fssm/VERSION.yml +0 -5
- data/vendor/fssm/example.rb +0 -9
- data/vendor/fssm/fssm.gemspec +0 -77
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
- data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
- data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
- data/vendor/fssm/lib/fssm/monitor.rb +0 -26
- data/vendor/fssm/lib/fssm/path.rb +0 -91
- data/vendor/fssm/lib/fssm/pathname.rb +0 -502
- data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
- data/vendor/fssm/lib/fssm/state/file.rb +0 -24
- data/vendor/fssm/lib/fssm/support.rb +0 -63
- data/vendor/fssm/lib/fssm/tree.rb +0 -176
- data/vendor/fssm/lib/fssm.rb +0 -33
- data/vendor/fssm/profile/prof-cache.rb +0 -40
- data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
- data/vendor/fssm/profile/prof-pathname.rb +0 -68
- data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
- data/vendor/fssm/profile/prof.html +0 -2379
- data/vendor/fssm/spec/path_spec.rb +0 -75
- data/vendor/fssm/spec/root/duck/quack.txt +0 -0
- data/vendor/fssm/spec/root/file.css +0 -0
- data/vendor/fssm/spec/root/file.rb +0 -0
- data/vendor/fssm/spec/root/file.yml +0 -0
- data/vendor/fssm/spec/root/moo/cow.txt +0 -0
- data/vendor/fssm/spec/spec_helper.rb +0 -14
data/lib/sass/script/lexer.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'sass/scss/rx'
|
2
2
|
|
3
|
-
require 'strscan'
|
4
|
-
|
5
3
|
module Sass
|
6
4
|
module Script
|
7
5
|
# The lexical analyzer for SassScript.
|
@@ -18,26 +16,29 @@ module Sass
|
|
18
16
|
# `value`: \[`Object`\]
|
19
17
|
# : The Ruby object corresponding to the value of the token.
|
20
18
|
#
|
21
|
-
# `
|
22
|
-
# : The
|
23
|
-
#
|
24
|
-
# `offset`: \[`Fixnum`\]
|
25
|
-
# : The number of bytes into the line the SassScript token appeared.
|
19
|
+
# `source_range`: \[`Sass::Source::Range`\]
|
20
|
+
# : The range in the source file in which the token appeared.
|
26
21
|
#
|
27
22
|
# `pos`: \[`Fixnum`\]
|
28
23
|
# : The scanner position at which the SassScript token appeared.
|
29
|
-
Token = Struct.new(:type, :value, :
|
24
|
+
Token = Struct.new(:type, :value, :source_range, :pos)
|
30
25
|
|
31
26
|
# The line number of the lexer's current position.
|
32
27
|
#
|
33
28
|
# @return [Fixnum]
|
34
|
-
|
29
|
+
def line
|
30
|
+
return @line unless @tok
|
31
|
+
@tok.source_range.start_pos.line
|
32
|
+
end
|
35
33
|
|
36
34
|
# The number of bytes into the current line
|
37
|
-
# of the lexer's current position.
|
35
|
+
# of the lexer's current position (1-based).
|
38
36
|
#
|
39
37
|
# @return [Fixnum]
|
40
|
-
|
38
|
+
def offset
|
39
|
+
return @offset unless @tok
|
40
|
+
@tok.source_range.start_pos.offset
|
41
|
+
end
|
41
42
|
|
42
43
|
# A hash from operator strings to the corresponding token types.
|
43
44
|
OPERATORS = {
|
@@ -64,15 +65,14 @@ module Sass
|
|
64
65
|
'}' => :end_interpolation,
|
65
66
|
';' => :semicolon,
|
66
67
|
'{' => :lcurly,
|
68
|
+
'...' => :splat,
|
67
69
|
}
|
68
70
|
|
69
71
|
OPERATORS_REVERSE = Sass::Util.map_hash(OPERATORS) {|k, v| [v, k]}
|
70
72
|
|
71
|
-
TOKEN_NAMES = Sass::Util.map_hash(OPERATORS_REVERSE) {|k, v| [k, v.inspect]}.merge(
|
73
|
+
TOKEN_NAMES = Sass::Util.map_hash(OPERATORS_REVERSE) {|k, v| [k, v.inspect]}.merge(
|
72
74
|
:const => "variable (e.g. $foo)",
|
73
|
-
:ident => "identifier (e.g. middle)"
|
74
|
-
:bool => "boolean (e.g. true, false)",
|
75
|
-
})
|
75
|
+
:ident => "identifier (e.g. middle)")
|
76
76
|
|
77
77
|
# A list of operator strings ordered with longer names first
|
78
78
|
# so that `>` and `<` don't clobber `>=` and `<=`.
|
@@ -89,15 +89,18 @@ module Sass
|
|
89
89
|
:single_line_comment => SINGLE_LINE_COMMENT,
|
90
90
|
:variable => /(\$)(#{IDENT})/,
|
91
91
|
:ident => /(#{IDENT})(\()?/,
|
92
|
-
:number => /(
|
92
|
+
:number => /(?:(\d*\.\d+)|(\d+))([a-zA-Z%]+)?/,
|
93
|
+
:unary_minus_number => /-(?:(\d*\.\d+)|(\d+))([a-zA-Z%]+)?/,
|
93
94
|
:color => HEXCOLOR,
|
94
|
-
:
|
95
|
-
|
96
|
-
|
95
|
+
:ident_op => /(#{Regexp.union(*IDENT_OP_NAMES.map do |s|
|
96
|
+
Regexp.new(Regexp.escape(s) + "(?!#{NMCHAR}|\Z)")
|
97
|
+
end)})/,
|
98
|
+
:op => /(#{Regexp.union(*OP_NAMES)})/,
|
97
99
|
}
|
98
100
|
|
99
101
|
class << self
|
100
102
|
private
|
103
|
+
|
101
104
|
def string_re(open, close)
|
102
105
|
/#{open}((?:\\.|\#(?!\{)|[^#{close}\\#])*)(#{close}|#\{)/
|
103
106
|
end
|
@@ -110,23 +113,39 @@ module Sass
|
|
110
113
|
# while the boolean represents whether or not the string
|
111
114
|
# is following an interpolated segment.
|
112
115
|
STRING_REGULAR_EXPRESSIONS = {
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
:double => {
|
117
|
+
false => string_re('"', '"'),
|
118
|
+
true => string_re('', '"')
|
119
|
+
},
|
120
|
+
:single => {
|
121
|
+
false => string_re("'", "'"),
|
122
|
+
true => string_re('', "'")
|
123
|
+
},
|
124
|
+
:uri => {
|
125
|
+
false => /url\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
|
126
|
+
true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
|
127
|
+
},
|
128
|
+
# Defined in https://developer.mozilla.org/en/CSS/@-moz-document as a
|
129
|
+
# non-standard version of http://www.w3.org/TR/css3-conditional/
|
130
|
+
:url_prefix => {
|
131
|
+
false => /url-prefix\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
|
132
|
+
true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
|
133
|
+
},
|
134
|
+
:domain => {
|
135
|
+
false => /domain\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
|
136
|
+
true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
|
137
|
+
}
|
119
138
|
}
|
120
139
|
|
121
140
|
# @param str [String, StringScanner] The source text to lex
|
122
|
-
# @param line [Fixnum] The line on which the SassScript appears.
|
123
|
-
# Used for error reporting
|
124
|
-
# @param offset [Fixnum] The
|
125
|
-
# Used for error reporting
|
141
|
+
# @param line [Fixnum] The 1-based line on which the SassScript appears.
|
142
|
+
# Used for error reporting and sourcemap building
|
143
|
+
# @param offset [Fixnum] The 1-based character (not byte) offset in the line in the source.
|
144
|
+
# Used for error reporting and sourcemap building
|
126
145
|
# @param options [{Symbol => Object}] An options hash;
|
127
146
|
# see {file:SASS_REFERENCE.md#sass_options the Sass options documentation}
|
128
147
|
def initialize(str, line, offset, options)
|
129
|
-
@scanner = str.is_a?(StringScanner) ? str :
|
148
|
+
@scanner = str.is_a?(StringScanner) ? str : Sass::Util::MultibyteStringScanner.new(str)
|
130
149
|
@line = line
|
131
150
|
@offset = offset
|
132
151
|
@options = options
|
@@ -141,7 +160,7 @@ module Sass
|
|
141
160
|
@tok ||= read_token
|
142
161
|
@tok, tok = nil, @tok
|
143
162
|
@prev = tok
|
144
|
-
|
163
|
+
tok
|
145
164
|
end
|
146
165
|
|
147
166
|
# Returns whether or not there's whitespace before the next token.
|
@@ -166,7 +185,11 @@ module Sass
|
|
166
185
|
# Rewinds the underlying StringScanner
|
167
186
|
# to before the token returned by \{#peek}.
|
168
187
|
def unpeek!
|
169
|
-
|
188
|
+
if @tok
|
189
|
+
@scanner.pos = @tok.pos
|
190
|
+
@line = @tok.source_range.start_pos.line
|
191
|
+
@offset = @tok.source_range.start_pos.offset
|
192
|
+
end
|
170
193
|
end
|
171
194
|
|
172
195
|
# @return [Boolean] Whether or not there's more source text to lex.
|
@@ -209,13 +232,11 @@ module Sass
|
|
209
232
|
|
210
233
|
def read_token
|
211
234
|
return if done?
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
Token.new(type, val, @line,
|
218
|
-
current_position - size, @scanner.pos - size)
|
235
|
+
start_pos = source_position
|
236
|
+
value = token
|
237
|
+
return unless value
|
238
|
+
type, val = value
|
239
|
+
Token.new(type, val, range(start_pos), @scanner.pos - @scanner.matched_size)
|
219
240
|
end
|
220
241
|
|
221
242
|
def whitespace
|
@@ -229,9 +250,9 @@ module Sass
|
|
229
250
|
return string(interp_type, true)
|
230
251
|
end
|
231
252
|
|
232
|
-
variable || string(:double, false) || string(:single, false) || number ||
|
233
|
-
|
234
|
-
|
253
|
+
variable || string(:double, false) || string(:single, false) || number || color ||
|
254
|
+
string(:uri, false) || raw(UNICODERANGE) || special_fun || special_val || ident_op ||
|
255
|
+
ident || op
|
235
256
|
end
|
236
257
|
|
237
258
|
def variable
|
@@ -239,8 +260,6 @@ module Sass
|
|
239
260
|
end
|
240
261
|
|
241
262
|
def _variable(rx)
|
242
|
-
line = @line
|
243
|
-
offset = @offset
|
244
263
|
return unless scan(rx)
|
245
264
|
|
246
265
|
[:const, @scanner[2]]
|
@@ -252,82 +271,113 @@ module Sass
|
|
252
271
|
end
|
253
272
|
|
254
273
|
def string(re, open)
|
255
|
-
return unless scan(STRING_REGULAR_EXPRESSIONS[[
|
256
|
-
if @scanner[2] == '#{' #'
|
274
|
+
return unless scan(STRING_REGULAR_EXPRESSIONS[re][open])
|
275
|
+
if @scanner[2] == '#{' # '
|
257
276
|
@scanner.pos -= 2 # Don't actually consume the #{
|
277
|
+
@offset -= 2
|
258
278
|
@interpolation_stack << re
|
259
279
|
end
|
260
280
|
str =
|
261
281
|
if re == :uri
|
262
|
-
|
282
|
+
url = "#{'url(' unless open}#{@scanner[1]}#{')' unless @scanner[2] == '#{'}"
|
283
|
+
Script::Value::String.new(url)
|
263
284
|
else
|
264
|
-
Script::String.new(@scanner[1].gsub(/\\(['"]|\#\{)/, '\1'), :string)
|
285
|
+
Script::Value::String.new(@scanner[1].gsub(/\\(['"]|\#\{)/, '\1'), :string)
|
265
286
|
end
|
266
287
|
[:string, str]
|
267
288
|
end
|
268
289
|
|
269
290
|
def number
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
291
|
+
# Handling unary minus is complicated by the fact that whitespace is an
|
292
|
+
# operator in SassScript. We want "1-2" to be parsed as "1 - 2", but we
|
293
|
+
# want "1 -2" to be parsed as "1 (-2)". To accomplish this, we only
|
294
|
+
# parse a unary minus as part of a number literal if there's whitespace
|
295
|
+
# before and not after it. Cases like "(-2)" are handled by the unary
|
296
|
+
# minus logic in the parser instead.
|
297
|
+
if @scanner.peek(1) == '-'
|
298
|
+
return if @scanner.pos == 0
|
299
|
+
@scanner.pos -= 1
|
300
|
+
# Don't use @scanner.scan so we don't mess up the match data.
|
301
|
+
unary_minus_allowed = @scanner.peek(1) =~ /\s/
|
302
|
+
@scanner.pos += 1
|
303
|
+
|
304
|
+
return unless unary_minus_allowed
|
305
|
+
return unless scan(REGULAR_EXPRESSIONS[:unary_minus_number])
|
306
|
+
minus = true
|
307
|
+
else
|
308
|
+
return unless scan(REGULAR_EXPRESSIONS[:number])
|
309
|
+
minus = false
|
310
|
+
end
|
311
|
+
|
312
|
+
value = (@scanner[1] ? @scanner[1].to_f : @scanner[2].to_i) * (minus ? -1 : 1)
|
313
|
+
script_number = Script::Value::Number.new(value, Array(@scanner[3]))
|
314
|
+
[:number, script_number]
|
274
315
|
end
|
275
316
|
|
276
317
|
def color
|
277
|
-
|
318
|
+
s = scan(REGULAR_EXPRESSIONS[:color])
|
319
|
+
return unless s
|
278
320
|
raise Sass::SyntaxError.new(<<MESSAGE.rstrip) unless s.size == 4 || s.size == 7
|
279
321
|
Colors must have either three or six digits: '#{s}'
|
280
322
|
MESSAGE
|
281
|
-
|
282
|
-
|
283
|
-
[:color, Script::Color.new(value)]
|
284
|
-
end
|
285
|
-
|
286
|
-
def bool
|
287
|
-
return unless s = scan(REGULAR_EXPRESSIONS[:bool])
|
288
|
-
[:bool, Script::Bool.new(s == 'true')]
|
323
|
+
script_color = Script::Value::Color.from_hex(s)
|
324
|
+
[:color, script_color]
|
289
325
|
end
|
290
326
|
|
291
327
|
def special_fun
|
292
|
-
|
328
|
+
str1 = scan(/((-[\w-]+-)?(calc|element)|expression|progid:[a-z\.]*)\(/i)
|
329
|
+
return unless str1
|
293
330
|
str2, _ = Sass::Shared.balance(@scanner, ?(, ?), 1)
|
294
331
|
c = str2.count("\n")
|
295
332
|
old_line = @line
|
296
333
|
old_offset = @offset
|
297
334
|
@line += c
|
298
|
-
@offset =
|
335
|
+
@offset = c == 0 ? @offset + str2.size : str2[/\n([^\n]*)/, 1].size + 1
|
299
336
|
[:special_fun,
|
300
|
-
|
337
|
+
Sass::Util.merge_adjacent_strings(
|
301
338
|
[str1] + Sass::Engine.parse_interp(str2, old_line, old_offset, @options)),
|
302
|
-
|
339
|
+
str1.size + str2.size]
|
340
|
+
end
|
341
|
+
|
342
|
+
def special_val
|
343
|
+
return unless scan(/!important/i)
|
344
|
+
[:string, Script::Value::String.new("!important")]
|
303
345
|
end
|
304
346
|
|
305
347
|
def ident_op
|
306
|
-
|
348
|
+
op = scan(REGULAR_EXPRESSIONS[:ident_op])
|
349
|
+
return unless op
|
307
350
|
[OPERATORS[op]]
|
308
351
|
end
|
309
352
|
|
310
353
|
def op
|
311
|
-
|
354
|
+
op = scan(REGULAR_EXPRESSIONS[:op])
|
355
|
+
return unless op
|
312
356
|
@interpolation_stack << nil if op == :begin_interpolation
|
313
357
|
[OPERATORS[op]]
|
314
358
|
end
|
315
359
|
|
316
360
|
def raw(rx)
|
317
|
-
|
361
|
+
val = scan(rx)
|
362
|
+
return unless val
|
318
363
|
[:raw, val]
|
319
364
|
end
|
320
365
|
|
321
366
|
def scan(re)
|
322
|
-
|
367
|
+
str = @scanner.scan(re)
|
368
|
+
return unless str
|
323
369
|
c = str.count("\n")
|
324
370
|
@line += c
|
325
|
-
@offset = (c == 0 ? @offset + str.size : str
|
371
|
+
@offset = (c == 0 ? @offset + str.size : str.size - str.rindex("\n") + 1)
|
326
372
|
str
|
327
373
|
end
|
328
374
|
|
329
|
-
def
|
330
|
-
@
|
375
|
+
def range(start_pos, end_pos = source_position)
|
376
|
+
Sass::Source::Range.new(start_pos, end_pos, @options[:filename], @options[:importer])
|
377
|
+
end
|
378
|
+
|
379
|
+
def source_position
|
380
|
+
Sass::Source::Position.new(@line, @offset)
|
331
381
|
end
|
332
382
|
end
|
333
383
|
end
|