haml-edge 2.3.179 → 2.3.180
Sign up to get free protection for your applications and to get access to all the features.
- data/EDGE_GEM_VERSION +1 -1
- data/README.md +88 -149
- data/VERSION +1 -1
- data/bin/css2sass +7 -1
- data/bin/sass-convert +7 -0
- data/lib/haml/exec.rb +95 -22
- data/lib/haml/template.rb +1 -1
- data/lib/haml/util.rb +50 -0
- data/lib/sass.rb +1 -1
- data/lib/sass/css.rb +38 -210
- data/lib/sass/engine.rb +121 -47
- data/lib/sass/files.rb +28 -19
- data/lib/sass/plugin.rb +32 -43
- data/lib/sass/repl.rb +1 -1
- data/lib/sass/script.rb +25 -6
- data/lib/sass/script/bool.rb +1 -0
- data/lib/sass/script/color.rb +2 -2
- data/lib/sass/script/css_lexer.rb +22 -0
- data/lib/sass/script/css_parser.rb +28 -0
- data/lib/sass/script/funcall.rb +17 -9
- data/lib/sass/script/functions.rb +46 -1
- data/lib/sass/script/interpolation.rb +42 -0
- data/lib/sass/script/lexer.rb +142 -34
- data/lib/sass/script/literal.rb +28 -12
- data/lib/sass/script/node.rb +57 -1
- data/lib/sass/script/number.rb +18 -3
- data/lib/sass/script/operation.rb +44 -8
- data/lib/sass/script/parser.rb +149 -24
- data/lib/sass/script/string.rb +50 -2
- data/lib/sass/script/unary_operation.rb +25 -10
- data/lib/sass/script/variable.rb +20 -11
- data/lib/sass/scss.rb +14 -0
- data/lib/sass/scss/css_parser.rb +39 -0
- data/lib/sass/scss/parser.rb +683 -0
- data/lib/sass/scss/rx.rb +112 -0
- data/lib/sass/scss/script_lexer.rb +13 -0
- data/lib/sass/scss/script_parser.rb +25 -0
- data/lib/sass/tree/comment_node.rb +58 -16
- data/lib/sass/tree/debug_node.rb +7 -2
- data/lib/sass/tree/directive_node.rb +38 -34
- data/lib/sass/tree/for_node.rb +6 -0
- data/lib/sass/tree/if_node.rb +13 -0
- data/lib/sass/tree/import_node.rb +26 -7
- data/lib/sass/tree/mixin_def_node.rb +18 -0
- data/lib/sass/tree/mixin_node.rb +16 -1
- data/lib/sass/tree/node.rb +98 -27
- data/lib/sass/tree/prop_node.rb +97 -20
- data/lib/sass/tree/root_node.rb +37 -0
- data/lib/sass/tree/rule_node.rb +88 -60
- data/lib/sass/tree/variable_node.rb +9 -5
- data/lib/sass/tree/while_node.rb +4 -0
- data/test/haml/results/filters.xhtml +1 -1
- data/test/haml/util_test.rb +28 -0
- data/test/sass/conversion_test.rb +884 -0
- data/test/sass/css2sass_test.rb +46 -21
- data/test/sass/engine_test.rb +680 -160
- data/test/sass/functions_test.rb +27 -0
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/more_templates/more_import.sass +3 -3
- data/test/sass/plugin_test.rb +28 -8
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +5 -5
- data/test/sass/results/compressed.css +1 -1
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +3 -1
- data/test/sass/results/mixins.css +12 -12
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +4 -4
- data/test/sass/results/script.css +3 -3
- data/test/sass/results/scss_import.css +15 -0
- data/test/sass/results/scss_importee.css +2 -0
- data/test/sass/script_conversion_test.rb +153 -0
- data/test/sass/script_test.rb +44 -54
- data/test/sass/scss/css_test.rb +811 -0
- data/test/sass/scss/rx_test.rb +156 -0
- data/test/sass/scss/scss_test.rb +871 -0
- data/test/sass/scss/test_helper.rb +37 -0
- data/test/sass/templates/alt.sass +2 -2
- data/test/sass/templates/bork1.sass +1 -1
- data/test/sass/templates/import.sass +4 -4
- data/test/sass/templates/importee.sass +3 -3
- data/test/sass/templates/line_numbers.sass +1 -1
- data/test/sass/templates/mixins.sass +2 -2
- data/test/sass/templates/nested_mixin_bork.sass +1 -1
- data/test/sass/templates/options.sass +1 -1
- data/test/sass/templates/parent_ref.sass +2 -2
- data/test/sass/templates/script.sass +69 -69
- data/test/sass/templates/scss_import.scss +10 -0
- data/test/sass/templates/scss_importee.scss +1 -0
- data/test/sass/templates/units.sass +10 -10
- data/test/test_helper.rb +4 -4
- metadata +27 -2
data/lib/sass/files.rb
CHANGED
@@ -11,7 +11,7 @@ module Sass
|
|
11
11
|
# Returns the {Sass::Tree} for the given file,
|
12
12
|
# reading it from the Sass cache if possible.
|
13
13
|
#
|
14
|
-
# @param filename [String] The path to the Sass file
|
14
|
+
# @param filename [String] The path to the Sass or SCSS file
|
15
15
|
# @param options [{Symbol => Object}] The options hash.
|
16
16
|
# Only the {file:SASS_REFERENCE.md#cache-option `:cache_location`} option is used
|
17
17
|
# @raise [Sass::SyntaxError] if there's an error in the document.
|
@@ -30,50 +30,59 @@ module Sass
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
options = options.merge(:filename => filename)
|
34
|
+
if filename =~ /\.scss$/
|
35
|
+
options = options.merge(:syntax => :scss)
|
36
|
+
elsif filename =~ /\.sass$/
|
37
|
+
options = options.merge(:syntax => :sass)
|
38
|
+
end
|
39
|
+
|
40
|
+
engine = Sass::Engine.new(text, options)
|
34
41
|
|
35
42
|
root = engine.to_tree
|
36
43
|
try_to_write_sassc(root, compiled_filename, sha, options) if options[:cache]
|
37
44
|
root
|
38
45
|
end
|
39
46
|
|
40
|
-
# Find the full filename of a Sass or CSS file to import.
|
47
|
+
# Find the full filename of a Sass, SCSS, or CSS file to import.
|
41
48
|
# This follows Sass's import rules:
|
42
|
-
# if the filename given ends in `".sass"` or `".css"`,
|
49
|
+
# if the filename given ends in `".sass"`, `".scss"`, or `".css"`,
|
43
50
|
# it will try to find that type of file;
|
44
|
-
# otherwise, it will try to find the corresponding Sass file
|
51
|
+
# otherwise, it will try to find the corresponding Sass/SCSS file
|
45
52
|
# and fall back on CSS if it's not available.
|
46
53
|
#
|
47
|
-
# Any Sass filename returned will correspond to
|
48
|
-
# an actual
|
54
|
+
# Any Sass/SCSS filename returned will correspond to
|
55
|
+
# an actual file of the corresponding type on the filesystem.
|
49
56
|
# CSS filenames, however, may not;
|
50
57
|
# they're expected to be put through directly to the stylesheet
|
51
58
|
# as CSS `@import` statements.
|
52
59
|
#
|
53
60
|
# @param filename [String] The filename to search for
|
54
61
|
# @param load_paths [Array<String>] The set of filesystem paths
|
55
|
-
# to search for Sass files.
|
62
|
+
# to search for Sass/SCSS files.
|
56
63
|
# @return [String] The filename of the imported file.
|
57
|
-
# This is an absolute path if the file is a `".sass"` file.
|
58
|
-
# @raise [Sass::SyntaxError] if `filename` ends in
|
59
|
-
# and no corresponding Sass file could be found.
|
64
|
+
# This is an absolute path if the file is a `".sass"` or `".scss"` file.
|
65
|
+
# @raise [Sass::SyntaxError] if `filename` ends in `".sass"` or `".scss"`
|
66
|
+
# and no corresponding Sass/SCSS file could be found.
|
60
67
|
def find_file_to_import(filename, load_paths)
|
61
|
-
was_sass = false
|
68
|
+
was_sass = was_scss = false
|
62
69
|
original_filename = filename
|
63
70
|
|
64
|
-
if filename[-5..-1]
|
71
|
+
if [".sass", ".scss"].include?(filename[-5..-1])
|
72
|
+
was_sass = filename[-5..-1] == ".sass"
|
73
|
+
was_scss = filename[-5..-1] == ".scss"
|
65
74
|
filename = filename[0...-5]
|
66
|
-
was_sass = true
|
67
75
|
elsif filename[-4..-1] == ".css"
|
68
76
|
return filename
|
69
77
|
end
|
70
78
|
|
71
|
-
new_filename
|
79
|
+
new_filename = find_full_path("#{filename}.sass", load_paths) unless was_scss
|
80
|
+
new_filename ||= find_full_path("#{filename}.scss", load_paths) unless was_sass
|
72
81
|
|
73
82
|
return new_filename if new_filename
|
74
|
-
unless was_sass
|
75
|
-
|
76
|
-
WARNING: #{filename}.sass
|
83
|
+
unless was_sass || was_scss
|
84
|
+
Haml::Util.haml_warn <<END
|
85
|
+
WARNING: Neither #{filename}.sass nor .scss found. Using #{filename}.css instead.
|
77
86
|
This behavior is deprecated and will be removed in a future version.
|
78
87
|
If you really need #{filename}.css, import it explicitly.
|
79
88
|
END
|
@@ -107,7 +116,7 @@ END
|
|
107
116
|
return Marshal.load(f.read)
|
108
117
|
end
|
109
118
|
rescue EOFError, TypeError, ArgumentError => e
|
110
|
-
|
119
|
+
Haml::Util.haml_warn "Warning. Error encountered while reading cache #{compiled_filename}: #{e}"
|
111
120
|
end
|
112
121
|
|
113
122
|
def try_to_write_sassc(root, compiled_filename, sha, options)
|
data/lib/sass/plugin.rb
CHANGED
@@ -5,7 +5,7 @@ require 'sass'
|
|
5
5
|
require 'sass/callbacks'
|
6
6
|
|
7
7
|
module Sass
|
8
|
-
# This module handles the compilation of Sass files.
|
8
|
+
# This module handles the compilation of Sass/SCSS files.
|
9
9
|
# It provides global options and checks whether CSS files
|
10
10
|
# need to be updated.
|
11
11
|
#
|
@@ -25,9 +25,9 @@ module Sass
|
|
25
25
|
# puts "Compiling #{template} to #{css}"
|
26
26
|
# end
|
27
27
|
# Sass::Plugin.update_stylesheets
|
28
|
-
# #=> Compiling app/sass/screen.
|
29
|
-
# #=> Compiling app/sass/print.
|
30
|
-
# #=> Compiling app/sass/ie.
|
28
|
+
# #=> Compiling app/sass/screen.scss to public/stylesheets/screen.css
|
29
|
+
# #=> Compiling app/sass/print.scss to public/stylesheets/print.css
|
30
|
+
# #=> Compiling app/sass/ie.scss to public/stylesheets/ie.css
|
31
31
|
module Plugin
|
32
32
|
include Haml::Util
|
33
33
|
include Sass::Callbacks
|
@@ -65,7 +65,7 @@ module Sass
|
|
65
65
|
#
|
66
66
|
# @yield [template, css]
|
67
67
|
# @yieldparam template [String]
|
68
|
-
# The location of the Sass file being updated.
|
68
|
+
# The location of the Sass/SCSS file being updated.
|
69
69
|
# @yieldparam css [String]
|
70
70
|
# The location of the CSS file being generated.
|
71
71
|
define_callback :updating_stylesheet
|
@@ -81,7 +81,7 @@ module Sass
|
|
81
81
|
#
|
82
82
|
# @yield [template, css]
|
83
83
|
# @yieldparam template [String]
|
84
|
-
# The location of the Sass file not being updated.
|
84
|
+
# The location of the Sass/SCSS file not being updated.
|
85
85
|
# @yieldparam css [String]
|
86
86
|
# The location of the CSS file not being generated.
|
87
87
|
define_callback :not_updating_stylesheet
|
@@ -94,7 +94,7 @@ module Sass
|
|
94
94
|
# @yield [error, template, css]
|
95
95
|
# @yieldparam error [Exception] The exception that was raised.
|
96
96
|
# @yieldparam template [String]
|
97
|
-
# The location of the Sass file being updated.
|
97
|
+
# The location of the Sass/SCSS file being updated.
|
98
98
|
# @yieldparam css [String]
|
99
99
|
# The location of the CSS file being generated.
|
100
100
|
define_callback :compilation_error
|
@@ -142,7 +142,7 @@ module Sass
|
|
142
142
|
define_callback :template_deleted
|
143
143
|
|
144
144
|
# Register a callback to be run when Sass deletes a CSS file.
|
145
|
-
# This happens when the corresponding Sass file has been deleted.
|
145
|
+
# This happens when the corresponding Sass/SCSS file has been deleted.
|
146
146
|
#
|
147
147
|
# @yield [filename]
|
148
148
|
# @yieldparam filename [String]
|
@@ -192,7 +192,7 @@ module Sass
|
|
192
192
|
|
193
193
|
# Updates out-of-date stylesheets.
|
194
194
|
#
|
195
|
-
# Checks each Sass file in {file:SASS_REFERENCE.md#template_location-option `:template_location`}
|
195
|
+
# Checks each Sass/SCSS file in {file:SASS_REFERENCE.md#template_location-option `:template_location`}
|
196
196
|
# to see if it's been modified more recently than the corresponding CSS file
|
197
197
|
# in {file:SASS_REFERENCE.md#css_location-option `:css_location`}.
|
198
198
|
# If it has, it updates the CSS file.
|
@@ -201,7 +201,7 @@ module Sass
|
|
201
201
|
# A list of files to check for updates
|
202
202
|
# **in addition to those specified by the
|
203
203
|
# {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
|
204
|
-
# The first string in each pair is the location of the Sass file,
|
204
|
+
# The first string in each pair is the location of the Sass/SCSS file,
|
205
205
|
# the second is the location of the CSS file that it should be compiled to.
|
206
206
|
def update_stylesheets(individual_files = [])
|
207
207
|
return if options[:never_update]
|
@@ -213,32 +213,30 @@ module Sass
|
|
213
213
|
@checked_for_updates = true
|
214
214
|
template_locations.zip(css_locations).each do |template_location, css_location|
|
215
215
|
|
216
|
-
Dir.glob(File.join(template_location, "**", "*.
|
217
|
-
# Get the relative path to the file
|
218
|
-
name = file.sub(template_location.sub(/\/*$/, '/'), "")
|
216
|
+
Dir.glob(File.join(template_location, "**", "*.s[ca]ss")).each do |file|
|
217
|
+
# Get the relative path to the file
|
218
|
+
name = file.sub(template_location.sub(/\/*$/, '/'), "")
|
219
|
+
css = css_filename(name, css_location)
|
219
220
|
|
220
221
|
next if forbid_update?(name)
|
221
|
-
|
222
|
-
|
223
|
-
css = css_filename(name, css_location)
|
224
|
-
if options[:always_update] || stylesheet_needs_update?(name, template_location, css_location)
|
225
|
-
update_stylesheet filename, css
|
222
|
+
if options[:always_update] || stylesheet_needs_update?(css, file)
|
223
|
+
update_stylesheet file, css
|
226
224
|
else
|
227
|
-
run_not_updating_stylesheet
|
225
|
+
run_not_updating_stylesheet file, css
|
228
226
|
end
|
229
227
|
end
|
230
228
|
end
|
231
229
|
end
|
232
230
|
|
233
231
|
# Watches the template directory (or directories)
|
234
|
-
# and updates the CSS files whenever the related Sass files change.
|
232
|
+
# and updates the CSS files whenever the related Sass/SCSS files change.
|
235
233
|
# `watch` never returns.
|
236
234
|
#
|
237
|
-
# Whenever a change is detected to a Sass file in
|
235
|
+
# Whenever a change is detected to a Sass/SCSS file in
|
238
236
|
# {file:SASS_REFERENCE.md#template_location-option `:template_location`},
|
239
237
|
# the corresponding CSS file in {file:SASS_REFERENCE.md#css_location-option `:css_location`}
|
240
238
|
# will be recompiled.
|
241
|
-
# The CSS files of any Sass files that import the changed file will also be recompiled.
|
239
|
+
# The CSS files of any Sass/SCSS files that import the changed file will also be recompiled.
|
242
240
|
#
|
243
241
|
# Before the watching starts in earnest, `watch` calls \{#update\_stylesheets}.
|
244
242
|
#
|
@@ -252,7 +250,7 @@ module Sass
|
|
252
250
|
# A list of files to watch for updates
|
253
251
|
# **in addition to those specified by the
|
254
252
|
# {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
|
255
|
-
# The first string in each pair is the location of the Sass file,
|
253
|
+
# The first string in each pair is the location of the Sass/SCSS file,
|
256
254
|
# the second is the location of the CSS file that it should be compiled to.
|
257
255
|
def watch(individual_files = [])
|
258
256
|
update_stylesheets(individual_files)
|
@@ -274,7 +272,7 @@ module Sass
|
|
274
272
|
FSSM.monitor do |mon|
|
275
273
|
template_locations.zip(css_locations).each do |template_location, css_location|
|
276
274
|
mon.path template_location do |path|
|
277
|
-
path.glob '**/*.
|
275
|
+
path.glob '**/*.s[ac]ss'
|
278
276
|
|
279
277
|
path.update do |base, relative|
|
280
278
|
run_template_modified File.join(base, relative)
|
@@ -288,7 +286,7 @@ module Sass
|
|
288
286
|
|
289
287
|
path.delete do |base, relative|
|
290
288
|
run_template_deleted File.join(base, relative)
|
291
|
-
css = File.join(css_location, relative.gsub(/\.
|
289
|
+
css = File.join(css_location, relative.gsub(/\.s[ac]ss$/, '.css'))
|
292
290
|
try_delete_css css
|
293
291
|
update_stylesheets(individual_files)
|
294
292
|
end
|
@@ -368,26 +366,16 @@ module Sass
|
|
368
366
|
end
|
369
367
|
end
|
370
368
|
|
371
|
-
def template_filename(name, path)
|
372
|
-
"#{path}/#{name}.sass"
|
373
|
-
end
|
374
|
-
|
375
369
|
def css_filename(name, path)
|
376
|
-
"#{path}/#{name}.css
|
370
|
+
"#{path}/#{name}".gsub(/\.s[ac]ss$/, '.css')
|
377
371
|
end
|
378
372
|
|
379
373
|
def forbid_update?(name)
|
380
374
|
name.sub(/^.*\//, '')[0] == ?_
|
381
375
|
end
|
382
376
|
|
383
|
-
def stylesheet_needs_update?(
|
384
|
-
css_file
|
385
|
-
template_file = template_filename(name, template_path)
|
386
|
-
exact_stylesheet_needs_update?(css_file, template_file)
|
387
|
-
end
|
388
|
-
|
389
|
-
def exact_stylesheet_needs_update?(css_file, template_file)
|
390
|
-
return true unless File.exists?(css_file)
|
377
|
+
def stylesheet_needs_update?(css_file, template_file)
|
378
|
+
return true unless File.exists?(css_file) && File.exists?(template_file)
|
391
379
|
|
392
380
|
css_mtime = File.mtime(css_file)
|
393
381
|
File.mtime(template_file) > css_mtime ||
|
@@ -407,11 +395,12 @@ module Sass
|
|
407
395
|
end
|
408
396
|
|
409
397
|
def dependencies(filename)
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
398
|
+
Files.tree_for(filename, engine_options).select {|n| n.is_a?(Tree::ImportNode)}.map do |n|
|
399
|
+
next if n.full_filename =~ /\.css$/
|
400
|
+
n.full_filename
|
401
|
+
end.compact
|
402
|
+
rescue Sass::SyntaxError => e
|
403
|
+
[] # If the file has an error, we assume it has no dependencies
|
415
404
|
end
|
416
405
|
end
|
417
406
|
end
|
data/lib/sass/repl.rb
CHANGED
data/lib/sass/script.rb
CHANGED
@@ -12,17 +12,13 @@ module Sass
|
|
12
12
|
#
|
13
13
|
# This module contains code that handles the parsing and evaluation of SassScript.
|
14
14
|
module Script
|
15
|
-
# The character that begins a variable.
|
16
|
-
# @private
|
17
|
-
VARIABLE_CHAR = ?!
|
18
|
-
|
19
15
|
# The regular expression used to parse variables.
|
20
16
|
# @private
|
21
|
-
MATCH =
|
17
|
+
MATCH = /^[!\$](#{Sass::SCSS::RX::IDENT})\s*((?:\|\|)?=|:)\s*(.+?)(!(?i:default))?$/
|
22
18
|
|
23
19
|
# The regular expression used to validate variables without matching.
|
24
20
|
# @private
|
25
|
-
VALIDATE =
|
21
|
+
VALIDATE = /^[!\$]#{Sass::SCSS::RX::IDENT}$/
|
26
22
|
|
27
23
|
# Parses a string of SassScript
|
28
24
|
#
|
@@ -41,5 +37,28 @@ module Sass
|
|
41
37
|
e.modify_backtrace(:line => line, :filename => options[:filename])
|
42
38
|
raise e
|
43
39
|
end
|
40
|
+
|
41
|
+
# @private
|
42
|
+
def self.var_warning(varname, line, offset, filename)
|
43
|
+
Haml::Util.haml_warn <<MESSAGE
|
44
|
+
DEPRECATION WARNING:
|
45
|
+
On line #{line}, character #{offset}#{" of '#{filename}'" if filename}
|
46
|
+
Variables with ! have been deprecated and will be removed in version 3.2.
|
47
|
+
Use \"$#{varname}\" instead.
|
48
|
+
|
49
|
+
You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
|
50
|
+
MESSAGE
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.equals_warning(types, name, val, guarded, line, offset, filename)
|
54
|
+
Haml::Util.haml_warn <<MESSAGE
|
55
|
+
DEPRECATION WARNING:
|
56
|
+
On line #{line}#{", character #{offset}" if offset}#{" of '#{filename}'" if filename}
|
57
|
+
Setting #{types} with #{"||" if guarded}= has been deprecated and will be removed in version 3.2.
|
58
|
+
Use "#{name}: #{val}#{" !default" if guarded}" instead.
|
59
|
+
|
60
|
+
You can use `sass-convert --in-place --from sass2 file.sass' to convert files automatically.
|
61
|
+
MESSAGE
|
62
|
+
end
|
44
63
|
end
|
45
64
|
end
|
data/lib/sass/script/bool.rb
CHANGED
data/lib/sass/script/color.rb
CHANGED
@@ -184,7 +184,7 @@ module Sass::Script
|
|
184
184
|
# @deprecated This will be removed in version 3.2.
|
185
185
|
# @see #rgb
|
186
186
|
def value
|
187
|
-
|
187
|
+
Haml::Util.haml_warn <<END
|
188
188
|
DEPRECATION WARNING:
|
189
189
|
The Sass::Script::Color #value attribute is deprecated and will be
|
190
190
|
removed in version 3.2. Use the #rgb attribute instead.
|
@@ -381,7 +381,7 @@ END
|
|
381
381
|
return HTML4_COLORS_REVERSE[rgb] if HTML4_COLORS_REVERSE[rgb]
|
382
382
|
hex_str
|
383
383
|
end
|
384
|
-
alias_method :
|
384
|
+
alias_method :to_sass, :to_s
|
385
385
|
|
386
386
|
# Returns a string representation of the color.
|
387
387
|
#
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Sass
|
2
|
+
module Script
|
3
|
+
class CssLexer < Lexer
|
4
|
+
def token
|
5
|
+
important || super
|
6
|
+
end
|
7
|
+
|
8
|
+
def string(*args)
|
9
|
+
return unless scan(STRING)
|
10
|
+
str = (@scanner[1] || @scanner[2]).
|
11
|
+
gsub(/\\([^0-9a-f])/, '\1').
|
12
|
+
gsub(/\\([0-9a-f]{1,4})/, "\\\\\\1")
|
13
|
+
[:string, Script::String.new(str, :string)]
|
14
|
+
end
|
15
|
+
|
16
|
+
def important
|
17
|
+
return unless s = scan(IMPORTANT)
|
18
|
+
[:raw, s]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'sass/script'
|
2
|
+
require 'sass/script/css_lexer'
|
3
|
+
|
4
|
+
module Sass
|
5
|
+
module Script
|
6
|
+
class CssParser < Parser
|
7
|
+
private
|
8
|
+
|
9
|
+
# @private
|
10
|
+
def lexer_class; CssLexer; end
|
11
|
+
|
12
|
+
# We need a production that only does /,
|
13
|
+
# since * and % aren't allowed in plain CSS
|
14
|
+
production :div, :unary_plus, :div
|
15
|
+
|
16
|
+
def string
|
17
|
+
return number unless tok = try_tok(:string)
|
18
|
+
return tok.value unless @lexer.peek && @lexer.peek.type == :begin_interpolation
|
19
|
+
end
|
20
|
+
|
21
|
+
# Short-circuit all the SassScript-only productions
|
22
|
+
alias_method :interpolation, :concat
|
23
|
+
alias_method :or_expr, :div
|
24
|
+
alias_method :unary_div, :funcall
|
25
|
+
alias_method :paren, :string
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/sass/script/funcall.rb
CHANGED
@@ -22,6 +22,7 @@ module Sass
|
|
22
22
|
def initialize(name, args)
|
23
23
|
@name = name
|
24
24
|
@args = args
|
25
|
+
super()
|
25
26
|
end
|
26
27
|
|
27
28
|
# @return [String] A string representation of the function call
|
@@ -29,12 +30,27 @@ module Sass
|
|
29
30
|
"#{name}(#{args.map {|a| a.inspect}.join(', ')})"
|
30
31
|
end
|
31
32
|
|
33
|
+
# @see Node#to_sass
|
34
|
+
def to_sass
|
35
|
+
"#{name}(#{args.map {|a| a.to_sass}.join(', ')})"
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns the arguments to the function.
|
39
|
+
#
|
40
|
+
# @return [Array<Node>]
|
41
|
+
# @see Node#children
|
42
|
+
def children
|
43
|
+
@args
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
32
48
|
# Evaluates the function call.
|
33
49
|
#
|
34
50
|
# @param environment [Sass::Environment] The environment in which to evaluate the SassScript
|
35
51
|
# @return [Literal] The SassScript object that is the value of the function call
|
36
52
|
# @raise [Sass::SyntaxError] if the function call raises an ArgumentError
|
37
|
-
def
|
53
|
+
def _perform(environment)
|
38
54
|
args = self.args.map {|a| a.perform(environment)}
|
39
55
|
ruby_name = name.gsub('-', '_')
|
40
56
|
unless Haml::Util.has?(:public_instance_method, Functions, ruby_name) && ruby_name !~ /^__/
|
@@ -48,14 +64,6 @@ module Sass
|
|
48
64
|
raise e unless e.backtrace.any? {|t| t =~ /:in `(block in )?(#{name}|perform)'$/}
|
49
65
|
raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
|
50
66
|
end
|
51
|
-
|
52
|
-
# Returns the arguments to the function.
|
53
|
-
#
|
54
|
-
# @return [Array<Node>]
|
55
|
-
# @see Node#children
|
56
|
-
def children
|
57
|
-
@args
|
58
|
-
end
|
59
67
|
end
|
60
68
|
end
|
61
69
|
end
|