haml-edge 2.1.6 → 2.1.7
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.
- data/EDGE_GEM_VERSION +1 -1
- data/VERSION +1 -1
- data/lib/haml/exec.rb +20 -12
- data/lib/sass.rb +8 -0
- data/lib/sass/css.rb +6 -6
- data/lib/sass/engine.rb +35 -91
- data/lib/sass/environment.rb +4 -2
- data/lib/sass/error.rb +7 -0
- data/lib/sass/files.rb +100 -0
- data/lib/sass/plugin.rb +2 -3
- data/lib/sass/plugin/merb.rb +5 -4
- data/lib/sass/plugin/rails.rb +5 -4
- data/lib/sass/tree/attr_node.rb +12 -5
- data/lib/sass/tree/comment_node.rb +8 -10
- data/lib/sass/tree/debug_node.rb +2 -2
- data/lib/sass/tree/directive_node.rb +8 -8
- data/lib/sass/tree/file_node.rb +3 -3
- data/lib/sass/tree/for_node.rb +2 -2
- data/lib/sass/tree/if_node.rb +7 -2
- data/lib/sass/tree/mixin_def_node.rb +2 -2
- data/lib/sass/tree/mixin_node.rb +2 -2
- data/lib/sass/tree/node.rb +25 -9
- data/lib/sass/tree/rule_node.rb +10 -10
- data/lib/sass/tree/variable_node.rb +2 -2
- data/lib/sass/tree/while_node.rb +2 -2
- data/test/sass/engine_test.rb +21 -1
- data/test/sass/plugin_test.rb +1 -0
- data/test/test_helper.rb +6 -0
- metadata +3 -2
data/EDGE_GEM_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.7
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.7
|
data/lib/haml/exec.rb
CHANGED
@@ -189,6 +189,12 @@ END
|
|
189
189
|
opts.on('-I', '--load-path PATH', 'Add a sass import path.') do |path|
|
190
190
|
@options[:for_engine][:load_paths] << path
|
191
191
|
end
|
192
|
+
opts.on('--cache-location', 'The path to put cached Sass files. Defaults to .sass-cache.') do |loc|
|
193
|
+
@options[:for_engine][:cache_location] = path
|
194
|
+
end
|
195
|
+
opts.on('-C', '--no-cache', "Don't cache to sassc files.") do
|
196
|
+
@options[:for_engine][:cache] = false
|
197
|
+
end
|
192
198
|
end
|
193
199
|
|
194
200
|
def process_result
|
@@ -203,21 +209,23 @@ END
|
|
203
209
|
input = @options[:input]
|
204
210
|
output = @options[:output]
|
205
211
|
|
206
|
-
|
207
|
-
|
212
|
+
tree =
|
213
|
+
if input.is_a?(File) && !@options[:check_syntax]
|
214
|
+
::Sass::Files.tree_for(input.path, @options[:for_engine])
|
215
|
+
else
|
216
|
+
# We don't need to do any special handling of @options[:check_syntax] here,
|
217
|
+
# because the Sass syntax checking happens alongside evaluation
|
218
|
+
# and evaluation doesn't actually evaluate any code anyway.
|
219
|
+
::Sass::Engine.new(input.read(), @options[:for_engine]).to_tree
|
220
|
+
end
|
208
221
|
|
209
|
-
|
210
|
-
# We don't need to do any special handling of @options[:check_syntax] here,
|
211
|
-
# because the Sass syntax checking happens alongside evaluation
|
212
|
-
# and evaluation doesn't actually evaluate any code anyway.
|
213
|
-
result = ::Sass::Engine.new(template, @options[:for_engine]).render
|
214
|
-
rescue ::Sass::SyntaxError => e
|
215
|
-
raise e if @options[:trace]
|
216
|
-
raise "Syntax error on line #{get_line e}: #{e.message}"
|
217
|
-
end
|
222
|
+
input.close() if input.is_a?(File)
|
218
223
|
|
219
|
-
output.write(
|
224
|
+
output.write(tree.render)
|
220
225
|
output.close() if output.is_a? File
|
226
|
+
rescue ::Sass::SyntaxError => e
|
227
|
+
raise e if @options[:trace]
|
228
|
+
raise "Syntax error on line #{get_line e}: #{e.message}"
|
221
229
|
end
|
222
230
|
end
|
223
231
|
|
data/lib/sass.rb
CHANGED
@@ -991,6 +991,9 @@ require 'haml/version'
|
|
991
991
|
# or <tt>width = !main_width</tt>.
|
992
992
|
# By default, either syntax is valid.
|
993
993
|
#
|
994
|
+
# [<tt>:cache</tt>] Whether parsed Sass files should be cached,
|
995
|
+
# allowing greater speed. Defaults to true.
|
996
|
+
#
|
994
997
|
# [<tt>:never_update</tt>] Whether the CSS files should never be updated,
|
995
998
|
# even if the template file changes.
|
996
999
|
# Setting this to true may give small performance gains.
|
@@ -1035,6 +1038,11 @@ require 'haml/version'
|
|
1035
1038
|
# or <tt>MERB_ROOT + "/public/stylesheets"</tt>.
|
1036
1039
|
# Only has meaning within Ruby on Rails or Merb.
|
1037
1040
|
#
|
1041
|
+
# [<tt>:cache_location</tt>] The path where the cached <tt>sassc</tt> files should be written to.
|
1042
|
+
# Defaults to <tt>RAILS_ROOT + "/tmp/sass-cache"</tt>,
|
1043
|
+
# or <tt>MERB_ROOT + "/tmp/sass-cache"</tt>,
|
1044
|
+
# or just <tt>"./.sass-cache"</tt>.
|
1045
|
+
#
|
1038
1046
|
# [<tt>:filename</tt>] The filename of the file being rendered.
|
1039
1047
|
# This is used solely for reporting errors,
|
1040
1048
|
# and is automatically set when using Rails or Merb.
|
data/lib/sass/css.rb
CHANGED
@@ -75,7 +75,7 @@ module Sass
|
|
75
75
|
private
|
76
76
|
|
77
77
|
def build_tree
|
78
|
-
root = Tree::Node.new
|
78
|
+
root = Tree::Node.new
|
79
79
|
whitespace
|
80
80
|
rules root
|
81
81
|
expand_commas root
|
@@ -99,7 +99,7 @@ module Sass
|
|
99
99
|
directive = rule[0] == ?@
|
100
100
|
|
101
101
|
if directive
|
102
|
-
node = Tree::DirectiveNode.new(rule
|
102
|
+
node = Tree::DirectiveNode.new(rule)
|
103
103
|
return node if @template.scan(/;/)
|
104
104
|
|
105
105
|
assert_match /\{/
|
@@ -110,7 +110,7 @@ module Sass
|
|
110
110
|
end
|
111
111
|
|
112
112
|
assert_match /\{/
|
113
|
-
node = Tree::RuleNode.new(rule
|
113
|
+
node = Tree::RuleNode.new(rule)
|
114
114
|
attributes(node)
|
115
115
|
return node
|
116
116
|
end
|
@@ -128,7 +128,7 @@ module Sass
|
|
128
128
|
end
|
129
129
|
|
130
130
|
assert_match /(;|(?=\}))/
|
131
|
-
rule << Tree::AttrNode.new(name, value,
|
131
|
+
rule << Tree::AttrNode.new(name, value, nil)
|
132
132
|
end
|
133
133
|
|
134
134
|
assert_match /\}/
|
@@ -176,7 +176,7 @@ module Sass
|
|
176
176
|
root.children.map! do |child|
|
177
177
|
next child unless Tree::RuleNode === child && child.rules.first.include?(',')
|
178
178
|
child.rules.first.split(',').map do |rule|
|
179
|
-
node = Tree::RuleNode.new(rule.strip
|
179
|
+
node = Tree::RuleNode.new(rule.strip)
|
180
180
|
node.children = child.children
|
181
181
|
node
|
182
182
|
end
|
@@ -224,7 +224,7 @@ module Sass
|
|
224
224
|
first, rest = child.rules.first.scan(/^(&?(?: .|[^ ])[^.#: \[]*)([.#: \[].*)?$/).first
|
225
225
|
|
226
226
|
if current_rule.nil? || current_rule.rules.first != first
|
227
|
-
current_rule = Tree::RuleNode.new(first
|
227
|
+
current_rule = Tree::RuleNode.new(first)
|
228
228
|
root << current_rule
|
229
229
|
end
|
230
230
|
|
data/lib/sass/engine.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'strscan'
|
2
|
+
require 'digest/sha1'
|
2
3
|
require 'sass/tree/node'
|
3
4
|
require 'sass/tree/rule_node'
|
4
5
|
require 'sass/tree/comment_node'
|
@@ -15,6 +16,7 @@ require 'sass/tree/file_node'
|
|
15
16
|
require 'sass/environment'
|
16
17
|
require 'sass/script'
|
17
18
|
require 'sass/error'
|
19
|
+
require 'sass/files'
|
18
20
|
require 'haml/shared'
|
19
21
|
|
20
22
|
module Sass
|
@@ -76,6 +78,14 @@ module Sass
|
|
76
78
|
# attributes of the form <tt>name: attr</tt>.
|
77
79
|
ATTRIBUTE_ALTERNATE = /^([^\s=:"]+)(\s*=|:)(?:\s+|$)(.*)/
|
78
80
|
|
81
|
+
# The default options for Sass::Engine.
|
82
|
+
DEFAULT_OPTIONS = {
|
83
|
+
:style => :nested,
|
84
|
+
:load_paths => ['.'],
|
85
|
+
:cache => true,
|
86
|
+
:cache_location => './.sass-cache',
|
87
|
+
}.freeze
|
88
|
+
|
79
89
|
# Creates a new instace of Sass::Engine that will compile the given
|
80
90
|
# template string when <tt>render</tt> is called.
|
81
91
|
# See README.rdoc for available options.
|
@@ -89,36 +99,23 @@ module Sass
|
|
89
99
|
#++
|
90
100
|
#
|
91
101
|
def initialize(template, options={})
|
92
|
-
@options =
|
93
|
-
:style => :nested,
|
94
|
-
:load_paths => ['.']
|
95
|
-
}.merge! options
|
102
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
96
103
|
@template = template
|
97
|
-
@environment = Environment.new(nil, @options)
|
98
|
-
@environment.set_var("important", Script::String.new("!important"))
|
99
104
|
end
|
100
105
|
|
101
106
|
# Processes the template and returns the result as a string.
|
102
107
|
def render
|
103
|
-
|
104
|
-
render_to_tree.perform(@environment).to_s
|
105
|
-
rescue SyntaxError => err
|
106
|
-
err.sass_line = @line unless err.sass_line
|
107
|
-
unless err.sass_filename
|
108
|
-
err.add_backtrace_entry(@options[:filename])
|
109
|
-
end
|
110
|
-
raise err
|
111
|
-
end
|
108
|
+
to_tree.render
|
112
109
|
end
|
113
110
|
|
114
111
|
alias_method :to_css, :render
|
115
112
|
|
116
|
-
|
117
|
-
|
118
|
-
def render_to_tree
|
119
|
-
root = Tree::Node.new(@options)
|
113
|
+
def to_tree
|
114
|
+
root = Tree::Node.new
|
120
115
|
append_children(root, tree(tabulate(@template)).first, true)
|
116
|
+
root.options = @options
|
121
117
|
root
|
118
|
+
rescue SyntaxError => e; e.add_metadata(@options[:filename], @line)
|
122
119
|
end
|
123
120
|
|
124
121
|
private
|
@@ -246,7 +243,7 @@ END
|
|
246
243
|
else
|
247
244
|
# Support CSS3-style pseudo-elements,
|
248
245
|
# which begin with ::
|
249
|
-
Tree::RuleNode.new(line.text
|
246
|
+
Tree::RuleNode.new(line.text)
|
250
247
|
end
|
251
248
|
when Script::VARIABLE_CHAR
|
252
249
|
parse_variable(line)
|
@@ -255,12 +252,12 @@ END
|
|
255
252
|
when DIRECTIVE_CHAR
|
256
253
|
parse_directive(parent, line, root)
|
257
254
|
when ESCAPE_CHAR
|
258
|
-
Tree::RuleNode.new(line.text[1..-1]
|
255
|
+
Tree::RuleNode.new(line.text[1..-1])
|
259
256
|
when MIXIN_DEFINITION_CHAR
|
260
257
|
parse_mixin_definition(line)
|
261
258
|
when MIXIN_INCLUDE_CHAR
|
262
259
|
if line.text[1].nil?
|
263
|
-
Tree::RuleNode.new(line.text
|
260
|
+
Tree::RuleNode.new(line.text)
|
264
261
|
else
|
265
262
|
parse_mixin_include(line, root)
|
266
263
|
end
|
@@ -268,20 +265,12 @@ END
|
|
268
265
|
if line.text =~ ATTRIBUTE_ALTERNATE_MATCHER
|
269
266
|
parse_attribute(line, ATTRIBUTE_ALTERNATE)
|
270
267
|
else
|
271
|
-
Tree::RuleNode.new(line.text
|
268
|
+
Tree::RuleNode.new(line.text)
|
272
269
|
end
|
273
270
|
end
|
274
271
|
end
|
275
272
|
|
276
273
|
def parse_attribute(line, attribute_regx)
|
277
|
-
if @options[:attribute_syntax] == :normal &&
|
278
|
-
attribute_regx == ATTRIBUTE_ALTERNATE
|
279
|
-
raise SyntaxError.new("Illegal attribute syntax: can't use alternate syntax when :attribute_syntax => :normal is set.")
|
280
|
-
elsif @options[:attribute_syntax] == :alternate &&
|
281
|
-
attribute_regx == ATTRIBUTE
|
282
|
-
raise SyntaxError.new("Illegal attribute syntax: can't use normal syntax when :attribute_syntax => :alternate is set.")
|
283
|
-
end
|
284
|
-
|
285
274
|
name, eq, value = line.text.scan(attribute_regx)[0]
|
286
275
|
|
287
276
|
if name.nil? || value.nil?
|
@@ -292,7 +281,7 @@ END
|
|
292
281
|
else
|
293
282
|
value
|
294
283
|
end
|
295
|
-
Tree::AttrNode.new(name, expr,
|
284
|
+
Tree::AttrNode.new(name, expr, attribute_regx == ATTRIBUTE ? :old : :new)
|
296
285
|
end
|
297
286
|
|
298
287
|
def parse_variable(line)
|
@@ -300,14 +289,14 @@ END
|
|
300
289
|
raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath variable declarations.", @line + 1) unless line.children.empty?
|
301
290
|
raise SyntaxError.new("Invalid variable: \"#{line.text}\".", @line) unless name && value
|
302
291
|
|
303
|
-
Tree::VariableNode.new(name, parse_script(value, :offset => line.offset + line.text.index(value)), op == '||='
|
292
|
+
Tree::VariableNode.new(name, parse_script(value, :offset => line.offset + line.text.index(value)), op == '||=')
|
304
293
|
end
|
305
294
|
|
306
295
|
def parse_comment(line)
|
307
296
|
if line[1] == CSS_COMMENT_CHAR || line[1] == SASS_COMMENT_CHAR
|
308
|
-
Tree::CommentNode.new(line,
|
297
|
+
Tree::CommentNode.new(line, line[1] == SASS_COMMENT_CHAR)
|
309
298
|
else
|
310
|
-
Tree::RuleNode.new(line
|
299
|
+
Tree::RuleNode.new(line)
|
311
300
|
end
|
312
301
|
end
|
313
302
|
|
@@ -326,17 +315,17 @@ END
|
|
326
315
|
parse_else(parent, line, value)
|
327
316
|
elsif directive == "while"
|
328
317
|
raise SyntaxError.new("Invalid while directive '@while': expected expression.") unless value
|
329
|
-
Tree::WhileNode.new(parse_script(value, :offset => offset)
|
318
|
+
Tree::WhileNode.new(parse_script(value, :offset => offset))
|
330
319
|
elsif directive == "if"
|
331
320
|
raise SyntaxError.new("Invalid if directive '@if': expected expression.") unless value
|
332
|
-
Tree::IfNode.new(parse_script(value, :offset => offset)
|
321
|
+
Tree::IfNode.new(parse_script(value, :offset => offset))
|
333
322
|
elsif directive == "debug"
|
334
323
|
raise SyntaxError.new("Invalid debug directive '@debug': expected expression.") unless value
|
335
324
|
raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath debug directives.", @line + 1) unless line.children.empty?
|
336
325
|
offset = line.offset + line.text.index(value).to_i
|
337
|
-
Tree::DebugNode.new(parse_script(value, :offset => offset)
|
326
|
+
Tree::DebugNode.new(parse_script(value, :offset => offset))
|
338
327
|
else
|
339
|
-
Tree::DirectiveNode.new(line.text
|
328
|
+
Tree::DirectiveNode.new(line.text)
|
340
329
|
end
|
341
330
|
end
|
342
331
|
|
@@ -357,7 +346,7 @@ END
|
|
357
346
|
|
358
347
|
parsed_from = parse_script(from_expr, :offset => line.offset + line.text.index(from_expr))
|
359
348
|
parsed_to = parse_script(to_expr, :offset => line.offset + line.text.index(to_expr))
|
360
|
-
Tree::ForNode.new(var[1..-1], parsed_from, parsed_to, to_name == 'to'
|
349
|
+
Tree::ForNode.new(var[1..-1], parsed_from, parsed_to, to_name == 'to')
|
361
350
|
end
|
362
351
|
|
363
352
|
def parse_else(parent, line, text)
|
@@ -371,7 +360,7 @@ END
|
|
371
360
|
expr = parse_script($1, :offset => line.offset + line.text.index($1))
|
372
361
|
end
|
373
362
|
|
374
|
-
node = Tree::IfNode.new(expr
|
363
|
+
node = Tree::IfNode.new(expr)
|
375
364
|
append_children(node, line.children, false)
|
376
365
|
previous.add_else node
|
377
366
|
nil
|
@@ -406,7 +395,7 @@ END
|
|
406
395
|
default = parse_script(default, :offset => line.offset + line.text.index(default)) if default
|
407
396
|
[arg[1..-1], default]
|
408
397
|
end
|
409
|
-
Tree::MixinDefNode.new(name, args
|
398
|
+
Tree::MixinDefNode.new(name, args)
|
410
399
|
end
|
411
400
|
|
412
401
|
def parse_mixin_include(line, root)
|
@@ -416,7 +405,7 @@ END
|
|
416
405
|
raise SyntaxError.new("Invalid mixin include \"#{line.text}\".", @line) if name.nil? || args.nil?
|
417
406
|
args.each {|a| raise SyntaxError.new("Mixin arguments can't be empty.", @line) if a.empty?}
|
418
407
|
|
419
|
-
Tree::MixinNode.new(name, args.map {|s| parse_script(s, :offset => line.offset + line.text.index(s))}
|
408
|
+
Tree::MixinNode.new(name, args.map {|s| parse_script(s, :offset => line.offset + line.text.index(s))})
|
420
409
|
end
|
421
410
|
|
422
411
|
def parse_script(script, options = {})
|
@@ -436,60 +425,15 @@ END
|
|
436
425
|
engine = nil
|
437
426
|
|
438
427
|
begin
|
439
|
-
filename =
|
428
|
+
filename = Sass::Files.find_file_to_import(filename, import_paths)
|
440
429
|
rescue Exception => e
|
441
430
|
raise SyntaxError.new(e.message, @line)
|
442
431
|
end
|
443
432
|
|
444
|
-
next Tree::DirectiveNode.new("@import url(#{filename})"
|
433
|
+
next Tree::DirectiveNode.new("@import url(#{filename})") if filename =~ /\.css$/
|
445
434
|
|
446
|
-
|
447
|
-
new_options = @options.dup
|
448
|
-
new_options[:filename] = filename
|
449
|
-
engine = Sass::Engine.new(file.read, new_options)
|
450
|
-
end
|
451
|
-
|
452
|
-
begin
|
453
|
-
root = engine.render_to_tree
|
454
|
-
rescue Sass::SyntaxError => err
|
455
|
-
err.add_backtrace_entry(filename)
|
456
|
-
raise err
|
457
|
-
end
|
458
|
-
Tree::FileNode.new(filename, root.children, @options)
|
435
|
+
Tree::FileNode.new(filename)
|
459
436
|
end.flatten
|
460
437
|
end
|
461
|
-
|
462
|
-
def self.find_file_to_import(filename, load_paths)
|
463
|
-
was_sass = false
|
464
|
-
original_filename = filename
|
465
|
-
|
466
|
-
if filename[-5..-1] == ".sass"
|
467
|
-
filename = filename[0...-5]
|
468
|
-
was_sass = true
|
469
|
-
elsif filename[-4..-1] == ".css"
|
470
|
-
return filename
|
471
|
-
end
|
472
|
-
|
473
|
-
new_filename = find_full_path("#{filename}.sass", load_paths)
|
474
|
-
|
475
|
-
return new_filename if new_filename
|
476
|
-
return filename + '.css' unless was_sass
|
477
|
-
raise SyntaxError.new("File to import not found or unreadable: #{original_filename}.", @line)
|
478
|
-
end
|
479
|
-
|
480
|
-
def self.find_full_path(filename, load_paths)
|
481
|
-
segments = filename.split(File::SEPARATOR)
|
482
|
-
segments.push "_#{segments.pop}"
|
483
|
-
partial_name = segments.join(File::SEPARATOR)
|
484
|
-
load_paths.each do |path|
|
485
|
-
[partial_name, filename].each do |name|
|
486
|
-
full_path = File.join(path, name)
|
487
|
-
if File.readable?(full_path)
|
488
|
-
return full_path
|
489
|
-
end
|
490
|
-
end
|
491
|
-
end
|
492
|
-
nil
|
493
|
-
end
|
494
438
|
end
|
495
439
|
end
|
data/lib/sass/environment.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
module Sass
|
2
2
|
class Environment
|
3
3
|
attr_reader :parent
|
4
|
+
attr_writer :options
|
4
5
|
|
5
|
-
def initialize(parent = nil
|
6
|
+
def initialize(parent = nil)
|
6
7
|
@vars = {}
|
7
8
|
@mixins = {}
|
8
9
|
@parent = parent
|
9
|
-
|
10
|
+
|
11
|
+
set_var("important", Script::String.new("!important")) unless @parent
|
10
12
|
end
|
11
13
|
|
12
14
|
def options
|
data/lib/sass/error.rb
CHANGED
@@ -19,6 +19,13 @@ module Sass
|
|
19
19
|
@sass_line = lineno
|
20
20
|
end
|
21
21
|
|
22
|
+
# Add information about the filename and line on which the error was raised.
|
23
|
+
def add_metadata(filename, line)
|
24
|
+
self.sass_line ||= line
|
25
|
+
add_backtrace_entry(filename) unless sass_filename
|
26
|
+
raise self
|
27
|
+
end
|
28
|
+
|
22
29
|
# Adds a properly formatted entry to the exception's backtrace.
|
23
30
|
# +filename+ should be the file in which the error occurred,
|
24
31
|
# if applicable (defaults to "(sass)").
|
data/lib/sass/files.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
# This module contains various bits of functionality
|
5
|
+
# related to finding and caching Sass files.
|
6
|
+
module Files
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def tree_for(filename, options)
|
10
|
+
options = Sass::Engine::DEFAULT_OPTIONS.merge(options)
|
11
|
+
text = File.read(filename)
|
12
|
+
|
13
|
+
if options[:cache]
|
14
|
+
compiled_filename = sassc_filename(filename, options)
|
15
|
+
sha = Digest::SHA1.hexdigest(text)
|
16
|
+
|
17
|
+
if dump = try_to_read_sassc(filename, compiled_filename, sha)
|
18
|
+
return Marshal.load(dump)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
engine = Sass::Engine.new(text, options.merge(:filename => filename))
|
23
|
+
|
24
|
+
begin
|
25
|
+
root = engine.to_tree
|
26
|
+
rescue Sass::SyntaxError => err
|
27
|
+
err.add_backtrace_entry(filename)
|
28
|
+
raise err
|
29
|
+
end
|
30
|
+
|
31
|
+
try_to_write_sassc(root, compiled_filename, sha, options) if options[:cache]
|
32
|
+
|
33
|
+
root
|
34
|
+
end
|
35
|
+
|
36
|
+
def find_file_to_import(filename, load_paths)
|
37
|
+
was_sass = false
|
38
|
+
original_filename = filename
|
39
|
+
|
40
|
+
if filename[-5..-1] == ".sass"
|
41
|
+
filename = filename[0...-5]
|
42
|
+
was_sass = true
|
43
|
+
elsif filename[-4..-1] == ".css"
|
44
|
+
return filename
|
45
|
+
end
|
46
|
+
|
47
|
+
new_filename = find_full_path("#{filename}.sass", load_paths)
|
48
|
+
|
49
|
+
return new_filename if new_filename
|
50
|
+
return filename + '.css' unless was_sass
|
51
|
+
raise SyntaxError.new("File to import not found or unreadable: #{original_filename}.", @line)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def sassc_filename(filename, options)
|
57
|
+
File.join(options[:cache_location],
|
58
|
+
Digest::SHA1.hexdigest(File.dirname(File.expand_path(filename))),
|
59
|
+
File.basename(filename) + 'c')
|
60
|
+
end
|
61
|
+
|
62
|
+
def try_to_read_sassc(filename, compiled_filename, sha)
|
63
|
+
return unless File.readable?(compiled_filename)
|
64
|
+
|
65
|
+
File.open(compiled_filename) do |f|
|
66
|
+
return unless f.readline("\n").strip == Sass::VERSION
|
67
|
+
return unless f.readline("\n").strip == sha
|
68
|
+
return f.read
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def try_to_write_sassc(root, compiled_filename, sha, options)
|
73
|
+
return unless File.writable?(File.dirname(options[:cache_location]))
|
74
|
+
return if File.exists?(options[:cache_location]) && !File.writable?(options[:cache_location])
|
75
|
+
return if File.exists?(File.dirname(compiled_filename)) && !File.writable?(File.dirname(compiled_filename))
|
76
|
+
return if File.exists?(compiled_filename) && !File.writable?(compiled_filename)
|
77
|
+
FileUtils.mkdir_p(File.dirname(compiled_filename))
|
78
|
+
File.open(compiled_filename, "w") do |f|
|
79
|
+
f.puts(Sass::VERSION)
|
80
|
+
f.puts(sha)
|
81
|
+
f.write(Marshal.dump(root))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def find_full_path(filename, load_paths)
|
86
|
+
segments = filename.split(File::SEPARATOR)
|
87
|
+
segments.push "_#{segments.pop}"
|
88
|
+
partial_name = segments.join(File::SEPARATOR)
|
89
|
+
load_paths.each do |path|
|
90
|
+
[partial_name, filename].each do |name|
|
91
|
+
full_path = File.join(path, name)
|
92
|
+
if File.readable?(full_path)
|
93
|
+
return full_path
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/sass/plugin.rb
CHANGED
@@ -70,9 +70,8 @@ module Sass
|
|
70
70
|
File.delete(css) if File.exists?(css)
|
71
71
|
|
72
72
|
filename = template_filename(name, template_location)
|
73
|
-
engine = Engine.new(File.read(filename), engine_options(:css_filename => css, :filename => filename))
|
74
73
|
result = begin
|
75
|
-
|
74
|
+
Sass::Files.tree_for(filename, engine_options(:css_filename => css, :filename => filename)).render
|
76
75
|
rescue Exception => e
|
77
76
|
exception_string(e)
|
78
77
|
end
|
@@ -193,7 +192,7 @@ END
|
|
193
192
|
def dependencies(filename)
|
194
193
|
File.readlines(filename).grep(/^@import /).map do |line|
|
195
194
|
line[8..-1].split(',').map do |inc|
|
196
|
-
Sass::
|
195
|
+
Sass::Files.find_file_to_import(inc.strip, [File.dirname(filename)] + load_paths)
|
197
196
|
end
|
198
197
|
end.flatten.grep(/\.sass$/)
|
199
198
|
end
|
data/lib/sass/plugin/merb.rb
CHANGED
@@ -10,10 +10,11 @@ unless defined?(Sass::MERB_LOADED)
|
|
10
10
|
env = Merb.environment
|
11
11
|
end
|
12
12
|
|
13
|
-
Sass::Plugin.options.merge!(:template_location
|
14
|
-
:css_location
|
15
|
-
:
|
16
|
-
:
|
13
|
+
Sass::Plugin.options.merge!(:template_location => root + '/public/stylesheets/sass',
|
14
|
+
:css_location => root + '/public/stylesheets',
|
15
|
+
:cache_location => root + '/tmp/sass-cache',
|
16
|
+
:always_check => env != "production",
|
17
|
+
:full_exception => env != "production")
|
17
18
|
config = Merb::Plugins.config[:sass] || Merb::Plugins.config["sass"] || {}
|
18
19
|
|
19
20
|
if defined? config.symbolize_keys!
|
data/lib/sass/plugin/rails.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
unless defined?(Sass::RAILS_LOADED)
|
2
2
|
Sass::RAILS_LOADED = true
|
3
3
|
|
4
|
-
Sass::Plugin.options.merge!(:template_location
|
5
|
-
:css_location
|
6
|
-
:
|
7
|
-
:
|
4
|
+
Sass::Plugin.options.merge!(:template_location => RAILS_ROOT + '/public/stylesheets/sass',
|
5
|
+
:css_location => RAILS_ROOT + '/public/stylesheets',
|
6
|
+
:cache_location => RAILS_ROOT + '/tmp/sass-cache',
|
7
|
+
:always_check => RAILS_ENV != "production",
|
8
|
+
:full_exception => RAILS_ENV != "production")
|
8
9
|
|
9
10
|
# :stopdoc:
|
10
11
|
module ActionController
|
data/lib/sass/tree/attr_node.rb
CHANGED
@@ -2,10 +2,11 @@ module Sass::Tree
|
|
2
2
|
class AttrNode < Node
|
3
3
|
attr_accessor :name, :value
|
4
4
|
|
5
|
-
def initialize(name, value,
|
5
|
+
def initialize(name, value, attr_syntax)
|
6
6
|
@name = name
|
7
7
|
@value = value
|
8
|
-
|
8
|
+
@attr_syntax = attr_syntax
|
9
|
+
super()
|
9
10
|
end
|
10
11
|
|
11
12
|
def ==(other)
|
@@ -13,6 +14,12 @@ module Sass::Tree
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def to_s(tabs, parent_name = nil)
|
17
|
+
if @options[:attribute_syntax] == :normal && @attr_syntax == :new
|
18
|
+
raise Sass::SyntaxError.new("Illegal attribute syntax: can't use alternate syntax when :attribute_syntax => :normal is set.")
|
19
|
+
elsif @options[:attribute_syntax] == :alternate && @attr_syntax == :old
|
20
|
+
raise Sass::SyntaxError.new("Illegal attribute syntax: can't use normal syntax when :attribute_syntax => :alternate is set.")
|
21
|
+
end
|
22
|
+
|
16
23
|
if value[-1] == ?;
|
17
24
|
raise Sass::SyntaxError.new("Invalid attribute: #{declaration.dump} (This isn't CSS!).", @line)
|
18
25
|
end
|
@@ -23,7 +30,7 @@ module Sass::Tree
|
|
23
30
|
raise Sass::SyntaxError.new("Invalid attribute: #{declaration.dump}.", @line)
|
24
31
|
end
|
25
32
|
|
26
|
-
join_string = case
|
33
|
+
join_string = case style
|
27
34
|
when :compact; ' '
|
28
35
|
when :compressed; ''
|
29
36
|
else "\n"
|
@@ -31,7 +38,7 @@ module Sass::Tree
|
|
31
38
|
spaces = ' ' * (tabs - 1)
|
32
39
|
to_return = ''
|
33
40
|
if !value.empty?
|
34
|
-
to_return << "#{spaces}#{real_name}:#{
|
41
|
+
to_return << "#{spaces}#{real_name}:#{style == :compressed ? '' : ' '}#{value};#{join_string}"
|
35
42
|
end
|
36
43
|
|
37
44
|
children.each do |kid|
|
@@ -39,7 +46,7 @@ module Sass::Tree
|
|
39
46
|
to_return << kid.to_s(tabs, real_name) << join_string
|
40
47
|
end
|
41
48
|
|
42
|
-
(
|
49
|
+
(style == :compressed && parent_name) ? to_return : to_return[0...-1]
|
43
50
|
end
|
44
51
|
|
45
52
|
protected
|
@@ -4,19 +4,17 @@ module Sass::Tree
|
|
4
4
|
class CommentNode < Node
|
5
5
|
attr_accessor :lines
|
6
6
|
attr_accessor :value
|
7
|
+
attr_accessor :silent
|
7
8
|
|
8
|
-
def initialize(value,
|
9
|
+
def initialize(value, silent)
|
9
10
|
@lines = []
|
10
11
|
@value = value[2..-1].strip
|
11
|
-
|
12
|
+
@silent = silent
|
13
|
+
super()
|
12
14
|
end
|
13
15
|
|
14
16
|
def ==(other)
|
15
|
-
self.class == other.class && value == other.value && lines == other.lines
|
16
|
-
end
|
17
|
-
|
18
|
-
def silent?
|
19
|
-
!!@options[:silent]
|
17
|
+
self.class == other.class && value == other.value && silent == other.silent && lines == other.lines
|
20
18
|
end
|
21
19
|
|
22
20
|
def to_s(tabs = 0, parent_name = nil)
|
@@ -24,17 +22,17 @@ module Sass::Tree
|
|
24
22
|
|
25
23
|
spaces = ' ' * (tabs - 1)
|
26
24
|
spaces + "/* " + ([value] + lines.map {|l| l.text}).
|
27
|
-
map{|l| l.sub(%r{ ?\*/ *$},'')}.join(
|
25
|
+
map{|l| l.sub(%r{ ?\*/ *$},'')}.join(style == :compact ? ' ' : "\n#{spaces} * ") + " */"
|
28
26
|
end
|
29
27
|
|
30
28
|
def invisible?
|
31
|
-
|
29
|
+
style == :compressed || @silent
|
32
30
|
end
|
33
31
|
|
34
32
|
protected
|
35
33
|
|
36
34
|
def _perform(environment)
|
37
|
-
return [] if silent
|
35
|
+
return [] if @silent
|
38
36
|
self
|
39
37
|
end
|
40
38
|
end
|
data/lib/sass/tree/debug_node.rb
CHANGED
@@ -2,25 +2,25 @@ module Sass::Tree
|
|
2
2
|
class DirectiveNode < Node
|
3
3
|
attr_accessor :value
|
4
4
|
|
5
|
-
def initialize(value
|
5
|
+
def initialize(value)
|
6
6
|
@value = value
|
7
|
-
super(
|
7
|
+
super()
|
8
8
|
end
|
9
9
|
|
10
10
|
def to_s(tabs)
|
11
11
|
if children.empty?
|
12
12
|
value + ";"
|
13
13
|
else
|
14
|
-
result = if
|
14
|
+
result = if style == :compressed
|
15
15
|
"#{value}{"
|
16
16
|
else
|
17
|
-
"#{' ' * (tabs - 1)}#{value} {" + (
|
17
|
+
"#{' ' * (tabs - 1)}#{value} {" + (style == :compact ? ' ' : "\n")
|
18
18
|
end
|
19
19
|
was_attr = false
|
20
20
|
first = true
|
21
21
|
children.each do |child|
|
22
22
|
next if child.invisible?
|
23
|
-
if
|
23
|
+
if style == :compact
|
24
24
|
if child.is_a?(AttrNode)
|
25
25
|
result << "#{child.to_s(first || was_attr ? 1 : tabs + 1)} "
|
26
26
|
else
|
@@ -33,17 +33,17 @@ module Sass::Tree
|
|
33
33
|
end
|
34
34
|
was_attr = child.is_a?(AttrNode)
|
35
35
|
first = false
|
36
|
-
elsif
|
36
|
+
elsif style == :compressed
|
37
37
|
result << (was_attr ? ";#{child.to_s(1)}" : child.to_s(1))
|
38
38
|
was_attr = child.is_a?(AttrNode)
|
39
39
|
else
|
40
40
|
result << child.to_s(tabs + 1) + "\n"
|
41
41
|
end
|
42
42
|
end
|
43
|
-
result.rstrip + if
|
43
|
+
result.rstrip + if style == :compressed
|
44
44
|
"}"
|
45
45
|
else
|
46
|
-
(
|
46
|
+
(style == :expanded ? "\n" : " ") + "}\n"
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
data/lib/sass/tree/file_node.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
module Sass
|
2
2
|
module Tree
|
3
3
|
class FileNode < Node
|
4
|
-
def initialize(filename
|
4
|
+
def initialize(filename)
|
5
5
|
@filename = filename
|
6
|
-
super(
|
7
|
-
self.children = children
|
6
|
+
super()
|
8
7
|
end
|
9
8
|
|
10
9
|
def to_s(*args)
|
@@ -17,6 +16,7 @@ module Sass
|
|
17
16
|
protected
|
18
17
|
|
19
18
|
def perform!(environment)
|
19
|
+
self.children = Sass::Files.tree_for(filename, @options).children
|
20
20
|
self.children = perform_children(environment)
|
21
21
|
rescue Sass::SyntaxError => e
|
22
22
|
e.add_backtrace_entry(@filename)
|
data/lib/sass/tree/for_node.rb
CHANGED
@@ -2,12 +2,12 @@ require 'sass/tree/node'
|
|
2
2
|
|
3
3
|
module Sass::Tree
|
4
4
|
class ForNode < Node
|
5
|
-
def initialize(var, from, to, exclusive
|
5
|
+
def initialize(var, from, to, exclusive)
|
6
6
|
@var = var
|
7
7
|
@from = from
|
8
8
|
@to = to
|
9
9
|
@exclusive = exclusive
|
10
|
-
super(
|
10
|
+
super()
|
11
11
|
end
|
12
12
|
|
13
13
|
protected
|
data/lib/sass/tree/if_node.rb
CHANGED
@@ -4,10 +4,10 @@ module Sass::Tree
|
|
4
4
|
class IfNode < Node
|
5
5
|
attr_accessor :else
|
6
6
|
|
7
|
-
def initialize(expr
|
7
|
+
def initialize(expr)
|
8
8
|
@expr = expr
|
9
9
|
@last_else = self
|
10
|
-
super(
|
10
|
+
super()
|
11
11
|
end
|
12
12
|
|
13
13
|
def add_else(node)
|
@@ -15,6 +15,11 @@ module Sass::Tree
|
|
15
15
|
@last_else = node
|
16
16
|
end
|
17
17
|
|
18
|
+
def options=(options)
|
19
|
+
super
|
20
|
+
self.else.options = options if self.else
|
21
|
+
end
|
22
|
+
|
18
23
|
protected
|
19
24
|
|
20
25
|
def _perform(environment)
|
data/lib/sass/tree/mixin_node.rb
CHANGED
data/lib/sass/tree/node.rb
CHANGED
@@ -3,14 +3,22 @@ module Sass
|
|
3
3
|
class Node
|
4
4
|
attr_accessor :children
|
5
5
|
attr_accessor :line
|
6
|
-
|
6
|
+
attr_writer :filename
|
7
|
+
attr_reader :options
|
7
8
|
|
8
|
-
def initialize
|
9
|
-
@options = options
|
10
|
-
@style = options[:style]
|
9
|
+
def initialize
|
11
10
|
@children = []
|
12
11
|
end
|
13
12
|
|
13
|
+
def options=(options)
|
14
|
+
children.each {|c| c.options = options}
|
15
|
+
@options = options
|
16
|
+
end
|
17
|
+
|
18
|
+
def filename
|
19
|
+
@filename || @options[:filename]
|
20
|
+
end
|
21
|
+
|
14
22
|
def <<(child)
|
15
23
|
if msg = invalid_child?(child)
|
16
24
|
raise Sass::SyntaxError.new(msg, child.line)
|
@@ -27,6 +35,10 @@ module Sass
|
|
27
35
|
self.class == other.class && other.children == children
|
28
36
|
end
|
29
37
|
|
38
|
+
def render
|
39
|
+
perform(Environment.new).to_s
|
40
|
+
end
|
41
|
+
|
30
42
|
def invisible?; false; end
|
31
43
|
|
32
44
|
def to_s
|
@@ -37,17 +49,21 @@ module Sass
|
|
37
49
|
else
|
38
50
|
next if child.invisible?
|
39
51
|
child_str = child.to_s(1)
|
40
|
-
result << child_str + (
|
52
|
+
result << child_str + (style == :compressed ? '' : "\n")
|
41
53
|
end
|
42
54
|
end
|
43
|
-
|
55
|
+
style == :compressed ? result+"\n" : result[0...-1]
|
56
|
+
rescue Sass::SyntaxError => e; e.add_metadata(filename, line)
|
44
57
|
end
|
45
58
|
|
46
59
|
def perform(environment)
|
60
|
+
environment.options = @options if self.class == Tree::Node
|
47
61
|
_perform(environment)
|
48
|
-
rescue Sass::SyntaxError => e
|
49
|
-
|
50
|
-
|
62
|
+
rescue Sass::SyntaxError => e; e.add_metadata(filename, line)
|
63
|
+
end
|
64
|
+
|
65
|
+
def style
|
66
|
+
@options[:style]
|
51
67
|
end
|
52
68
|
|
53
69
|
protected
|
data/lib/sass/tree/rule_node.rb
CHANGED
@@ -7,9 +7,9 @@ module Sass::Tree
|
|
7
7
|
|
8
8
|
attr_accessor :rules, :parsed_rules
|
9
9
|
|
10
|
-
def initialize(rule
|
10
|
+
def initialize(rule)
|
11
11
|
@rules = [rule]
|
12
|
-
super(
|
12
|
+
super()
|
13
13
|
end
|
14
14
|
|
15
15
|
def ==(other)
|
@@ -30,10 +30,10 @@ module Sass::Tree
|
|
30
30
|
attributes = []
|
31
31
|
sub_rules = []
|
32
32
|
|
33
|
-
rule_separator =
|
34
|
-
line_separator = [:nested, :expanded].include?(
|
33
|
+
rule_separator = style == :compressed ? ',' : ', '
|
34
|
+
line_separator = [:nested, :expanded].include?(style) ? ",\n" : rule_separator
|
35
35
|
rule_indent = ' ' * (tabs - 1)
|
36
|
-
per_rule_indent, total_indent = [:nested, :expanded].include?(
|
36
|
+
per_rule_indent, total_indent = [:nested, :expanded].include?(style) ? [rule_indent, ''] : ['', rule_indent]
|
37
37
|
|
38
38
|
total_rule = total_indent + resolved_rules.map do |line|
|
39
39
|
per_rule_indent + line.join(rule_separator)
|
@@ -52,7 +52,7 @@ module Sass::Tree
|
|
52
52
|
if !attributes.empty?
|
53
53
|
old_spaces = ' ' * (tabs - 1)
|
54
54
|
spaces = ' ' * tabs
|
55
|
-
if @options[:line_comments] &&
|
55
|
+
if @options[:line_comments] && style != :compressed
|
56
56
|
to_return << "#{old_spaces}/* line #{line}"
|
57
57
|
|
58
58
|
if filename
|
@@ -71,20 +71,20 @@ module Sass::Tree
|
|
71
71
|
to_return << " */\n"
|
72
72
|
end
|
73
73
|
|
74
|
-
if
|
74
|
+
if style == :compact
|
75
75
|
attributes = attributes.map { |a| a.to_s(1) }.select{|a| a && a.length > 0}.join(' ')
|
76
76
|
to_return << "#{total_rule} { #{attributes} }\n"
|
77
|
-
elsif
|
77
|
+
elsif style == :compressed
|
78
78
|
attributes = attributes.map { |a| a.to_s(1) }.select{|a| a && a.length > 0}.join(';')
|
79
79
|
to_return << "#{total_rule}{#{attributes}}"
|
80
80
|
else
|
81
81
|
attributes = attributes.map { |a| a.to_s(tabs + 1) }.select{|a| a && a.length > 0}.join("\n")
|
82
|
-
end_attrs = (
|
82
|
+
end_attrs = (style == :expanded ? "\n" + old_spaces : ' ')
|
83
83
|
to_return << "#{total_rule} {\n#{attributes}#{end_attrs}}\n"
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
tabs += 1 unless attributes.empty? ||
|
87
|
+
tabs += 1 unless attributes.empty? || style != :nested
|
88
88
|
sub_rules.each do |sub|
|
89
89
|
to_return << sub.to_s(tabs, resolved_rules)
|
90
90
|
end
|
data/lib/sass/tree/while_node.rb
CHANGED
data/test/sass/engine_test.rb
CHANGED
@@ -85,7 +85,11 @@ class SassEngineTest < Test::Unit::TestCase
|
|
85
85
|
"& foo\n bar: baz\n blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
|
86
86
|
"a\n b: c\n& foo\n bar: baz\n blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 3],
|
87
87
|
}
|
88
|
-
|
88
|
+
|
89
|
+
def teardown
|
90
|
+
clean_up_sassc
|
91
|
+
end
|
92
|
+
|
89
93
|
def test_basic_render
|
90
94
|
renders_correctly "basic", { :style => :compact }
|
91
95
|
end
|
@@ -185,7 +189,18 @@ SASS
|
|
185
189
|
end
|
186
190
|
|
187
191
|
def test_sass_import
|
192
|
+
assert !File.exists?(sassc_path("importee"))
|
188
193
|
renders_correctly "import", { :style => :compact, :load_paths => [File.dirname(__FILE__) + "/templates"] }
|
194
|
+
assert File.exists?(sassc_path("importee"))
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_no_cache
|
198
|
+
assert !File.exists?(sassc_path("importee"))
|
199
|
+
renders_correctly("import", {
|
200
|
+
:style => :compact, :cache => false,
|
201
|
+
:load_paths => [File.dirname(__FILE__) + "/templates"],
|
202
|
+
})
|
203
|
+
assert !File.exists?(sassc_path("importee"))
|
189
204
|
end
|
190
205
|
|
191
206
|
def test_units
|
@@ -750,4 +765,9 @@ SOURCE
|
|
750
765
|
def filename(name, type)
|
751
766
|
File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}"
|
752
767
|
end
|
768
|
+
|
769
|
+
def sassc_path(template)
|
770
|
+
sassc_path = File.join(File.dirname(__FILE__) + "/templates/#{template}.sass")
|
771
|
+
Sass::Files.send(:sassc_filename, sassc_path, Sass::Engine::DEFAULT_OPTIONS)
|
772
|
+
end
|
753
773
|
end
|
data/test/sass/plugin_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -2,6 +2,7 @@ lib_dir = File.dirname(__FILE__) + '/../lib'
|
|
2
2
|
require File.dirname(__FILE__) + '/linked_rails'
|
3
3
|
|
4
4
|
require 'test/unit'
|
5
|
+
require 'fileutils'
|
5
6
|
$:.unshift lib_dir unless $:.include?(lib_dir)
|
6
7
|
require 'haml'
|
7
8
|
require 'sass'
|
@@ -18,4 +19,9 @@ class Test::Unit::TestCase
|
|
18
19
|
test_name = caller[1].gsub(/^.*`(?:\w+ )*(\w+)'.*$/, '\1')
|
19
20
|
opts[:filename] = "#{test_name}_inline.sass"
|
20
21
|
end
|
22
|
+
|
23
|
+
def clean_up_sassc
|
24
|
+
path = File.dirname(__FILE__) + "/../.sass-cache"
|
25
|
+
FileUtils.rm_r(path) if File.exist?(path)
|
26
|
+
end
|
21
27
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haml-edge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Weizenbaum
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-05-
|
13
|
+
date: 2009-05-11 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/sass/tree/rule_node.rb
|
92
92
|
- lib/sass/tree/variable_node.rb
|
93
93
|
- lib/sass/tree/while_node.rb
|
94
|
+
- lib/sass/files.rb
|
94
95
|
- bin/css2sass
|
95
96
|
- bin/haml
|
96
97
|
- bin/html2haml
|