haml 1.8.2 → 2.0.0

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 (77) hide show
  1. data/FAQ +138 -0
  2. data/MIT-LICENSE +1 -1
  3. data/{README → README.rdoc} +66 -3
  4. data/Rakefile +111 -147
  5. data/VERSION +1 -1
  6. data/bin/css2sass +0 -0
  7. data/bin/haml +0 -0
  8. data/bin/html2haml +0 -0
  9. data/bin/sass +0 -0
  10. data/init.rb +6 -1
  11. data/lib/haml.rb +464 -201
  12. data/lib/haml/buffer.rb +117 -63
  13. data/lib/haml/engine.rb +63 -44
  14. data/lib/haml/error.rb +16 -6
  15. data/lib/haml/exec.rb +37 -7
  16. data/lib/haml/filters.rb +213 -68
  17. data/lib/haml/helpers.rb +95 -60
  18. data/lib/haml/helpers/action_view_extensions.rb +1 -1
  19. data/lib/haml/helpers/action_view_mods.rb +54 -6
  20. data/lib/haml/html.rb +6 -6
  21. data/lib/haml/precompiler.rb +254 -133
  22. data/lib/haml/template.rb +3 -6
  23. data/lib/haml/template/patch.rb +9 -2
  24. data/lib/haml/template/plugin.rb +52 -23
  25. data/lib/sass.rb +157 -12
  26. data/lib/sass/constant.rb +22 -22
  27. data/lib/sass/constant/color.rb +13 -13
  28. data/lib/sass/constant/literal.rb +7 -7
  29. data/lib/sass/constant/number.rb +9 -9
  30. data/lib/sass/constant/operation.rb +4 -4
  31. data/lib/sass/constant/string.rb +3 -3
  32. data/lib/sass/css.rb +104 -31
  33. data/lib/sass/engine.rb +120 -39
  34. data/lib/sass/error.rb +1 -1
  35. data/lib/sass/plugin.rb +14 -3
  36. data/lib/sass/plugin/merb.rb +6 -2
  37. data/lib/sass/tree/attr_node.rb +5 -5
  38. data/lib/sass/tree/directive_node.rb +2 -7
  39. data/lib/sass/tree/node.rb +1 -12
  40. data/lib/sass/tree/rule_node.rb +39 -31
  41. data/lib/sass/tree/value_node.rb +1 -1
  42. data/test/benchmark.rb +67 -80
  43. data/test/haml/engine_test.rb +284 -84
  44. data/test/haml/helper_test.rb +51 -15
  45. data/test/haml/results/content_for_layout.xhtml +1 -2
  46. data/test/haml/results/eval_suppressed.xhtml +2 -4
  47. data/test/haml/results/filters.xhtml +44 -15
  48. data/test/haml/results/helpers.xhtml +2 -3
  49. data/test/haml/results/just_stuff.xhtml +2 -6
  50. data/test/haml/results/nuke_inner_whitespace.xhtml +34 -0
  51. data/test/haml/results/nuke_outer_whitespace.xhtml +148 -0
  52. data/test/haml/results/original_engine.xhtml +3 -7
  53. data/test/haml/results/partials.xhtml +1 -0
  54. data/test/haml/results/tag_parsing.xhtml +1 -6
  55. data/test/haml/results/very_basic.xhtml +2 -4
  56. data/test/haml/results/whitespace_handling.xhtml +13 -21
  57. data/test/haml/template_test.rb +8 -15
  58. data/test/haml/templates/_partial.haml +1 -0
  59. data/test/haml/templates/filters.haml +48 -7
  60. data/test/haml/templates/just_stuff.haml +1 -2
  61. data/test/haml/templates/nuke_inner_whitespace.haml +26 -0
  62. data/test/haml/templates/nuke_outer_whitespace.haml +144 -0
  63. data/test/haml/templates/tag_parsing.haml +0 -3
  64. data/test/haml/test_helper.rb +15 -0
  65. data/test/sass/engine_test.rb +80 -34
  66. data/test/sass/plugin_test.rb +1 -1
  67. data/test/sass/results/import.css +2 -2
  68. data/test/sass/results/mixins.css +95 -0
  69. data/test/sass/results/multiline.css +24 -0
  70. data/test/sass/templates/import.sass +4 -1
  71. data/test/sass/templates/importee.sass +4 -0
  72. data/test/sass/templates/mixins.sass +76 -0
  73. data/test/sass/templates/multiline.sass +20 -0
  74. metadata +65 -51
  75. data/lib/haml/util.rb +0 -18
  76. data/test/haml/runner.rb +0 -16
  77. data/test/profile.rb +0 -65
@@ -4,9 +4,7 @@
4
4
  <title>Stop. haml time</title>
5
5
  <div id='content'>
6
6
  <h1>This is a title!</h1>
7
- <p>
8
- Lorem ipsum dolor sit amet, consectetur adipisicing elit
9
- </p>
7
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
10
8
  <p class='foo'>Cigarettes!</p>
11
9
  <h2>Man alive!</h2>
12
10
  <ul class='things'>
@@ -15,10 +13,8 @@
15
13
  <li>Bathrobe</li>
16
14
  <li>Coffee</li>
17
15
  </ul>
18
- <pre>
19
- This is some text that's in a pre block!
20
- Let's see what happens when it's rendered! What about now, since we're on a new line?
21
- </pre>
16
+ <pre>This is some text that's in a pre block!
17
+ Let's see what happens when it's rendered! What about now, since we're on a new line?</pre>
22
18
  </div>
23
19
  </head>
24
20
  </html>
@@ -10,6 +10,7 @@
10
10
  @foo =
11
11
  value two
12
12
  </p>
13
+ Toplevel? false
13
14
  <p>
14
15
  @foo =
15
16
  value three
@@ -12,8 +12,7 @@
12
12
  <foo2u>11</foo2u>
13
13
  </div>
14
14
  <div class='classes'>
15
- <p class='foo bar' id='boom'>
16
- </p>
15
+ <p class='foo bar' id='boom'></p>
17
16
  <div class='fooBar'>a</div>
18
17
  <div class='foo-bar'>b</div>
19
18
  <div class='foo_bar'>c</div>
@@ -22,7 +21,3 @@
22
21
  <div class='123'>f</div>
23
22
  <div class='foo2u'>g</div>
24
23
  </div>
25
- <div class='broken'>
26
- <foo><{ :a => :b }</foo>
27
- <div class='foo'>>{ :c => :d }</div>
28
- </div>
@@ -1,7 +1,5 @@
1
1
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
2
  <html>
3
- <head>
4
- </head>
5
- <body>
6
- </body>
3
+ <head></head>
4
+ <body></body>
7
5
  </html>
@@ -12,16 +12,16 @@
12
12
  <div class='text_area_test_area'>
13
13
  <textarea>Oneline</textarea>
14
14
  </div>
15
- <textarea>BLAH&#x000A;</textarea>
15
+ <textarea>BLAH</textarea>
16
16
  <div class='text_area_test_area'>
17
17
  <textarea>Two&#x000A;lines</textarea>
18
18
  </div>
19
- <textarea>BLAH&#x000A;</textarea>
19
+ <textarea>BLAH</textarea>
20
20
  <div id='flattened'>
21
21
  <div class='text_area_test_area'>
22
22
  <textarea>Two&#x000A;lines</textarea>
23
23
  </div>
24
- <textarea>BLAH&#x000A;</textarea>
24
+ <textarea>BLAH</textarea>
25
25
  </div>
26
26
  </div>
27
27
  <div class='hithere'>
@@ -36,7 +36,7 @@
36
36
  </div>
37
37
  <div class='foo'>
38
38
  13
39
- <textarea>&#x000A;a&#x000A;</textarea><textarea>&#x000A;b&#x000A;</textarea><textarea>&#x000A;c&#x000A;</textarea>
39
+ <textarea>&#x000A;a</textarea><textarea>&#x000A;b</textarea><textarea>&#x000A;c</textarea>
40
40
  </div>
41
41
  <div id='whitespace_test'>
42
42
  <div class='text_area_test_area'>
@@ -52,16 +52,16 @@
52
52
  <div class='text_area_test_area'>
53
53
  <textarea>Oneline</textarea>
54
54
  </div>
55
- <textarea>BLAH&#x000A;</textarea>
55
+ <textarea>BLAH</textarea>
56
56
  <div class='text_area_test_area'>
57
57
  <textarea>Two&#x000A;lines</textarea>
58
58
  </div>
59
- <textarea>BLAH&#x000A;</textarea>
59
+ <textarea>BLAH</textarea>
60
60
  <div id='flattened'>
61
61
  <div class='text_area_test_area'>
62
62
  <textarea>Two&#x000A;lines</textarea>
63
63
  </div>
64
- <textarea>BLAH&#x000A;</textarea>
64
+ <textarea>BLAH</textarea>
65
65
  </div>
66
66
  </div>
67
67
  <div class='hithere'>
@@ -73,22 +73,14 @@
73
73
  foo
74
74
  bar
75
75
  </p>
76
- <pre>
77
- ___&#x000A; ,o88888&#x000A; ,o8888888'&#x000A; ,:o:o:oooo. ,8O88Pd8888"&#x000A; ,.::.::o:ooooOoOoO. ,oO8O8Pd888'"&#x000A; ,.:.::o:ooOoOoOO8O8OOo.8OOPd8O8O"&#x000A; , ..:.::o:ooOoOOOO8OOOOo.FdO8O8"&#x000A; , ..:.::o:ooOoOO8O888O8O,COCOO"&#x000A; , . ..:.::o:ooOoOOOO8OOOOCOCO"&#x000A; . ..:.::o:ooOoOoOO8O8OCCCC"o&#x000A; . ..:.::o:ooooOoCoCCC"o:o&#x000A; . ..:.::o:o:,cooooCo"oo:o:&#x000A; ` . . ..:.:cocoooo"'o:o:::'&#x000A; .` . ..::ccccoc"'o:o:o:::'&#x000A; :.:. ,c:cccc"':.:.:.:.:.'&#x000A; ..:.:"'`::::c:"'..:.:.:.:.:.' http://www.chris.com/ASCII/&#x000A; ...:.'.:.::::"' . . . . .'&#x000A; .. . ....:."' ` . . . ''&#x000A; . . . ...."'&#x000A; .. . ."' -hrr-&#x000A; .&#x000A;&#x000A;&#x000A; It's a planet!&#x000A;%strong This shouldn't be bold!&#x000A;
78
- </pre>
76
+ <pre> ___&#x000A; ,o88888&#x000A; ,o8888888'&#x000A; ,:o:o:oooo. ,8O88Pd8888"&#x000A; ,.::.::o:ooooOoOoO. ,oO8O8Pd888'"&#x000A; ,.:.::o:ooOoOoOO8O8OOo.8OOPd8O8O"&#x000A; , ..:.::o:ooOoOOOO8OOOOo.FdO8O8"&#x000A; , ..:.::o:ooOoOO8O888O8O,COCOO"&#x000A; , . ..:.::o:ooOoOOOO8OOOOCOCO"&#x000A; . ..:.::o:ooOoOoOO8O8OCCCC"o&#x000A; . ..:.::o:ooooOoCoCCC"o:o&#x000A; . ..:.::o:o:,cooooCo"oo:o:&#x000A; ` . . ..:.:cocoooo"'o:o:::'&#x000A; .` . ..::ccccoc"'o:o:o:::'&#x000A; :.:. ,c:cccc"':.:.:.:.:.'&#x000A; ..:.:"'`::::c:"'..:.:.:.:.:.' http://www.chris.com/ASCII/&#x000A; ...:.'.:.::::"' . . . . .'&#x000A; .. . ....:."' ` . . . ''&#x000A; . . . ...."'&#x000A; .. . ."' -hrr-&#x000A; .&#x000A;&#x000A;&#x000A; It's a planet!&#x000A;%strong This shouldn't be bold!</pre>
79
77
  <strong>This should!</strong>
80
- <textarea>
81
- ___ ___ ___ ___ &#x000A; /\__\ /\ \ /\__\ /\__\&#x000A; /:/ / /::\ \ /::| | /:/ /&#x000A; /:/__/ /:/\:\ \ /:|:| | /:/ / &#x000A; /::\ \ ___ /::\~\:\ \ /:/|:|__|__ /:/ / &#x000A; /:/\:\ /\__\ /:/\:\ \:\__\ /:/ |::::\__\ /:/__/ &#x000A; \/__\:\/:/ / \/__\:\/:/ / \/__/~~/:/ / \:\ \ &#x000A; \::/ / \::/ / /:/ / \:\ \ &#x000A; /:/ / /:/ / /:/ / \:\ \ &#x000A; /:/ / /:/ / /:/ / \:\__\&#x000A; \/__/ \/__/ \/__/ \/__/&#x000A;&#x000A; Many&#x000A; thanks&#x000A; to&#x000A; http://www.network-science.de/ascii/&#x000A;
82
- <strong>indeed!</strong>
83
- </textarea>
78
+ <textarea> ___ ___ ___ ___ &#x000A; /\__\ /\ \ /\__\ /\__\&#x000A; /:/ / /::\ \ /::| | /:/ /&#x000A; /:/__/ /:/\:\ \ /:|:| | /:/ / &#x000A; /::\ \ ___ /::\~\:\ \ /:/|:|__|__ /:/ / &#x000A; /:/\:\ /\__\ /:/\:\ \:\__\ /:/ |::::\__\ /:/__/ &#x000A; \/__\:\/:/ / \/__\:\/:/ / \/__/~~/:/ / \:\ \ &#x000A; \::/ / \::/ / /:/ / \:\ \ &#x000A; /:/ / /:/ / /:/ / \:\ \ &#x000A; /:/ / /:/ / /:/ / \:\__\&#x000A; \/__/ \/__/ \/__/ \/__/&#x000A;&#x000A; Many&#x000A; thanks&#x000A; to&#x000A; http://www.network-science.de/ascii/
79
+ <strong>indeed!</strong></textarea>
84
80
  </div>
85
81
  <div class='foo'>
86
82
  13
87
83
  </div>
88
- <pre>
89
- __ ______ __ ______&#x000A;.----.| |--.|__ |.----.| |--..--------.| __ |&#x000A;| __|| ||__ || __|| < | || __ |&#x000A;|____||__|__||______||____||__|__||__|__|__||______|&#x000A;
90
- </pre>
91
- <pre>
92
- foo&#x000A;
93
- bar
94
- </pre>
84
+ <pre> __ ______ __ ______&#x000A;.----.| |--.|__ |.----.| |--..--------.| __ |&#x000A;| __|| ||__ || __|| < | || __ |&#x000A;|____||__|__||______||____||__|__||__|__|__||______|</pre>
85
+ <pre>foo
86
+ bar</pre>
@@ -1,19 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- require 'test/unit'
4
- require 'rubygems'
5
- require 'action_pack'
6
-
7
- require File.dirname(__FILE__) + '/../../lib/haml'
2
+ require File.dirname(__FILE__) + '/test_helper'
8
3
  require 'haml/template'
9
4
  require File.dirname(__FILE__) + '/mocks/article'
10
5
 
11
- class TestFilter
12
- def initialize(text)
13
- @text = text
14
- end
15
6
 
16
- def render
7
+ module Haml::Filters::Test
8
+ include Haml::Filters::Base
9
+
10
+ def render(text)
17
11
  "TESTING HAHAHAHA!"
18
12
  end
19
13
  end
@@ -22,10 +16,9 @@ class TemplateTest < Test::Unit::TestCase
22
16
  @@templates = %w{ very_basic standard helpers
23
17
  whitespace_handling original_engine list helpful
24
18
  silent_script tag_parsing just_stuff partials
25
- filters }
19
+ filters nuke_outer_whitespace nuke_inner_whitespace }
26
20
 
27
21
  def setup
28
- Haml::Template.options = { :filters => { 'test'=>TestFilter } }
29
22
  @base = ActionView::Base.new(File.dirname(__FILE__) + "/templates/", {'article' => Article.new, 'foo' => 'value one'})
30
23
  @base.send(:evaluate_assigns)
31
24
 
@@ -76,7 +69,7 @@ class TemplateTest < Test::Unit::TestCase
76
69
  def test_templates_should_render_correctly_with_render_proc
77
70
  @@templates.each do |template|
78
71
  assert_renders_correctly(template) do |name|
79
- engine = Haml::Engine.new(File.read(File.dirname(__FILE__) + "/templates/#{name}.haml"), :filters => { 'test'=>TestFilter })
72
+ engine = Haml::Engine.new(File.read(File.dirname(__FILE__) + "/templates/#{name}.haml"))
80
73
  engine.render_proc(@base).call
81
74
  end
82
75
  end
@@ -87,7 +80,7 @@ class TemplateTest < Test::Unit::TestCase
87
80
  assert_renders_correctly(template) do |name|
88
81
  method = "render_haml_" + name.gsub(/[^a-zA-Z0-9]/, '_')
89
82
 
90
- engine = Haml::Engine.new(File.read(File.dirname(__FILE__) + "/templates/#{name}.haml"), :filters => { 'test'=>TestFilter })
83
+ engine = Haml::Engine.new(File.read(File.dirname(__FILE__) + "/templates/#{name}.haml"))
91
84
  engine.def_method(@base, method)
92
85
  @base.send(method)
93
86
  end
@@ -2,6 +2,7 @@
2
2
  @foo =
3
3
  = @foo
4
4
  - @foo = 'value three'
5
+ == Toplevel? #{haml_buffer.toplevel?}
5
6
  %p
6
7
  @foo =
7
8
  = @foo
@@ -1,9 +1,10 @@
1
1
  %style
2
+ - width = 5 + 17
2
3
  :sass
3
4
  p
4
5
  :border
5
6
  :style dotted
6
- :width 10px
7
+ :width #{width}px
7
8
  :color #ff00ff
8
9
  h1
9
10
  :font-weight normal
@@ -29,17 +30,51 @@
29
30
 
30
31
  _pretty much the same as above_
31
32
 
33
+ %p
34
+ :javascript
35
+ function newline(str) {
36
+ return "\n" + str;
37
+ }
38
+
32
39
  :plain
33
40
  This
34
41
  Is
35
42
  Plain
36
43
  Text
37
44
  %strong right?
45
+ \#{not interpolated}
46
+ \\#{1 + 2}
47
+ \\\#{also not}
48
+ \\
49
+
50
+ - last = "noitalo"
51
+ %p
52
+ %pre
53
+ :preserve
54
+ This pre is pretty deeply
55
+ nested.
56
+ Does #{"interp" + last.reverse} work?
57
+ :preserve
58
+ This one is, too.
59
+ Nested, that is.
60
+
61
+ - num = 10
62
+ %ul
63
+ :erb
64
+ <% num.times do |c| %>
65
+ <li><%= (c+97).chr %></li>
66
+ <% end %>
67
+ <% res = 178 %>
38
68
 
39
- :erb
40
- <% 10.times do |c| %>
41
- <%= (c+97).chr %>
42
- <% end %>
69
+ .res= res
70
+
71
+ %p
72
+ :textile
73
+ I like preserved text:
74
+
75
+ Foo
76
+ #{"Bar"}!
77
+ Baz
43
78
 
44
79
  :markdown
45
80
  * Foo
@@ -48,6 +83,12 @@
48
83
 
49
84
  = "Text!"
50
85
 
86
+ - var = "Hello"
51
87
  :ruby
52
- puts "Hello, World!"
53
- puts "How are you doing today?"
88
+ printf "%s, World!\n", var
89
+ print "How are you doing today?\n"
90
+
91
+ :escaped
92
+ <div class="foo">
93
+ <p>I think &mdash; or do I?</p>
94
+ </div>
@@ -31,7 +31,6 @@
31
31
  \%p foo
32
32
  \yee\ha
33
33
  / Short comment
34
- / This is a really long comment look how long it is it should be on a line of its own don't you think?
35
34
  /
36
35
  This is a block comment
37
36
  cool, huh?
@@ -75,4 +74,4 @@
75
74
  %p.qux{:class => 'quux'}[@article] Blump
76
75
  == #{"Woah inner quotes"}
77
76
  %p.dynamic_quote{:quotes => "single '", :dyn => 1 + 2}
78
- %p.dynamic_atomic{:dyn => 1 + 2}/
77
+ %p.dynamic_self_closing{:dyn => 1 + 2}/
@@ -0,0 +1,26 @@
1
+ %p
2
+ %q< Foo
3
+ %p
4
+ %q{:a => 1 + 1}< Foo
5
+ %p
6
+ %q<= "Foo\nBar"
7
+ %p
8
+ %q{:a => 1 + 1}<= "Foo\nBar"
9
+ %p
10
+ %q<
11
+ Foo
12
+ Bar
13
+ %p
14
+ %q{:a => 1 + 1}<
15
+ Foo
16
+ Bar
17
+ %p
18
+ %q<
19
+ %div
20
+ Foo
21
+ Bar
22
+ %p
23
+ %q{:a => 1 + 1}<
24
+ %div
25
+ Foo
26
+ Bar
@@ -0,0 +1,144 @@
1
+ %p
2
+ %p
3
+ %q>
4
+ Foo
5
+ %p
6
+ %p
7
+ %q{:a => 1 + 1}>
8
+ Foo
9
+ %p
10
+ %p
11
+ %q> Foo
12
+ %p
13
+ %p
14
+ %q{:a => 1 + 1}> Foo
15
+ %p
16
+ %p
17
+ %q>
18
+ = "Foo"
19
+ %p
20
+ %p
21
+ %q{:a => 1 + 1}>
22
+ = "Foo"
23
+ %p
24
+ %p
25
+ %q>= "Foo"
26
+ %p
27
+ %p
28
+ %q{:a => 1 + 1}>= "Foo"
29
+ %p
30
+ %p
31
+ %q>
32
+ = "Foo\nBar"
33
+ %p
34
+ %p
35
+ %q{:a => 1 + 1}>
36
+ = "Foo\nBar"
37
+ %p
38
+ %p
39
+ %q>= "Foo\nBar"
40
+ %p
41
+ %p
42
+ %q{:a => 1 + 1}>= "Foo\nBar"
43
+ %p
44
+ %p
45
+ - tab_up
46
+ foo
47
+ %q>
48
+ Foo
49
+ bar
50
+ - tab_down
51
+ %p
52
+ %p
53
+ - tab_up
54
+ foo
55
+ %q{:a => 1 + 1}>
56
+ Foo
57
+ bar
58
+ - tab_down
59
+ %p
60
+ %p
61
+ - tab_up
62
+ foo
63
+ %q> Foo
64
+ bar
65
+ - tab_down
66
+ %p
67
+ %p
68
+ - tab_up
69
+ foo
70
+ %q{:a => 1 + 1}> Foo
71
+ bar
72
+ - tab_down
73
+ %p
74
+ %p
75
+ - tab_up
76
+ foo
77
+ %q>
78
+ = "Foo"
79
+ bar
80
+ - tab_down
81
+ %p
82
+ %p
83
+ - tab_up
84
+ foo
85
+ %q{:a => 1 + 1}>
86
+ = "Foo"
87
+ bar
88
+ - tab_down
89
+ %p
90
+ %p
91
+ - tab_up
92
+ foo
93
+ %q>= "Foo"
94
+ bar
95
+ - tab_down
96
+ %p
97
+ %p
98
+ - tab_up
99
+ foo
100
+ %q{:a => 1 + 1}>= "Foo"
101
+ bar
102
+ - tab_down
103
+ %p
104
+ %p
105
+ - tab_up
106
+ foo
107
+ %q>
108
+ = "Foo\nBar"
109
+ bar
110
+ - tab_down
111
+ %p
112
+ %p
113
+ - tab_up
114
+ foo
115
+ %q{:a => 1 + 1}>
116
+ = "Foo\nBar"
117
+ bar
118
+ - tab_down
119
+ %p
120
+ %p
121
+ - tab_up
122
+ foo
123
+ %q>= "Foo\nBar"
124
+ bar
125
+ - tab_down
126
+ %p
127
+ %p
128
+ - tab_up
129
+ foo
130
+ %q{:a => 1 + 1}>= "Foo\nBar"
131
+ bar
132
+ - tab_down
133
+ %p
134
+ %p
135
+ %q>
136
+ %p
137
+ %p
138
+ %q>/
139
+ %p
140
+ %p
141
+ %q{:a => 1 + 1}>
142
+ %p
143
+ %p
144
+ %q{:a => 1 + 1}>/