haml 2.2.24 → 3.0.0.beta.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 (168) hide show
  1. data/.yardopts +0 -1
  2. data/README.md +91 -151
  3. data/REMEMBER +11 -1
  4. data/Rakefile +73 -55
  5. data/VERSION +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/bin/css2sass +7 -1
  8. data/bin/sass-convert +7 -0
  9. data/extra/haml-mode.el +2 -1
  10. data/lib/haml/buffer.rb +22 -4
  11. data/lib/haml/engine.rb +5 -1
  12. data/lib/haml/exec.rb +231 -46
  13. data/lib/haml/filters.rb +19 -8
  14. data/lib/haml/helpers.rb +47 -20
  15. data/lib/haml/helpers/action_view_extensions.rb +2 -4
  16. data/lib/haml/helpers/action_view_mods.rb +11 -8
  17. data/lib/haml/helpers/xss_mods.rb +13 -2
  18. data/lib/haml/html.rb +179 -48
  19. data/lib/haml/html/erb.rb +141 -0
  20. data/lib/haml/precompiler.rb +40 -15
  21. data/lib/haml/railtie.rb +1 -5
  22. data/lib/haml/root.rb +3 -0
  23. data/lib/haml/template.rb +4 -14
  24. data/lib/haml/util.rb +120 -30
  25. data/lib/haml/version.rb +25 -2
  26. data/lib/sass.rb +5 -1
  27. data/lib/sass/callbacks.rb +50 -0
  28. data/lib/sass/css.rb +40 -191
  29. data/lib/sass/engine.rb +170 -74
  30. data/lib/sass/environment.rb +8 -2
  31. data/lib/sass/error.rb +163 -25
  32. data/lib/sass/files.rb +31 -28
  33. data/lib/sass/plugin.rb +268 -87
  34. data/lib/sass/plugin/rails.rb +9 -4
  35. data/lib/sass/repl.rb +1 -1
  36. data/lib/sass/script.rb +31 -29
  37. data/lib/sass/script/bool.rb +1 -0
  38. data/lib/sass/script/color.rb +290 -23
  39. data/lib/sass/script/css_lexer.rb +22 -0
  40. data/lib/sass/script/css_parser.rb +28 -0
  41. data/lib/sass/script/funcall.rb +22 -3
  42. data/lib/sass/script/functions.rb +523 -33
  43. data/lib/sass/script/interpolation.rb +42 -0
  44. data/lib/sass/script/lexer.rb +169 -52
  45. data/lib/sass/script/literal.rb +58 -9
  46. data/lib/sass/script/node.rb +79 -1
  47. data/lib/sass/script/number.rb +20 -5
  48. data/lib/sass/script/operation.rb +49 -3
  49. data/lib/sass/script/parser.rb +162 -28
  50. data/lib/sass/script/string.rb +50 -2
  51. data/lib/sass/script/unary_operation.rb +25 -2
  52. data/lib/sass/script/variable.rb +21 -4
  53. data/lib/sass/scss.rb +14 -0
  54. data/lib/sass/scss/css_parser.rb +39 -0
  55. data/lib/sass/scss/parser.rb +683 -0
  56. data/lib/sass/scss/rx.rb +112 -0
  57. data/lib/sass/scss/script_lexer.rb +13 -0
  58. data/lib/sass/scss/script_parser.rb +25 -0
  59. data/lib/sass/tree/comment_node.rb +69 -27
  60. data/lib/sass/tree/debug_node.rb +7 -2
  61. data/lib/sass/tree/directive_node.rb +41 -35
  62. data/lib/sass/tree/for_node.rb +6 -0
  63. data/lib/sass/tree/if_node.rb +13 -1
  64. data/lib/sass/tree/import_node.rb +52 -27
  65. data/lib/sass/tree/mixin_def_node.rb +18 -0
  66. data/lib/sass/tree/mixin_node.rb +41 -6
  67. data/lib/sass/tree/node.rb +197 -70
  68. data/lib/sass/tree/prop_node.rb +152 -57
  69. data/lib/sass/tree/root_node.rb +118 -0
  70. data/lib/sass/tree/rule_node.rb +193 -96
  71. data/lib/sass/tree/variable_node.rb +9 -5
  72. data/lib/sass/tree/while_node.rb +4 -0
  73. data/test/benchmark.rb +5 -5
  74. data/test/haml/engine_test.rb +147 -10
  75. data/test/haml/{rhtml/_av_partial_1.rhtml → erb/_av_partial_1.erb} +1 -1
  76. data/test/haml/{rhtml/_av_partial_2.rhtml → erb/_av_partial_2.erb} +1 -1
  77. data/test/haml/{rhtml/action_view.rhtml → erb/action_view.erb} +1 -1
  78. data/test/haml/{rhtml/standard.rhtml → erb/standard.erb} +0 -0
  79. data/test/haml/helper_test.rb +91 -24
  80. data/test/haml/html2haml/erb_tests.rb +410 -0
  81. data/test/haml/html2haml_test.rb +210 -66
  82. data/test/haml/results/filters.xhtml +1 -1
  83. data/test/haml/results/just_stuff.xhtml +2 -0
  84. data/test/haml/spec_test.rb +44 -0
  85. data/test/haml/template_test.rb +22 -2
  86. data/test/haml/templates/helpers.haml +0 -13
  87. data/test/haml/templates/just_stuff.haml +2 -0
  88. data/test/haml/util_test.rb +48 -0
  89. data/test/sass/callbacks_test.rb +61 -0
  90. data/test/sass/conversion_test.rb +884 -0
  91. data/test/sass/css2sass_test.rb +99 -18
  92. data/test/sass/data/hsl-rgb.txt +319 -0
  93. data/test/sass/engine_test.rb +1049 -131
  94. data/test/sass/functions_test.rb +398 -47
  95. data/test/sass/more_results/more_import.css +1 -1
  96. data/test/sass/more_templates/more_import.sass +3 -3
  97. data/test/sass/plugin_test.rb +184 -10
  98. data/test/sass/results/compact.css +1 -1
  99. data/test/sass/results/complex.css +5 -5
  100. data/test/sass/results/compressed.css +1 -1
  101. data/test/sass/results/expanded.css +1 -1
  102. data/test/sass/results/import.css +3 -1
  103. data/test/sass/results/mixins.css +12 -12
  104. data/test/sass/results/nested.css +1 -1
  105. data/test/sass/results/options.css +1 -0
  106. data/test/sass/results/parent_ref.css +4 -4
  107. data/test/sass/results/script.css +3 -3
  108. data/test/sass/results/scss_import.css +15 -0
  109. data/test/sass/results/scss_importee.css +2 -0
  110. data/test/sass/script_conversion_test.rb +153 -0
  111. data/test/sass/script_test.rb +137 -70
  112. data/test/sass/scss/css_test.rb +811 -0
  113. data/test/sass/scss/rx_test.rb +156 -0
  114. data/test/sass/scss/scss_test.rb +871 -0
  115. data/test/sass/scss/test_helper.rb +37 -0
  116. data/test/sass/templates/alt.sass +2 -2
  117. data/test/sass/templates/bork1.sass +2 -0
  118. data/test/sass/templates/bork3.sass +2 -0
  119. data/test/sass/templates/bork4.sass +2 -0
  120. data/test/sass/templates/import.sass +4 -4
  121. data/test/sass/templates/importee.sass +3 -3
  122. data/test/sass/templates/line_numbers.sass +1 -1
  123. data/test/sass/templates/mixin_bork.sass +5 -0
  124. data/test/sass/templates/mixins.sass +2 -2
  125. data/test/sass/templates/nested_bork1.sass +2 -0
  126. data/test/sass/templates/nested_bork2.sass +2 -0
  127. data/test/sass/templates/nested_bork3.sass +2 -0
  128. data/test/sass/templates/nested_bork4.sass +2 -0
  129. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  130. data/test/sass/templates/options.sass +2 -0
  131. data/test/sass/templates/parent_ref.sass +2 -2
  132. data/test/sass/templates/script.sass +69 -69
  133. data/test/sass/templates/scss_import.scss +10 -0
  134. data/test/sass/templates/scss_importee.scss +1 -0
  135. data/test/sass/templates/units.sass +10 -10
  136. data/test/test_helper.rb +20 -8
  137. data/vendor/fssm/LICENSE +20 -0
  138. data/vendor/fssm/README.markdown +55 -0
  139. data/vendor/fssm/Rakefile +59 -0
  140. data/vendor/fssm/VERSION.yml +5 -0
  141. data/vendor/fssm/example.rb +9 -0
  142. data/vendor/fssm/fssm.gemspec +77 -0
  143. data/vendor/fssm/lib/fssm.rb +33 -0
  144. data/vendor/fssm/lib/fssm/backends/fsevents.rb +36 -0
  145. data/vendor/fssm/lib/fssm/backends/inotify.rb +26 -0
  146. data/vendor/fssm/lib/fssm/backends/polling.rb +25 -0
  147. data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +131 -0
  148. data/vendor/fssm/lib/fssm/monitor.rb +26 -0
  149. data/vendor/fssm/lib/fssm/path.rb +91 -0
  150. data/vendor/fssm/lib/fssm/pathname.rb +502 -0
  151. data/vendor/fssm/lib/fssm/state/directory.rb +57 -0
  152. data/vendor/fssm/lib/fssm/state/file.rb +24 -0
  153. data/vendor/fssm/lib/fssm/support.rb +63 -0
  154. data/vendor/fssm/lib/fssm/tree.rb +176 -0
  155. data/vendor/fssm/profile/prof-cache.rb +40 -0
  156. data/vendor/fssm/profile/prof-fssm-pathname.html +1231 -0
  157. data/vendor/fssm/profile/prof-pathname.rb +68 -0
  158. data/vendor/fssm/profile/prof-plain-pathname.html +988 -0
  159. data/vendor/fssm/profile/prof.html +2379 -0
  160. data/vendor/fssm/spec/path_spec.rb +75 -0
  161. data/vendor/fssm/spec/root/duck/quack.txt +0 -0
  162. data/vendor/fssm/spec/root/file.css +0 -0
  163. data/vendor/fssm/spec/root/file.rb +0 -0
  164. data/vendor/fssm/spec/root/file.yml +0 -0
  165. data/vendor/fssm/spec/root/moo/cow.txt +0 -0
  166. data/vendor/fssm/spec/spec_helper.rb +14 -0
  167. metadata +94 -14
  168. data/test/sass/templates/bork.sass +0 -2
@@ -0,0 +1,502 @@
1
+ require 'fileutils'
2
+ require 'find'
3
+
4
+ module FSSM
5
+ class Pathname < String
6
+ SYMLOOP_MAX = 8
7
+
8
+ ROOT = '/'.freeze
9
+ DOT = '.'.freeze
10
+ DOT_DOT = '..'.freeze
11
+
12
+ class << self
13
+ def for(path)
14
+ path.is_a?(::FSSM::Pathname) ? path : new("#{path}")
15
+ end
16
+ end
17
+
18
+ def initialize(path)
19
+ raise ArgumentError, "path cannot contain ASCII NULLs" if path =~ %r{\0}
20
+ super(path)
21
+ end
22
+
23
+ def <=>(other)
24
+ self.tr('/', "\0").to_s <=> other.to_str.tr('/', "\0")
25
+ rescue NoMethodError
26
+ nil
27
+ end
28
+
29
+ def ==(other)
30
+ left = self.cleanpath.tr('/', "\0").to_s
31
+ right = self.class.for(other).cleanpath.tr('/', "\0").to_s
32
+
33
+ left == right
34
+ rescue NoMethodError
35
+ false
36
+ end
37
+
38
+ def +(path)
39
+ dup << path
40
+ end
41
+
42
+ def <<(path)
43
+ replace( join(path).cleanpath! )
44
+ end
45
+
46
+ def absolute?
47
+ self[0, 1].to_s == ROOT
48
+ end
49
+
50
+ def ascend
51
+ parts = to_a
52
+ parts.length.downto(1) do |i|
53
+ yield self.class.join(parts[0, i])
54
+ end
55
+ end
56
+
57
+ def children
58
+ entries[2..-1]
59
+ end
60
+
61
+ def cleanpath!
62
+ parts = to_a
63
+ final = []
64
+
65
+ parts.each do |part|
66
+ case part
67
+ when DOT then
68
+ next
69
+ when DOT_DOT then
70
+ case final.last
71
+ when ROOT then
72
+ next
73
+ when DOT_DOT then
74
+ final.push(DOT_DOT)
75
+ when nil then
76
+ final.push(DOT_DOT)
77
+ else
78
+ final.pop
79
+ end
80
+ else
81
+ final.push(part)
82
+ end
83
+ end
84
+
85
+ replace(final.empty? ? DOT : self.class.join(*final))
86
+ end
87
+
88
+ def cleanpath
89
+ dup.cleanpath!
90
+ end
91
+
92
+ def descend
93
+ parts = to_a
94
+ 1.upto(parts.length) { |i| yield self.class.join(parts[0, i]) }
95
+ end
96
+
97
+ def dot?
98
+ self == DOT
99
+ end
100
+
101
+ def dot_dot?
102
+ self == DOT_DOT
103
+ end
104
+
105
+ def each_filename(&blk)
106
+ to_a.each(&blk)
107
+ end
108
+
109
+ def mountpoint?
110
+ stat1 = self.lstat
111
+ stat2 = self.parent.lstat
112
+
113
+ stat1.dev != stat2.dev || stat1.ino == stat2.ino
114
+ rescue Errno::ENOENT
115
+ false
116
+ end
117
+
118
+ def parent
119
+ self + '..'
120
+ end
121
+
122
+ def realpath
123
+ path = self
124
+
125
+ SYMLOOP_MAX.times do
126
+ link = path.readlink
127
+ link = path.dirname + link if link.relative?
128
+ path = link
129
+ end
130
+
131
+ raise Errno::ELOOP, self
132
+ rescue Errno::EINVAL
133
+ path.expand_path
134
+ end
135
+
136
+ def relative?
137
+ !absolute?
138
+ end
139
+
140
+ def relative_path_from(base)
141
+ base = self.class.for(base)
142
+
143
+ raise ArgumentError, 'no relative path between a relative and absolute' if self.absolute? != base.absolute?
144
+
145
+ return self if base.dot?
146
+ return self.class.new(DOT) if self == base
147
+
148
+ base = base.cleanpath.to_a
149
+ dest = self.cleanpath.to_a
150
+
151
+ while !dest.empty? && !base.empty? && dest[0] == base[0]
152
+ base.shift
153
+ dest.shift
154
+ end
155
+
156
+ base.shift if base[0] == DOT
157
+ dest.shift if dest[0] == DOT
158
+
159
+ raise ArgumentError, "base directory may not contain '#{DOT_DOT}'" if base.include?(DOT_DOT)
160
+
161
+ path = base.fill(DOT_DOT) + dest
162
+ path = self.class.join(*path)
163
+ path = self.class.new(DOT) if path.empty?
164
+
165
+ path
166
+ end
167
+
168
+ def root?
169
+ !!(self =~ %r{^#{ROOT}+$})
170
+ end
171
+
172
+ def to_a
173
+ array = to_s.split(File::SEPARATOR)
174
+ array.delete('')
175
+ array.insert(0, ROOT) if absolute?
176
+ array
177
+ end
178
+
179
+ alias segments to_a
180
+
181
+ def to_path
182
+ self
183
+ end
184
+
185
+ def to_s
186
+ "#{self}"
187
+ end
188
+
189
+ alias to_str to_s
190
+
191
+ def unlink
192
+ Dir.unlink(self)
193
+ true
194
+ rescue Errno::ENOTDIR
195
+ File.unlink(self)
196
+ true
197
+ end
198
+ end
199
+
200
+ class Pathname
201
+ def self.[](pattern)
202
+ Dir[pattern].map! {|d| FSSM::Pathname.new(d) }
203
+ end
204
+
205
+ def self.pwd
206
+ FSSM::Pathname.new(Dir.pwd)
207
+ end
208
+
209
+ def entries
210
+ Dir.entries(self).map! {|e| FSSM::Pathname.new(e) }
211
+ end
212
+
213
+ def mkdir(mode = 0777)
214
+ Dir.mkdir(self, mode)
215
+ end
216
+
217
+ def opendir(&blk)
218
+ Dir.open(self, &blk)
219
+ end
220
+
221
+ def rmdir
222
+ Dir.rmdir(self)
223
+ end
224
+
225
+ def self.glob(pattern, flags = 0)
226
+ dirs = Dir.glob(pattern, flags)
227
+ dirs.map! {|path| FSSM::Pathname.new(path) }
228
+
229
+ if block_given?
230
+ dirs.each {|dir| yield dir }
231
+ nil
232
+ else
233
+ dirs
234
+ end
235
+ end
236
+
237
+ def glob(pattern, flags = 0, &block)
238
+ patterns = [pattern].flatten
239
+ patterns.map! {|p| self.class.glob(self.to_s + p, flags, &block) }
240
+ patterns.flatten
241
+ end
242
+
243
+ def chdir
244
+ blk = lambda { yield self } if block_given?
245
+ Dir.chdir(self, &blk)
246
+ end
247
+ end
248
+
249
+ class Pathname
250
+ def blockdev?
251
+ FileTest.blockdev?(self)
252
+ end
253
+
254
+ def chardev?
255
+ FileTest.chardev?(self)
256
+ end
257
+
258
+ def directory?
259
+ FileTest.directory?(self)
260
+ end
261
+
262
+ def executable?
263
+ FileTest.executable?(self)
264
+ end
265
+
266
+ def executable_real?
267
+ FileTest.executable_real?(self)
268
+ end
269
+
270
+ def exists?
271
+ FileTest.exists?(self)
272
+ end
273
+
274
+ def file?
275
+ FileTest.file?(self)
276
+ end
277
+
278
+ def grpowned?
279
+ FileTest.grpowned?(self)
280
+ end
281
+
282
+ def owned?
283
+ FileTest.owned?(self)
284
+ end
285
+
286
+ def pipe?
287
+ FileTest.pipe?(self)
288
+ end
289
+
290
+ def readable?
291
+ FileTest.readable?(self)
292
+ end
293
+
294
+ def readable_real?
295
+ FileTest.readable_real?(self)
296
+ end
297
+
298
+ def setgid?
299
+ FileTest.setgit?(self)
300
+ end
301
+
302
+ def setuid?
303
+ FileTest.setuid?(self)
304
+ end
305
+
306
+ def socket?
307
+ FileTest.socket?(self)
308
+ end
309
+
310
+ def sticky?
311
+ FileTest.sticky?(self)
312
+ end
313
+
314
+ def symlink?
315
+ FileTest.symlink?(self)
316
+ end
317
+
318
+ def world_readable?
319
+ FileTest.world_readable?(self)
320
+ end
321
+
322
+ def world_writable?
323
+ FileTest.world_writable?(self)
324
+ end
325
+
326
+ def writable?
327
+ FileTest.writable?(self)
328
+ end
329
+
330
+ def writable_real?
331
+ FileTest.writable_real?(self)
332
+ end
333
+
334
+ def zero?
335
+ FileTest.zero?(self)
336
+ end
337
+ end
338
+
339
+ class Pathname
340
+ def atime
341
+ File.atime(self)
342
+ end
343
+
344
+ def ctime
345
+ File.ctime(self)
346
+ end
347
+
348
+ def ftype
349
+ File.ftype(self)
350
+ end
351
+
352
+ def lstat
353
+ File.lstat(self)
354
+ end
355
+
356
+ def mtime
357
+ File.mtime(self)
358
+ end
359
+
360
+ def stat
361
+ File.stat(self)
362
+ end
363
+
364
+ def utime(atime, mtime)
365
+ File.utime(self, atime, mtime)
366
+ end
367
+ end
368
+
369
+ class Pathname
370
+ def self.join(*parts)
371
+ last_part = FSSM::Pathname.new(parts.last)
372
+ return last_part if last_part.absolute?
373
+ FSSM::Pathname.new(File.join(*parts.reject {|p| p.empty? }))
374
+ end
375
+
376
+ def basename
377
+ self.class.new(File.basename(self))
378
+ end
379
+
380
+ def chmod(mode)
381
+ File.chmod(mode, self)
382
+ end
383
+
384
+ def chown(owner, group)
385
+ File.chown(owner, group, self)
386
+ end
387
+
388
+ def dirname
389
+ self.class.new(File.dirname(self))
390
+ end
391
+
392
+ def expand_path(from = nil)
393
+ self.class.new(File.expand_path(self, from))
394
+ end
395
+
396
+ def extname
397
+ File.extname(self)
398
+ end
399
+
400
+ def fnmatch?(pat, flags = 0)
401
+ File.fnmatch(pat, self, flags)
402
+ end
403
+
404
+ def join(*parts)
405
+ self.class.join(self, *parts)
406
+ end
407
+
408
+ def lchmod(mode)
409
+ File.lchmod(mode, self)
410
+ end
411
+
412
+ def lchown(owner, group)
413
+ File.lchown(owner, group, self)
414
+ end
415
+
416
+ def link(to)
417
+ File.link(self, to)
418
+ end
419
+
420
+ def open(mode = 'r', perm = nil, &blk)
421
+ File.open(self, mode, perm, &blk)
422
+ end
423
+
424
+ def readlink
425
+ self.class.new(File.readlink(self))
426
+ end
427
+
428
+ def rename(to)
429
+ File.rename(self, to)
430
+ replace(to)
431
+ end
432
+
433
+ def size
434
+ File.size(self)
435
+ end
436
+
437
+ def size?
438
+ File.size?(self)
439
+ end
440
+
441
+ def split
442
+ File.split(self).map {|part| FSSM::Pathname.new(part) }
443
+ end
444
+
445
+ def symlink(to)
446
+ File.symlink(self, to)
447
+ end
448
+
449
+ def truncate
450
+ File.truncate(self)
451
+ end
452
+ end
453
+
454
+ class Pathname
455
+ def mkpath
456
+ self.class.new(FileUtils.mkpath(self))
457
+ end
458
+
459
+ def rmtree
460
+ self.class.new(FileUtils.rmtree(self).first)
461
+ end
462
+
463
+ def touch
464
+ self.class.new(FileUtils.touch(self).first)
465
+ end
466
+ end
467
+
468
+ class Pathname
469
+ def each_line(sep = $/, &blk)
470
+ IO.foreach(self, sep, &blk)
471
+ end
472
+
473
+ def read(len = nil, off = 0)
474
+ IO.read(self, len, off)
475
+ end
476
+
477
+ def readlines(sep = $/)
478
+ IO.readlines(self, sep)
479
+ end
480
+
481
+ def sysopen(mode = 'r', perm = nil)
482
+ IO.sysopen(self, mode, perm)
483
+ end
484
+ end
485
+
486
+ class Pathname
487
+ def find
488
+ Find.find(self) {|path| yield FSSM::Pathname.new(path) }
489
+ end
490
+ end
491
+
492
+ class Pathname
493
+ class << self
494
+ alias getwd pwd
495
+ end
496
+
497
+ alias absolute expand_path
498
+ alias delete unlink
499
+ alias exist? exists?
500
+ alias fnmatch fnmatch?
501
+ end
502
+ end