haml-edge 2.3.65 → 2.3.66

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.
@@ -1 +1 @@
1
- 2.3.65
1
+ 2.3.66
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.65
1
+ 2.3.66
@@ -24,7 +24,9 @@ module Sass
24
24
  class RuleNode
25
25
  # @see Node#to_sass
26
26
  def to_sass(tabs, opts = {})
27
- str = "\n#{' ' * tabs}#{rules.first}#{children.any? { |c| c.is_a? PropNode } ? "\n" : ''}"
27
+ name = rules.first
28
+ name = "\\" + name if name[0] == ?:
29
+ str = "\n#{' ' * tabs}#{name}#{children.any? { |c| c.is_a? PropNode } ? "\n" : ''}"
28
30
 
29
31
  children.each do |child|
30
32
  str << "#{child.to_sass(tabs + 1, opts)}"
@@ -329,12 +329,16 @@ LONG
329
329
  def parse_line(parent, line, root)
330
330
  case line.text[0]
331
331
  when PROPERTY_CHAR
332
- if line.text[1] != PROPERTY_CHAR
333
- parse_property(line, PROPERTY_OLD)
334
- else
332
+ if line.text[1] == PROPERTY_CHAR ||
333
+ (@options[:property_syntax] == :new &&
334
+ line.text =~ PROPERTY_OLD && $3.empty?)
335
335
  # Support CSS3-style pseudo-elements,
336
- # which begin with ::
336
+ # which begin with ::,
337
+ # as well as pseudo-classes
338
+ # if we're using the new property syntax
337
339
  Tree::RuleNode.new(line.text)
340
+ else
341
+ parse_property(line, PROPERTY_OLD)
338
342
  end
339
343
  when Script::VARIABLE_CHAR
340
344
  parse_variable(line)
@@ -47,6 +47,16 @@ module Sass::Tree
47
47
  self.class == other.class && name == other.name && value == other.value && super
48
48
  end
49
49
 
50
+ # Returns a appropriate message indicating how to escape pseudo-class selectors.
51
+ # This only applies for old-style properties with no value,
52
+ # so returns the empty string if this is new-style.
53
+ #
54
+ # @return [String] The message
55
+ def pseudo_class_selector_message
56
+ return "" if @prop_syntax == :new || !value.empty?
57
+ "\nIf #{declaration.dump} should be a selector, use \"\\#{declaration}\" instead."
58
+ end
59
+
50
60
  protected
51
61
 
52
62
  # Computes the CSS for the property.
@@ -62,7 +72,8 @@ module Sass::Tree
62
72
  elsif value[-1] == ?;
63
73
  raise Sass::SyntaxError.new("Invalid property: #{declaration.dump} (no \";\" required at end-of-line).")
64
74
  elsif value.empty?
65
- raise Sass::SyntaxError.new("Invalid property: #{declaration.dump} (no value).")
75
+ raise Sass::SyntaxError.new("Invalid property: #{declaration.dump} (no value)." +
76
+ pseudo_class_selector_message)
66
77
  end
67
78
 
68
79
  to_return = ' ' * (tabs - 1 + indentation) + name + ":" +
@@ -112,7 +123,7 @@ module Sass::Tree
112
123
  private
113
124
 
114
125
  def declaration
115
- @prop_syntax == :new ? "#{name}: #{value}" : ":#{name} #{value}"
126
+ (@prop_syntax == :new ? "#{name}: #{value}" : ":#{name} #{value}").strip
116
127
  end
117
128
  end
118
129
  end
@@ -40,8 +40,11 @@ module Sass
40
40
  def _to_s(*args)
41
41
  result = String.new
42
42
  children.each do |child|
43
- raise Sass::SyntaxError.new('Properties aren\'t allowed at the root of a document.',
44
- :line => child.line) if child.is_a? PropNode
43
+ if child.is_a? PropNode
44
+ message = "Properties aren't allowed at the root of a document." +
45
+ child.pseudo_class_selector_message
46
+ raise Sass::SyntaxError.new(message, :line => child.line)
47
+ end
45
48
 
46
49
  next if child.invisible?
47
50
  child_str = child.to_s(1)
@@ -230,6 +230,19 @@ SASS
230
230
  CSS
231
231
  end
232
232
 
233
+ def test_pseudo_classes_are_escaped
234
+ assert_equal(<<SASS, css2sass(<<CSS))
235
+ \\:focus
236
+ a: b
237
+
238
+ \\:foo
239
+ bar: baz
240
+ SASS
241
+ :focus {a: b;}
242
+ :focus :foo {bar: baz;}
243
+ CSS
244
+ end
245
+
233
246
  # Error reporting
234
247
 
235
248
  def test_error_reporting
@@ -18,8 +18,11 @@ class SassEngineTest < Test::Unit::TestCase
18
18
  ":" => 'Invalid property: ":".',
19
19
  ": a" => 'Invalid property: ": a".',
20
20
  ":= a" => 'Invalid property: ":= a".',
21
- "a\n :b" => 'Invalid property: ":b " (no value).',
22
- "a\n b:" => 'Invalid property: "b: " (no value).',
21
+ "a\n :b" => <<MSG,
22
+ Invalid property: ":b" (no value).
23
+ If ":b" should be a selector, use "\\:b" instead.
24
+ MSG
25
+ "a\n b:" => 'Invalid property: "b:" (no value).',
23
26
  "a\n :b: c" => 'Invalid property: ":b: c".',
24
27
  "a\n :b:c d" => 'Invalid property: ":b:c d".',
25
28
  "a\n :b=c d" => 'Invalid property: ":b=c d".',
@@ -28,6 +31,12 @@ class SassEngineTest < Test::Unit::TestCase
28
31
  "a\n b : c" => 'Invalid property: "b : c".',
29
32
  "a\n b=c: d" => 'Invalid property: "b=c: d".',
30
33
  "a: b" => 'Properties aren\'t allowed at the root of a document.',
34
+ ":a b" => 'Properties aren\'t allowed at the root of a document.',
35
+ "a:" => 'Properties aren\'t allowed at the root of a document.',
36
+ ":a" => <<MSG,
37
+ Properties aren't allowed at the root of a document.
38
+ If ":a" should be a selector, use "\\:a" instead.
39
+ MSG
31
40
  "!" => 'Invalid variable: "!".',
32
41
  "!a" => 'Invalid variable: "!a".',
33
42
  "! a" => 'Invalid variable: "! a".',
@@ -134,7 +143,7 @@ class SassEngineTest < Test::Unit::TestCase
134
143
  rescue Sass::SyntaxError => err
135
144
  value = [value] unless value.is_a?(Array)
136
145
 
137
- assert_equal(value.first, err.message, "Line: #{key}")
146
+ assert_equal(value.first.rstrip, err.message, "Line: #{key}")
138
147
  assert_equal(__FILE__, err.sass_filename)
139
148
  assert_equal((value[1] || key.split("\n").length) + line - 1, err.sass_line, "Line: #{key}")
140
149
  assert_match(/#{Regexp.escape(__FILE__)}:[0-9]+/, err.backtrace[0], "Line: #{key}")
@@ -233,7 +242,7 @@ SASS
233
242
  rescue Sass::SyntaxError => e
234
243
  assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e, opts).split("\n")[0..15].join("\n"))
235
244
  /*
236
- Syntax error: Invalid property: "e: " (no value).
245
+ Syntax error: Invalid property: "e:" (no value).
237
246
  on line 383 of test_exception_css_with_offset_inline.sass
238
247
 
239
248
  378: a
@@ -822,6 +831,27 @@ bang, bip, bop
822
831
  SASS
823
832
  end
824
833
 
834
+ def test_root_level_pseudo_class_with_new_properties
835
+ assert_equal(<<CSS, render(<<SASS, :property_syntax => :new))
836
+ :focus {
837
+ outline: 0; }
838
+ CSS
839
+ :focus
840
+ outline: 0
841
+ SASS
842
+ end
843
+
844
+ def test_pseudo_class_with_new_properties
845
+ assert_equal(<<CSS, render(<<SASS, :property_syntax => :new))
846
+ p :focus {
847
+ outline: 0; }
848
+ CSS
849
+ p
850
+ :focus
851
+ outline: 0
852
+ SASS
853
+ end
854
+
825
855
  # Regression tests
826
856
 
827
857
  def test_parens_in_mixins
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.3.65
4
+ version: 2.3.66
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-10-29 00:00:00 -04:00
13
+ date: 2009-10-31 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency