haml 3.1.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of haml might be problematic. Click here for more details.

Files changed (87) hide show
  1. data/VERSION +1 -1
  2. data/vendor/sass/Rakefile +22 -46
  3. data/vendor/sass/VERSION +1 -1
  4. data/vendor/sass/VERSION_NAME +1 -1
  5. data/vendor/sass/bin/scss +8 -0
  6. data/vendor/sass/doc-src/SASS_CHANGELOG.md +125 -9
  7. data/vendor/sass/doc-src/SASS_REFERENCE.md +84 -8
  8. data/vendor/sass/lib/sass.rb +0 -3
  9. data/vendor/sass/lib/sass/cache_stores.rb +1 -0
  10. data/vendor/sass/lib/sass/cache_stores/base.rb +2 -2
  11. data/vendor/sass/lib/sass/cache_stores/chain.rb +33 -0
  12. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +6 -4
  13. data/vendor/sass/lib/sass/cache_stores/memory.rb +8 -12
  14. data/vendor/sass/lib/sass/engine.rb +65 -56
  15. data/vendor/sass/lib/sass/environment.rb +5 -2
  16. data/vendor/sass/lib/sass/exec.rb +52 -21
  17. data/vendor/sass/lib/sass/importers/filesystem.rb +32 -9
  18. data/vendor/sass/lib/sass/less.rb +1 -1
  19. data/vendor/sass/lib/sass/plugin.rb +11 -1
  20. data/vendor/sass/lib/sass/plugin/compiler.rb +21 -12
  21. data/vendor/sass/lib/sass/plugin/rails.rb +8 -82
  22. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +10 -10
  23. data/vendor/sass/lib/sass/railtie.rb +3 -2
  24. data/vendor/sass/lib/sass/script.rb +2 -25
  25. data/vendor/sass/lib/sass/script/color.rb +4 -15
  26. data/vendor/sass/lib/sass/script/funcall.rb +63 -19
  27. data/vendor/sass/lib/sass/script/functions.rb +257 -19
  28. data/vendor/sass/lib/sass/script/lexer.rb +1 -4
  29. data/vendor/sass/lib/sass/script/list.rb +2 -2
  30. data/vendor/sass/lib/sass/script/node.rb +0 -27
  31. data/vendor/sass/lib/sass/script/number.rb +1 -1
  32. data/vendor/sass/lib/sass/script/operation.rb +0 -5
  33. data/vendor/sass/lib/sass/script/parser.rb +30 -12
  34. data/vendor/sass/lib/sass/script/string.rb +2 -17
  35. data/vendor/sass/lib/sass/script/string_interpolation.rb +1 -0
  36. data/vendor/sass/lib/sass/scss/parser.rb +58 -18
  37. data/vendor/sass/lib/sass/scss/rx.rb +2 -1
  38. data/vendor/sass/lib/sass/scss/script_lexer.rb +1 -1
  39. data/vendor/sass/lib/sass/selector/comma_sequence.rb +2 -3
  40. data/vendor/sass/lib/sass/selector/sequence.rb +3 -6
  41. data/vendor/sass/lib/sass/selector/simple_sequence.rb +2 -3
  42. data/vendor/sass/lib/sass/tree/charset_node.rb +0 -15
  43. data/vendor/sass/lib/sass/tree/comment_node.rb +20 -71
  44. data/vendor/sass/lib/sass/tree/debug_node.rb +4 -22
  45. data/vendor/sass/lib/sass/tree/directive_node.rb +0 -52
  46. data/vendor/sass/lib/sass/tree/each_node.rb +8 -38
  47. data/vendor/sass/lib/sass/tree/extend_node.rb +12 -48
  48. data/vendor/sass/lib/sass/tree/for_node.rb +20 -51
  49. data/vendor/sass/lib/sass/tree/function_node.rb +27 -0
  50. data/vendor/sass/lib/sass/tree/if_node.rb +22 -57
  51. data/vendor/sass/lib/sass/tree/import_node.rb +0 -56
  52. data/vendor/sass/lib/sass/tree/media_node.rb +0 -43
  53. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +12 -45
  54. data/vendor/sass/lib/sass/tree/mixin_node.rb +13 -124
  55. data/vendor/sass/lib/sass/tree/node.rb +18 -304
  56. data/vendor/sass/lib/sass/tree/prop_node.rb +24 -92
  57. data/vendor/sass/lib/sass/tree/return_node.rb +18 -0
  58. data/vendor/sass/lib/sass/tree/root_node.rb +4 -133
  59. data/vendor/sass/lib/sass/tree/rule_node.rb +21 -164
  60. data/vendor/sass/lib/sass/tree/variable_node.rb +14 -23
  61. data/vendor/sass/lib/sass/tree/visitors/base.rb +75 -0
  62. data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +134 -0
  63. data/vendor/sass/lib/sass/tree/visitors/convert.rb +255 -0
  64. data/vendor/sass/lib/sass/tree/visitors/cssize.rb +175 -0
  65. data/vendor/sass/lib/sass/tree/visitors/perform.rb +301 -0
  66. data/vendor/sass/lib/sass/tree/visitors/to_css.rb +216 -0
  67. data/vendor/sass/lib/sass/tree/warn_node.rb +4 -28
  68. data/vendor/sass/lib/sass/tree/while_node.rb +5 -35
  69. data/vendor/sass/lib/sass/util.rb +0 -50
  70. data/vendor/sass/sass.gemspec +1 -1
  71. data/vendor/sass/test/sass/conversion_test.rb +53 -102
  72. data/vendor/sass/test/sass/engine_test.rb +416 -540
  73. data/vendor/sass/test/sass/functions_test.rb +306 -4
  74. data/vendor/sass/test/sass/importer_test.rb +0 -22
  75. data/vendor/sass/test/sass/plugin_test.rb +51 -21
  76. data/vendor/sass/test/sass/results/if.css +3 -0
  77. data/vendor/sass/test/sass/script_conversion_test.rb +0 -38
  78. data/vendor/sass/test/sass/script_test.rb +19 -4
  79. data/vendor/sass/test/sass/scss/scss_test.rb +32 -11
  80. data/vendor/sass/test/sass/templates/if.sass +11 -0
  81. data/vendor/sass/test/sass/templates/nested_import.sass +2 -0
  82. data/vendor/sass/test/sass/util_test.rb +0 -21
  83. data/vendor/sass/test/test_helper.rb +0 -3
  84. metadata +268 -258
  85. data/vendor/sass/bin/css2sass +0 -13
  86. data/vendor/sass/lib/sass/cache_stores/active_support.rb +0 -28
  87. data/vendor/sass/lib/sass/importers/rails.rb +0 -75
@@ -0,0 +1,216 @@
1
+ # A visitor for converting a Sass tree into CSS.
2
+ class Sass::Tree::Visitors::ToCss < Sass::Tree::Visitors::Base
3
+ protected
4
+
5
+ def initialize
6
+ @tabs = 0
7
+ end
8
+
9
+ def visit(node)
10
+ super
11
+ rescue Sass::SyntaxError => e
12
+ e.modify_backtrace(:filename => node.filename, :line => node.line)
13
+ raise e
14
+ end
15
+
16
+ def with_tabs(tabs)
17
+ old_tabs, @tabs = @tabs, tabs
18
+ yield
19
+ ensure
20
+ @tabs = old_tabs
21
+ end
22
+
23
+ def visit_root(node)
24
+ result = String.new
25
+ node.children.each do |child|
26
+ next if child.invisible?
27
+ child_str = visit(child)
28
+ result << child_str + (node.style == :compressed ? '' : "\n")
29
+ end
30
+ result.rstrip!
31
+ return "" if result.empty?
32
+ result << "\n"
33
+ unless Sass::Util.ruby1_8? || result.ascii_only?
34
+ if node.children.first.is_a?(Sass::Tree::CharsetNode)
35
+ begin
36
+ encoding = node.children.first.name
37
+ # Default to big-endian encoding, because we have to decide somehow
38
+ encoding << 'BE' if encoding =~ /\Autf-(16|32)\Z/i
39
+ result = result.encode(Encoding.find(encoding))
40
+ rescue EncodingError
41
+ end
42
+ end
43
+
44
+ result = "@charset \"#{result.encoding.name}\";#{
45
+ node.style == :compressed ? '' : "\n"
46
+ }".encode(result.encoding) + result
47
+ end
48
+ result
49
+ rescue Sass::SyntaxError => e
50
+ e.sass_template ||= node.template
51
+ raise e
52
+ end
53
+
54
+ def visit_charset(node)
55
+ "@charset \"#{node.name}\";"
56
+ end
57
+
58
+ def visit_comment(node)
59
+ return if node.invisible?
60
+ spaces = (' ' * [@tabs - node.value[/^ */].size, 0].max)
61
+
62
+ content = node.value.gsub(/^/, spaces).gsub(%r{^(\s*)//(.*)$}) do |md|
63
+ "#{$1}/*#{$2} */"
64
+ end
65
+ if content =~ /[^\\]\#\{.*\}/
66
+ Sass::Util.sass_warn <<MESSAGE
67
+ WARNING:
68
+ On line #{node.line}#{" of '#{node.filename}'" if node.filename}
69
+ Comments will evaluate the contents of interpolations (\#{ ... }) in Sass 3.2.
70
+ Please escape the interpolation by adding a backslash before the hash sign.
71
+ MESSAGE
72
+ elsif content =~ /\\\#\{.*\}/
73
+ content.gsub!(/\\(\#\{.*\})/, '\1')
74
+ end
75
+ content.gsub!(/\n +(\* *(?!\/))?/, ' ') if (node.style == :compact || node.style == :compressed) && !node.loud
76
+ content
77
+ end
78
+
79
+ def visit_directive(node)
80
+ return node.value + ";" unless node.has_children
81
+ return node.value + " {}" if node.children.empty?
82
+ result = if node.style == :compressed
83
+ "#{node.value}{"
84
+ else
85
+ "#{' ' * @tabs}#{node.value} {" + (node.style == :compact ? ' ' : "\n")
86
+ end
87
+ was_prop = false
88
+ first = true
89
+ node.children.each do |child|
90
+ next if child.invisible?
91
+ if node.style == :compact
92
+ if child.is_a?(Sass::Tree::PropNode)
93
+ with_tabs(first || was_prop ? 0 : @tabs + 1) {result << visit(child) << ' '}
94
+ else
95
+ result[-1] = "\n" if was_prop
96
+ rendered = with_tabs(@tabs + 1) {visit(child).dup}
97
+ rendered = rendered.lstrip if first
98
+ result << rendered.rstrip + "\n"
99
+ end
100
+ was_prop = child.is_a?(Sass::Tree::PropNode)
101
+ first = false
102
+ elsif node.style == :compressed
103
+ result << (was_prop ? ";" : "") << with_tabs(0) {visit(child)}
104
+ was_prop = child.is_a?(Sass::Tree::PropNode)
105
+ else
106
+ result << with_tabs(@tabs + 1) {visit(child)} + "\n"
107
+ end
108
+ end
109
+ result.rstrip + if node.style == :compressed
110
+ "}"
111
+ else
112
+ (node.style == :expanded ? "\n" : " ") + "}\n"
113
+ end
114
+ end
115
+
116
+ def visit_media(node)
117
+ str = with_tabs(@tabs + node.tabs) {visit_directive(node)}
118
+ str.gsub!(/\n\Z/, '') unless node.style == :compressed || node.group_end
119
+ str
120
+ end
121
+
122
+ def visit_prop(node)
123
+ tab_str = ' ' * (@tabs + node.tabs)
124
+ if node.style == :compressed
125
+ "#{tab_str}#{node.resolved_name}:#{node.resolved_value}#{'!important' if node.important}"
126
+ else
127
+ "#{tab_str}#{node.resolved_name}: #{node.resolved_value}#{' !important' if node.important};"
128
+ end
129
+ end
130
+
131
+ def visit_rule(node)
132
+ with_tabs(@tabs + node.tabs) do
133
+ rule_separator = node.style == :compressed ? ',' : ', '
134
+ line_separator =
135
+ case node.style
136
+ when :nested, :expanded; "\n"
137
+ when :compressed; ""
138
+ else; " "
139
+ end
140
+ rule_indent = ' ' * @tabs
141
+ per_rule_indent, total_indent = [:nested, :expanded].include?(node.style) ? [rule_indent, ''] : ['', rule_indent]
142
+
143
+ joined_rules = node.resolved_rules.members.map do |seq|
144
+ rule_part = seq.to_a.join
145
+ rule_part.gsub!(/\s*([^,])\s*\n\s*/m, '\1 ') if node.style == :compressed
146
+ rule_part
147
+ end.join(rule_separator)
148
+
149
+ joined_rules.sub!(/\A\s*/, per_rule_indent)
150
+ joined_rules.gsub!(/\s*\n\s*/, "#{line_separator}#{per_rule_indent}")
151
+ total_rule = total_indent << joined_rules
152
+
153
+ to_return = ''
154
+ old_spaces = ' ' * @tabs
155
+ spaces = ' ' * (@tabs + 1)
156
+ if node.style != :compressed
157
+ if node.options[:debug_info]
158
+ to_return << visit(debug_info_rule(node.debug_info, node.options)) << "\n"
159
+ elsif node.options[:line_comments]
160
+ to_return << "#{old_spaces}/* line #{node.line}"
161
+
162
+ if node.filename
163
+ relative_filename = if node.options[:css_filename]
164
+ begin
165
+ Pathname.new(node.filename).relative_path_from(
166
+ Pathname.new(File.dirname(node.options[:css_filename]))).to_s
167
+ rescue ArgumentError
168
+ nil
169
+ end
170
+ end
171
+ relative_filename ||= node.filename
172
+ to_return << ", #{relative_filename}"
173
+ end
174
+
175
+ to_return << " */\n"
176
+ end
177
+ end
178
+
179
+ if node.style == :compact
180
+ properties = with_tabs(0) {node.children.map {|a| visit(a)}.join(' ')}
181
+ to_return << "#{total_rule} { #{properties} }#{"\n" if node.group_end}"
182
+ elsif node.style == :compressed
183
+ properties = with_tabs(0) {node.children.map {|a| visit(a)}.join(';')}
184
+ to_return << "#{total_rule}{#{properties}}"
185
+ else
186
+ properties = with_tabs(@tabs + 1) {node.children.map {|a| visit(a)}.join("\n")}
187
+ end_props = (node.style == :expanded ? "\n" + old_spaces : ' ')
188
+ to_return << "#{total_rule} {\n#{properties}#{end_props}}#{"\n" if node.group_end}"
189
+ end
190
+
191
+ to_return
192
+ end
193
+ end
194
+
195
+ private
196
+
197
+ def debug_info_rule(debug_info, options)
198
+ node = Sass::Tree::DirectiveNode.new("@media -sass-debug-info")
199
+ debug_info.map {|k, v| [k.to_s, v.to_s]}.sort.each do |k, v|
200
+ rule = Sass::Tree::RuleNode.new([""])
201
+ rule.resolved_rules = Sass::Selector::CommaSequence.new(
202
+ [Sass::Selector::Sequence.new(
203
+ [Sass::Selector::SimpleSequence.new(
204
+ [Sass::Selector::Element.new(k.to_s.gsub(/[^\w-]/, "\\\\\\0"), nil)])
205
+ ])
206
+ ])
207
+ prop = Sass::Tree::PropNode.new([""], "", false, :new)
208
+ prop.resolved_name = "font-family"
209
+ prop.resolved_value = Sass::SCSS::RX.escape_ident(v.to_s)
210
+ rule << prop
211
+ node << rule
212
+ end
213
+ node.options = options.merge(:debug_info => false, :line_comments => false, :style => :compressed)
214
+ node
215
+ end
216
+ end
@@ -4,39 +4,15 @@ module Sass
4
4
  #
5
5
  # @see Sass::Tree
6
6
  class WarnNode < Node
7
+ # The expression to print.
8
+ # @return [Script::Node]
9
+ attr_reader :expr
10
+
7
11
  # @param expr [Script::Node] The expression to print
8
12
  def initialize(expr)
9
13
  @expr = expr
10
14
  super()
11
15
  end
12
-
13
- protected
14
-
15
- # @see Node#to_src
16
- def to_src(tabs, opts, fmt)
17
- "#{' ' * tabs}@warn #{@expr.to_sass(opts)}#{semi fmt}\n"
18
- end
19
-
20
- # Prints the expression to STDERR with a stylesheet trace.
21
- #
22
- # @param environment [Sass::Environment] The lexical environment containing
23
- # variable and mixin values
24
- def _perform(environment)
25
- environment.push_frame(:filename => filename, :line => line)
26
- res = @expr.perform(environment)
27
- res = res.value if res.is_a?(Sass::Script::String)
28
- msg = "WARNING: #{res}\n"
29
- environment.stack.reverse.each_with_index do |entry, i|
30
- msg << " #{i == 0 ? "on" : "from"} line #{entry[:line]}" <<
31
- " of #{entry[:filename] || "an unknown file"}"
32
- msg << ", in `#{entry[:mixin]}'" if entry[:mixin]
33
- msg << "\n"
34
- end
35
- Sass::Util.sass_warn msg
36
- []
37
- ensure
38
- environment.pop_frame
39
- end
40
16
  end
41
17
  end
42
18
  end
@@ -5,44 +5,14 @@ module Sass::Tree
5
5
  #
6
6
  # @see Sass::Tree
7
7
  class WhileNode < Node
8
- # @param expr [Script::Node] The parse tree for the continue expression
8
+ # The parse tree for the continuation expression.
9
+ # @return [Script::Node]
10
+ attr_reader :expr
11
+
12
+ # @param expr [Script::Node] See \{#expr}
9
13
  def initialize(expr)
10
14
  @expr = expr
11
15
  super()
12
16
  end
13
-
14
- protected
15
-
16
- # @see Node#to_src
17
- def to_src(tabs, opts, fmt)
18
- "#{' ' * tabs}@while #{@expr.to_sass(opts)}" + children_to_src(tabs, opts, fmt)
19
- end
20
-
21
- # Runs the child nodes until the continue expression becomes false.
22
- #
23
- # @param environment [Sass::Environment] The lexical environment containing
24
- # variable and mixin values
25
- # @return [Array<Tree::Node>] The resulting static nodes
26
- # @see Sass::Tree
27
- def _perform(environment)
28
- children = []
29
- new_environment = Sass::Environment.new(environment)
30
- while @expr.perform(environment).to_bool
31
- children += perform_children(new_environment)
32
- end
33
- children
34
- end
35
-
36
- # Returns an error message if the given child node is invalid,
37
- # and false otherwise.
38
- #
39
- # {ExtendNode}s are valid within {WhileNode}s.
40
- #
41
- # @param child [Tree::Node] A potential child node.
42
- # @return [Boolean, String] Whether or not the child node is valid,
43
- # as well as the error message to display if it is invalid
44
- def invalid_child?(child)
45
- super unless child.is_a?(ExtendNode)
46
- end
47
17
  end
48
18
  end
@@ -270,47 +270,6 @@ module Sass
270
270
  version_gt(v1, v2) || !version_gt(v2, v1)
271
271
  end
272
272
 
273
- # A wrapper for `Marshal.dump` that calls `#_before_dump` on the object
274
- # before dumping it, `#_after_dump` afterwards.
275
- # It also calls `#_around_dump` and passes it a block in which the object is dumped.
276
- #
277
- # If any of these methods are undefined, they are not called.
278
- #
279
- # This will recursively call itself on members of arrays and hashes,
280
- # but not of user-defined objects.
281
- # This means that user-defined objects that need their members' `#_before_dump` etc. methods called
282
- # must call `Haml::Util.dump` and `Haml::Util.load` manually on those members.
283
- #
284
- # @param obj [Object] The object to dump.
285
- # @return [String] The dumped data.
286
- def dump(obj)
287
- obj._before_dump if obj.respond_to?(:_before_dump)
288
- return convert_and_dump(obj) unless obj.respond_to?(:_around_dump)
289
- res = nil
290
- obj._around_dump {res = convert_and_dump(obj)}
291
- res
292
- ensure
293
- obj._after_dump if obj.respond_to?(:_after_dump)
294
- end
295
-
296
- # A wrapper for `Marshal.load` that calls `#_after_load` on the object
297
- # after loading it, if it's defined.
298
- #
299
- # @param data [String] The data to load.
300
- # @return [Object] The loaded object.
301
- def load(data)
302
- obj = Marshal.load(data)
303
-
304
- if obj.is_a?(Array)
305
- obj = obj.map {|e| Sass::Util.load(e)}
306
- elsif obj.is_a?(Hash)
307
- obj = map_hash(obj) {|k, v| [Sass::Util.load(k), Sass::Util.load(v)]}
308
- end
309
-
310
- obj._after_load if obj.respond_to?(:_after_load)
311
- obj
312
- end
313
-
314
273
  # Throws a NotImplementedError for an abstract method.
315
274
  #
316
275
  # @param obj [Object] `self`
@@ -706,14 +665,5 @@ MSG
706
665
  return lcs_backtrace(c, x, y, i, j-1, &block) if c[i][j-1] > c[i-1][j]
707
666
  return lcs_backtrace(c, x, y, i-1, j, &block)
708
667
  end
709
-
710
- def convert_and_dump(obj)
711
- if obj.is_a?(Array)
712
- obj = obj.map {|e| dump(e)}
713
- elsif obj.is_a?(Hash)
714
- obj = map_hash(obj) {|k, v| [dump(k), dump(v)]}
715
- end
716
- Marshal.dump(obj)
717
- end
718
668
  end
719
669
  end
@@ -22,7 +22,7 @@ SASS_GEMSPEC = Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'maruku', '>= 0.5.9'
23
23
 
24
24
  readmes = Dir['*'].reject{ |x| x =~ /(^|[^.a-z])[a-z]+/ || x == "TODO" }
25
- spec.executables = ['sass', 'css2sass', 'sass-convert']
25
+ spec.executables = ['sass', 'sass-convert']
26
26
  spec.files = Dir['rails/init.rb', 'lib/**/*', 'vendor/**/*',
27
27
  'bin/*', 'test/**/*', 'extra/**/*', 'Rakefile', 'init.rb',
28
28
  '.yardopts'] + readmes
@@ -165,14 +165,6 @@ SASS
165
165
  foo bar {
166
166
  baz: 12 $bang "bip"; }
167
167
  SCSS
168
-
169
- assert_sass_to_scss <<SCSS, <<SASS
170
- foo bar {
171
- baz: 12 $bang bip; }
172
- SCSS
173
- foo bar
174
- baz= 12 $bang "bip"
175
- SASS
176
168
  end
177
169
 
178
170
  def test_dynamic_properties_with_old
@@ -183,14 +175,6 @@ SASS
183
175
  foo bar {
184
176
  baz: 12 $bang "bip"; }
185
177
  SCSS
186
-
187
- assert_sass_to_scss <<SCSS, <<SASS, :old => true
188
- foo bar {
189
- baz: 12 $bang bip; }
190
- SCSS
191
- foo bar
192
- :baz= 12 $bang "bip"
193
- SASS
194
178
  end
195
179
 
196
180
  def test_multiline_properties
@@ -842,22 +826,12 @@ SASS
842
826
  a: $baz $bang; } }
843
827
  SCSS
844
828
 
845
- assert_scss_to_sass <<SASS, <<SCSS
846
- =foo-bar($baz, $bang: foo)
847
- baz
848
- a: $baz $bang
849
- SASS
850
- @mixin foo-bar($baz, $bang = "foo") {
851
- baz {
852
- a: $baz $bang; } }
853
- SCSS
854
-
855
829
  assert_sass_to_scss <<SCSS, <<SASS
856
830
  @mixin foo-bar($baz, $bang: foo) {
857
831
  baz {
858
832
  a: $baz $bang; } }
859
833
  SCSS
860
- =foo-bar($baz, $bang = "foo")
834
+ =foo-bar($baz, $bang: foo)
861
835
  baz
862
836
  a: $baz $bang
863
837
  SASS
@@ -901,6 +875,42 @@ foo {
901
875
  SCSS
902
876
  end
903
877
 
878
+ def test_argless_function_definition
879
+ assert_renders <<SASS, <<SCSS
880
+ @function foo()
881
+ $var: 1 + 1
882
+ @return $var
883
+ SASS
884
+ @function foo() {
885
+ $var: 1 + 1;
886
+ @return $var; }
887
+ SCSS
888
+ end
889
+
890
+ def test_function_definition_without_defaults
891
+ assert_renders <<SASS, <<SCSS
892
+ @function foo($var1, $var2)
893
+ @if $var1
894
+ @return $var1 + $var2
895
+ SASS
896
+ @function foo($var1, $var2) {
897
+ @if $var1 {
898
+ @return $var1 + $var2; } }
899
+ SCSS
900
+ end
901
+
902
+ def test_function_definition_with_defaults
903
+ assert_renders <<SASS, <<SCSS
904
+ @function foo($var1, $var2: foo)
905
+ @if $var1
906
+ @return $var1 + $var2
907
+ SASS
908
+ @function foo($var1, $var2: foo) {
909
+ @if $var1 {
910
+ @return $var1 + $var2; } }
911
+ SCSS
912
+ end
913
+
904
914
  def test_variable_definition
905
915
  assert_renders <<SASS, <<SCSS
906
916
  $var1: 12px + 15px
@@ -915,8 +925,6 @@ foo {
915
925
  $var2: flaz(#abcdef);
916
926
  val: $var1 $var2; }
917
927
  SCSS
918
-
919
- assert_sass_to_scss '$var: 12px $bar baz;', '$var = 12px $bar "baz"'
920
928
  end
921
929
 
922
930
  def test_guarded_variable_definition
@@ -933,8 +941,6 @@ foo {
933
941
  $var2: flaz(#abcdef) !default;
934
942
  val: $var1 $var2; }
935
943
  SCSS
936
-
937
- assert_sass_to_scss '$var: 12px $bar baz !default;', '$var ||= 12px $bar "baz"'
938
944
  end
939
945
 
940
946
  def test_multiple_variable_definitions
@@ -1078,62 +1084,6 @@ SCSS
1078
1084
  end
1079
1085
  end
1080
1086
 
1081
- # Sass 3 Deprecation conversions
1082
-
1083
- def test_simple_quoted_strings_unquoted_with_equals
1084
- assert_sass_to_scss '$var: 1px foo + bar baz;', '!var = 1px "foo" + "bar" baz'
1085
- assert_sass_to_scss '$var: -foo-bar;', '!var = "-foo-bar"'
1086
- end
1087
-
1088
- def test_complex_quoted_strings_explicitly_unquoted_with_equals
1089
- assert_sass_to_scss '$var: 1px unquote("foo + bar") baz;', '!var = 1px "foo + bar" baz'
1090
- assert_sass_to_scss "$var: unquote('foo\"bar');", '!var = "foo\"bar"'
1091
- end
1092
-
1093
- def test_division_asserted_with_equals
1094
- assert_sass_to_scss <<SCSS, <<SASS
1095
- foo {
1096
- a: (1px / 2px); }
1097
- SCSS
1098
- foo
1099
- a = 1px / 2px
1100
- SASS
1101
- end
1102
-
1103
- def test_division_not_asserted_with_equals_when_unnecessary
1104
- assert_sass_to_scss <<SCSS, <<SASS
1105
- $var: 1px / 2px;
1106
-
1107
- foo {
1108
- a: $var; }
1109
- SCSS
1110
- !var = 1px / 2px
1111
-
1112
- foo
1113
- a = !var
1114
- SASS
1115
-
1116
- assert_sass_to_scss <<SCSS, <<SASS
1117
- $var: 1px;
1118
-
1119
- foo {
1120
- a: $var / 2px; }
1121
- SCSS
1122
- !var = 1px
1123
-
1124
- foo
1125
- a = !var / 2px
1126
- SASS
1127
-
1128
- assert_sass_to_scss <<SCSS, <<SASS
1129
- foo {
1130
- a: 1 + 1px / 2px; }
1131
- SCSS
1132
- foo
1133
- a = 1 + 1px / 2px
1134
- SASS
1135
- end
1136
-
1137
1087
  def test_nested_properties
1138
1088
  assert_renders <<SASS, <<SCSS
1139
1089
  div
@@ -1181,24 +1131,25 @@ div
1181
1131
  SASS
1182
1132
  end
1183
1133
 
1184
- def test_sass2_var_in_property_interpolation
1185
- assert_sass_to_scss <<SCSS, <<SASS
1186
- foo {
1187
- a: b \#{$c} d; }
1188
- SCSS
1189
- foo
1190
- a: b \#{!c} d
1134
+ def test_loud_comment_conversion
1135
+ assert_renders(<<SASS, <<SCSS)
1136
+ /*! \#{"interpolated"}
1137
+ /*!
1138
+ * \#{"also interpolated"}
1191
1139
  SASS
1192
- end
1193
-
1194
- def test_sass2_var_in_selector_interpolation
1195
- assert_sass_to_scss <<SCSS, <<SASS
1196
- foo-\#{$c} {
1197
- a: b; }
1140
+ /*! \#{"interpolated"} */
1141
+ /*!
1142
+ * \#{"also interpolated"} */
1198
1143
  SCSS
1199
- foo-\#{!c}
1200
- a: b
1144
+ assert_renders(<<SASS, <<SCSS)
1145
+ //! \#{"interpolated"}
1146
+ //!
1147
+ //! \#{"also interpolated"}
1201
1148
  SASS
1149
+ //! \#{"interpolated"}
1150
+ //!
1151
+ //! \#{"also interpolated"}
1152
+ SCSS
1202
1153
  end
1203
1154
 
1204
1155
  private