haml-edge 2.3.87 → 2.3.88

Sign up to get free protection for your applications and to get access to all the features.
data/EDGE_GEM_VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.87
1
+ 2.3.88
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.87
1
+ 2.3.88
@@ -54,13 +54,32 @@ module Sass
54
54
  :whitespace => /\s*/,
55
55
  :variable => /!([\w-]+)/,
56
56
  :ident => /(\\.|[^\s\\+*\/%(),=!])+/,
57
- :string_end => /((?:\\.|\#(?!\{)|[^"\\#])*)(?:"|(?=#\{))/,
58
57
  :number => /(-)?(?:(\d*\.\d+)|(\d+))([a-zA-Z%]+)?/,
59
58
  :color => /\##{"([0-9a-fA-F]{1,2})" * 3}|(#{Color::HTML4_COLORS.keys.join("|")})(?!\()/,
60
59
  :bool => /(true|false)\b/,
61
60
  :op => %r{(#{Regexp.union(*OP_NAMES.map{|s| Regexp.new(Regexp.escape(s) + (s =~ /\w$/ ? '(?:\b|$)' : ''))})})}
62
61
  }
63
62
 
63
+ class << self
64
+ private
65
+ def string_re(open, close)
66
+ /#{open}((?:\\.|\#(?!\{)|[^#{close}\\#])*)(#{close}|(?=#\{))/
67
+ end
68
+ end
69
+
70
+ # A hash of regular expressions that are used for tokenizing strings.
71
+ #
72
+ # The key is a [Symbol, Boolean] pair.
73
+ # The symbol represents which style of quotation to use,
74
+ # while the boolean represents whether or not the string
75
+ # is following an interpolated segment.
76
+ STRING_REGULAR_EXPRESSIONS = {
77
+ [:double, false] => string_re('"', '"'),
78
+ [:single, false] => string_re("'", "'"),
79
+ [:double, true] => string_re('', '"'),
80
+ [:single, true] => string_re('', "'"),
81
+ }
82
+
64
83
  # @param str [String, StringScanner] The source text to lex
65
84
  # @param line [Fixnum] The line on which the SassScript appears.
66
85
  # Used for error reporting
@@ -71,6 +90,7 @@ module Sass
71
90
  @line = line
72
91
  @offset = offset
73
92
  @filename = filename
93
+ @interpolation_stack = []
74
94
  @prev = nil
75
95
  end
76
96
 
@@ -114,8 +134,8 @@ module Sass
114
134
  end
115
135
 
116
136
  def token
117
- return string('') if after_interpolation?
118
- variable || string || number || color || bool || op || ident
137
+ return string(@interpolation_stack.pop, true) if after_interpolation?
138
+ variable || string(:double, false) || string(:single, false) || number || color || bool || op || ident
119
139
  end
120
140
 
121
141
  def variable
@@ -128,15 +148,12 @@ module Sass
128
148
  [:ident, s.gsub(/\\(.)/, '\1')]
129
149
  end
130
150
 
131
- def string(start_char = '"')
132
- return unless @scanner.scan(/#{start_char}#{REGULAR_EXPRESSIONS[:string_end]}/)
151
+ def string(re, open)
152
+ return unless @scanner.scan(STRING_REGULAR_EXPRESSIONS[[re, open]])
153
+ @interpolation_stack << re if @scanner[2].empty? # Started an interpolated section
133
154
  [:string, Script::String.new(@scanner[1].gsub(/\\([^0-9a-f])/, '\1').gsub(/\\([0-9a-f]{1,4})/, "\\\\\\1"))]
134
155
  end
135
156
 
136
- def begin_interpolation
137
- @scanner.scan
138
- end
139
-
140
157
  def number
141
158
  return unless @scanner.scan(REGULAR_EXPRESSIONS[:number])
142
159
  value = @scanner[2] ? @scanner[2].to_f : @scanner[3].to_i
@@ -16,9 +16,21 @@ class SassScriptTest < Test::Unit::TestCase
16
16
  end
17
17
 
18
18
  def test_string_escapes
19
+ assert_equal "'", resolve("\"'\"")
19
20
  assert_equal '"', resolve("\"\\\"\"")
20
21
  assert_equal "\\", resolve("\"\\\\\"")
21
22
  assert_equal "\\02fa", resolve("\"\\02fa\"")
23
+
24
+ assert_equal "'", resolve("'\\''")
25
+ assert_equal '"', resolve("'\"'")
26
+ assert_equal "\\", resolve("'\\\\'")
27
+ assert_equal "\\02fa", resolve("'\\02fa'")
28
+ end
29
+
30
+ def test_string_interpolation
31
+ assert_equal "foo2bar", resolve('\'foo#{1 + 1}bar\'')
32
+ assert_equal "foo2bar", resolve('"foo#{1 + 1}bar"')
33
+ assert_equal "foo1bar5baz4bang", resolve('\'foo#{1 + "bar#{2 + 3}baz" + 4}bang\'')
22
34
  end
23
35
 
24
36
  def test_color_names
@@ -188,16 +200,16 @@ WARN
188
200
  def test_string_ops
189
201
  assert_equal "foo bar", resolve('"foo" "bar"')
190
202
  assert_equal "true 1", resolve('true 1')
191
- assert_equal "foo, bar", resolve('"foo" , "bar"')
203
+ assert_equal "foo, bar", resolve("'foo' , 'bar'")
192
204
  assert_equal "true, 1", resolve('true , 1')
193
205
  assert_equal "foobar", resolve('"foo" + "bar"')
194
206
  assert_equal "true1", resolve('true + 1')
195
- assert_equal "foo-bar", resolve('"foo" - "bar"')
207
+ assert_equal "foo-bar", resolve("'foo' - 'bar'")
196
208
  assert_equal "true-1", resolve('true - 1')
197
209
  assert_equal "foo/bar", resolve('"foo" / "bar"')
198
210
  assert_equal "true/1", resolve('true / 1')
199
211
 
200
- assert_equal "-bar", resolve('- "bar"')
212
+ assert_equal "-bar", resolve("- 'bar'")
201
213
  assert_equal "-true", resolve('- true')
202
214
  assert_equal "/bar", resolve('/ "bar"')
203
215
  assert_equal "/true", resolve('/ true')
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.87
4
+ version: 2.3.88
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Weizenbaum