faml 0.2.0

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.
Files changed (140) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +27 -0
  6. data/Appraisals +26 -0
  7. data/CHANGELOG.md +47 -0
  8. data/Gemfile +8 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +115 -0
  11. data/Rakefile +28 -0
  12. data/benchmark/attribute_builder.haml +5 -0
  13. data/benchmark/rendering.rb +35 -0
  14. data/bin/faml +4 -0
  15. data/ext/attribute_builder/attribute_builder.c +261 -0
  16. data/ext/attribute_builder/extconf.rb +3 -0
  17. data/faml.gemspec +38 -0
  18. data/gemfiles/rails_4.0.gemfile +9 -0
  19. data/gemfiles/rails_4.1.gemfile +9 -0
  20. data/gemfiles/rails_4.2.gemfile +9 -0
  21. data/gemfiles/rails_edge.gemfile +10 -0
  22. data/haml_spec_test.rb +22 -0
  23. data/lib/faml.rb +10 -0
  24. data/lib/faml/ast.rb +112 -0
  25. data/lib/faml/cli.rb +38 -0
  26. data/lib/faml/compiler.rb +374 -0
  27. data/lib/faml/element_parser.rb +235 -0
  28. data/lib/faml/engine.rb +34 -0
  29. data/lib/faml/filter_compilers.rb +41 -0
  30. data/lib/faml/filter_compilers/base.rb +43 -0
  31. data/lib/faml/filter_compilers/cdata.rb +15 -0
  32. data/lib/faml/filter_compilers/coffee.rb +16 -0
  33. data/lib/faml/filter_compilers/css.rb +16 -0
  34. data/lib/faml/filter_compilers/escaped.rb +23 -0
  35. data/lib/faml/filter_compilers/javascript.rb +16 -0
  36. data/lib/faml/filter_compilers/markdown.rb +18 -0
  37. data/lib/faml/filter_compilers/plain.rb +15 -0
  38. data/lib/faml/filter_compilers/preserve.rb +26 -0
  39. data/lib/faml/filter_compilers/ruby.rb +17 -0
  40. data/lib/faml/filter_compilers/sass.rb +15 -0
  41. data/lib/faml/filter_compilers/scss.rb +16 -0
  42. data/lib/faml/filter_compilers/tilt_base.rb +34 -0
  43. data/lib/faml/filter_parser.rb +54 -0
  44. data/lib/faml/html.rb +58 -0
  45. data/lib/faml/indent_tracker.rb +84 -0
  46. data/lib/faml/line_parser.rb +66 -0
  47. data/lib/faml/newline.rb +30 -0
  48. data/lib/faml/parser.rb +211 -0
  49. data/lib/faml/parser_utils.rb +17 -0
  50. data/lib/faml/rails_handler.rb +10 -0
  51. data/lib/faml/railtie.rb +9 -0
  52. data/lib/faml/ruby_multiline.rb +23 -0
  53. data/lib/faml/script_parser.rb +84 -0
  54. data/lib/faml/static_hash_parser.rb +113 -0
  55. data/lib/faml/syntax_error.rb +10 -0
  56. data/lib/faml/text_compiler.rb +69 -0
  57. data/lib/faml/tilt.rb +17 -0
  58. data/lib/faml/version.rb +3 -0
  59. data/spec/compiler_newline_spec.rb +162 -0
  60. data/spec/rails/Rakefile +6 -0
  61. data/spec/rails/app/assets/images/.keep +0 -0
  62. data/spec/rails/app/assets/javascripts/application.js +13 -0
  63. data/spec/rails/app/assets/stylesheets/application.css +15 -0
  64. data/spec/rails/app/controllers/application_controller.rb +5 -0
  65. data/spec/rails/app/controllers/books_controller.rb +8 -0
  66. data/spec/rails/app/controllers/concerns/.keep +0 -0
  67. data/spec/rails/app/helpers/application_helper.rb +2 -0
  68. data/spec/rails/app/mailers/.keep +0 -0
  69. data/spec/rails/app/models/.keep +0 -0
  70. data/spec/rails/app/models/book.rb +9 -0
  71. data/spec/rails/app/models/concerns/.keep +0 -0
  72. data/spec/rails/app/views/books/hello.html.haml +2 -0
  73. data/spec/rails/app/views/books/with_capture.html.haml +4 -0
  74. data/spec/rails/app/views/books/with_variables.html.haml +4 -0
  75. data/spec/rails/app/views/layouts/application.html.haml +9 -0
  76. data/spec/rails/bin/bundle +3 -0
  77. data/spec/rails/bin/rails +4 -0
  78. data/spec/rails/bin/rake +4 -0
  79. data/spec/rails/bin/setup +29 -0
  80. data/spec/rails/config.ru +4 -0
  81. data/spec/rails/config/application.rb +12 -0
  82. data/spec/rails/config/boot.rb +3 -0
  83. data/spec/rails/config/database.yml +25 -0
  84. data/spec/rails/config/environment.rb +5 -0
  85. data/spec/rails/config/environments/development.rb +41 -0
  86. data/spec/rails/config/environments/production.rb +79 -0
  87. data/spec/rails/config/environments/test.rb +42 -0
  88. data/spec/rails/config/initializers/assets.rb +11 -0
  89. data/spec/rails/config/initializers/backtrace_silencers.rb +7 -0
  90. data/spec/rails/config/initializers/cookies_serializer.rb +3 -0
  91. data/spec/rails/config/initializers/filter_parameter_logging.rb +4 -0
  92. data/spec/rails/config/initializers/inflections.rb +16 -0
  93. data/spec/rails/config/initializers/mime_types.rb +4 -0
  94. data/spec/rails/config/initializers/secret_key_base.rb +6 -0
  95. data/spec/rails/config/initializers/session_store.rb +3 -0
  96. data/spec/rails/config/initializers/wrap_parameters.rb +14 -0
  97. data/spec/rails/config/locales/en.yml +23 -0
  98. data/spec/rails/config/routes.rb +7 -0
  99. data/spec/rails/config/secrets.yml +22 -0
  100. data/spec/rails/db/seeds.rb +7 -0
  101. data/spec/rails/lib/assets/.keep +0 -0
  102. data/spec/rails/lib/tasks/.keep +0 -0
  103. data/spec/rails/log/.keep +0 -0
  104. data/spec/rails/public/404.html +67 -0
  105. data/spec/rails/public/422.html +67 -0
  106. data/spec/rails/public/500.html +66 -0
  107. data/spec/rails/public/favicon.ico +0 -0
  108. data/spec/rails/public/robots.txt +5 -0
  109. data/spec/rails/spec/requests/faml_spec.rb +41 -0
  110. data/spec/rails/vendor/assets/javascripts/.keep +0 -0
  111. data/spec/rails/vendor/assets/stylesheets/.keep +0 -0
  112. data/spec/rails_helper.rb +4 -0
  113. data/spec/render/attribute_spec.rb +241 -0
  114. data/spec/render/comment_spec.rb +61 -0
  115. data/spec/render/doctype_spec.rb +57 -0
  116. data/spec/render/element_spec.rb +136 -0
  117. data/spec/render/filters/cdata_spec.rb +12 -0
  118. data/spec/render/filters/coffee_spec.rb +25 -0
  119. data/spec/render/filters/css_spec.rb +45 -0
  120. data/spec/render/filters/escaped_spec.rb +14 -0
  121. data/spec/render/filters/javascript_spec.rb +44 -0
  122. data/spec/render/filters/markdown_spec.rb +19 -0
  123. data/spec/render/filters/plain_spec.rb +24 -0
  124. data/spec/render/filters/preserve_spec.rb +24 -0
  125. data/spec/render/filters/ruby_spec.rb +13 -0
  126. data/spec/render/filters/sass_spec.rb +28 -0
  127. data/spec/render/filters/scss_spec.rb +32 -0
  128. data/spec/render/filters_spec.rb +11 -0
  129. data/spec/render/haml_comment_spec.rb +24 -0
  130. data/spec/render/multiline_spec.rb +39 -0
  131. data/spec/render/newline_spec.rb +83 -0
  132. data/spec/render/plain_spec.rb +20 -0
  133. data/spec/render/preserve_spec.rb +8 -0
  134. data/spec/render/sanitize_spec.rb +36 -0
  135. data/spec/render/script_spec.rb +81 -0
  136. data/spec/render/silent_script_spec.rb +97 -0
  137. data/spec/render/unescape_spec.rb +45 -0
  138. data/spec/spec_helper.rb +47 -0
  139. data/spec/tilt_spec.rb +33 -0
  140. metadata +489 -0
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Element rendering', type: :render do
4
+ it 'parses one-line element' do
5
+ expect(render_string('%span hello')).to eq("<span>hello</span>\n")
6
+ end
7
+
8
+ it 'parses multi-line element' do
9
+ expect(render_string(<<HAML)).to eq("<span>\nhello\n</span>\n")
10
+ %span
11
+ hello
12
+ HAML
13
+ end
14
+
15
+ it 'parses nested elements' do
16
+ expect(render_string(<<HAML)).to eq("<span>\n<b>\nhello\n</b>\n<i>\n<small>world</small>\n</i>\n</span>\n")
17
+ %span
18
+ %b
19
+ hello
20
+ %i
21
+ %small world
22
+ HAML
23
+ end
24
+
25
+ it 'parses multi-line texts' do
26
+ expect(render_string(<<HAML)).to eq("<span>\n<b>\nhello\nworld\n</b>\n</span>\n")
27
+ %span
28
+ %b
29
+ hello
30
+ world
31
+ HAML
32
+ end
33
+
34
+ it 'skips empty lines' do
35
+ expect(render_string(<<HAML)).to eq("<span>\n<b>\nhello\n</b>\n</span>\n")
36
+ %span
37
+
38
+ %b
39
+
40
+ hello
41
+
42
+ HAML
43
+ end
44
+
45
+ it 'raises error if indent is wrong' do
46
+ expect { render_string(<<HAML) }.to raise_error(Faml::IndentTracker::IndentMismatch)
47
+ %div
48
+ %div
49
+ %div
50
+ %div
51
+ HAML
52
+ end
53
+
54
+ it 'parses classes' do
55
+ expect(render_string('%span.foo.bar hello')).to eq(%Q{<span class='foo bar'>hello</span>\n})
56
+ end
57
+
58
+ it 'parses id' do
59
+ expect(render_string('%span#foo-bar hello')).to eq(%Q{<span id='foo-bar'>hello</span>\n})
60
+ end
61
+
62
+ it 'parses classes and id' do
63
+ expect(render_string('%span.foo#foo-bar.bar hello')).to eq(%Q{<span class='foo bar' id='foo-bar'>hello</span>\n})
64
+ end
65
+
66
+ it "doesn't skip spaces before attribute list" do
67
+ expect(render_string('%span {hello}')).to eq("<span>{hello}</span>\n")
68
+ expect(render_string('%span (hello)')).to eq("<span>(hello)</span>\n")
69
+ end
70
+
71
+ context 'with invalid tag name' do
72
+ it 'raises error' do
73
+ expect { render_string('%.foo') }.to raise_error(Faml::SyntaxError)
74
+ end
75
+ end
76
+
77
+ it 'parses #' do
78
+ expect(render_string('#main')).to eq(%Q{<div id='main'></div>\n})
79
+ end
80
+
81
+ it 'parses .' do
82
+ expect(render_string('.wrapper.main')).to eq(%Q{<div class='wrapper main'></div>\n})
83
+ end
84
+
85
+ it 'parses Ruby multiline' do
86
+ expect(render_string(<<HAML)).to eq("<div>\n<span>2+3i</span>\n</div>\n")
87
+ %div
88
+ %span= Complex(2,
89
+ 3)
90
+ HAML
91
+ end
92
+
93
+ it 'parses string interpolation' do
94
+ expect(render_string(%q|%span hello <span> #{'</span>'} </span>|)).to eq("<span>hello <span> &lt;/span&gt; </span></span>\n")
95
+ expect(render_string(<<'HAML')).to eq("<span>\nhello <span> &lt;/span&gt; </span>\n</span>\n")
96
+ %span
97
+ hello <span> #{{text: '</span>'}[:text]} </span>
98
+ HAML
99
+ expect(render_string(<<'HAML')).to eq("<span>\nhello <span> &lt;/span&gt; </span>\n</span>\n")
100
+ - @var = '</span>'
101
+ %span
102
+ hello <span> #@var </span>
103
+ HAML
104
+ end
105
+
106
+ it 'parses string interpolation with multibyte characters' do
107
+ expect(render_string(%q|#{'日本語'} にほんご|)).to eq("日本語 にほんご\n")
108
+ end
109
+
110
+ it 'recognized escaped string interpolation' do
111
+ expect(render_string(%q|%p hello \#{1 + 2}|)).to eq("<p>hello \#{1 + 2}</p>\n")
112
+ end
113
+
114
+ it 'parses self-closing tag' do
115
+ expect(render_string('%p/')).to eq("<p>\n")
116
+ end
117
+
118
+ it 'renders some attributes as self-closing by default' do
119
+ expect(render_string('%meta{"http-equiv" => "Content-Type", :content => "text/html"}')).to eq("<meta content='text/html' http-equiv='Content-Type'>\n")
120
+ end
121
+
122
+ it 'parses == syntax' do
123
+ expect(render_string('%p== =#{1+2}hello')).to eq("<p>=3hello</p>\n")
124
+ end
125
+
126
+ it 'raises error if self-closing tag have text' do
127
+ expect { render_string('%p/ hello') }.to raise_error(Faml::SyntaxError)
128
+ end
129
+
130
+ it 'raises error if self-closing tag have children' do
131
+ expect { render_string(<<HAML) }.to raise_error(Faml::SyntaxError)
132
+ %p/
133
+ hello
134
+ HAML
135
+ end
136
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'CDATA filter rendering', type: :render do
4
+ it 'renders CDATA filter' do
5
+ expect(render_string(<<'HAML')).to eq("<![CDATA[\n hello\n world\n <span>hello</span>\n]]>\n")
6
+ :cdata
7
+ hello
8
+ #{'world'}
9
+ <span>hello</span>
10
+ HAML
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'CoffeeScript filter rendering', type: :render do
4
+ it 'renders CoffeeScript filter' do
5
+ html = render_string(<<HAML)
6
+ :coffee
7
+ square = (x) -> x * x
8
+ square(3)
9
+ HAML
10
+ expect(html).to include('<script>')
11
+ expect(html).to include('square = function(x)')
12
+ expect(html).to include('square(3)')
13
+ end
14
+
15
+ it 'parses string interpolation' do
16
+ html = render_string(<<'HAML')
17
+ :coffee
18
+ square = (x) -> x * x
19
+ square(#{1 + 2})
20
+ HAML
21
+ expect(html).to include('<script>')
22
+ expect(html).to include('square = function(x)')
23
+ expect(html).to include('square(3)')
24
+ end
25
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'CSS filter rendering', type: :render do
4
+ it 'renders css filter' do
5
+ expect(render_string(<<HAML)).to eq("<div>\n<style>\n html { font-size: 12px; }\n</style>\n<span>hello</span>\n</div>\n")
6
+ %div
7
+ :css
8
+ html { font-size: 12px; }
9
+ %span hello
10
+ HAML
11
+ end
12
+
13
+ it 'keeps indent' do
14
+ expect(render_string(<<HAML)).to eq("<div>\n<style>\n html {\n font-size: 12px;\n }\n</style>\n<span>hello</span>\n</div>\n")
15
+ %div
16
+ :css
17
+ html {
18
+ font-size: 12px;
19
+ }
20
+ %span hello
21
+ HAML
22
+ end
23
+
24
+ it 'ignores empty filter' do
25
+ expect(render_string(<<HAML)).to eq("<div>\n<span>hello</span>\n</div>\n")
26
+ %div
27
+ :css
28
+ %span hello
29
+ HAML
30
+ end
31
+
32
+ it 'parses string interpolation' do
33
+ expect(render_string(<<'HAML')).to eq("<style>\n html { font-size: 12px; }\n</style>\n")
34
+ :css
35
+ html { font-size: #{10 + 2}px; }
36
+ HAML
37
+ end
38
+
39
+ it "doesn't escape in string interpolation" do
40
+ expect(render_string(<<'HAML')).to eq("<style>\n <span/>\n</style>\n")
41
+ :css
42
+ #{'<span/>'}
43
+ HAML
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Escaped filter rendering', type: :render do
4
+ it' renders escaped filter' do
5
+ expect(render_string(<<'HAML')).to eq("<span>start</span>\nhello\n &lt;p&gt;world&lt;/p&gt;\n&lt;span&gt;hello&lt;/span&gt;\n\n<span>end</span>\n")
6
+ %span start
7
+ :escaped
8
+ hello
9
+ #{'<p>world</p>'}
10
+ <span>hello</span>
11
+ %span end
12
+ HAML
13
+ end
14
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'JavaScript filter rendering', type: :render do
4
+ it 'renders javascript filter' do
5
+ expect(render_string(<<HAML)).to eq("<div>\n<script>\n alert('hello');\n</script>\n<span>world</span>\n</div>\n")
6
+ %div
7
+ :javascript
8
+ alert('hello');
9
+ %span world
10
+ HAML
11
+ end
12
+
13
+ it 'keeps indent' do
14
+ expect(render_string(<<HAML)).to eq("<div>\n<script>\n alert('hello');\n \n alert('world');\n</script>\n</div>\n")
15
+ %div
16
+ :javascript
17
+ alert('hello');
18
+
19
+ alert('world');
20
+ HAML
21
+ end
22
+
23
+ it 'ignores empty filter' do
24
+ expect(render_string(<<HAML)).to eq("<div>\n<span>world</span>\n</div>\n")
25
+ %div
26
+ :javascript
27
+ %span world
28
+ HAML
29
+ end
30
+
31
+ it 'parses string interpolation' do
32
+ expect(render_string(<<'HAML')).to eq("<script>\n var x = 3;\n</script>\n")
33
+ :javascript
34
+ var x = #{1 + 2};
35
+ HAML
36
+ end
37
+
38
+ it "doesn't escape in string interpolation" do
39
+ expect(render_string(<<'HAML')).to eq("<script>\n <span/>\n</script>\n")
40
+ :javascript
41
+ #{'<span/>'}
42
+ HAML
43
+ end
44
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Markdown filter rendering', type: :render do
4
+ it 'renders Markdown filter' do
5
+ expect(render_string(<<HAML)).to eq("<h1>hello</h1>\nworld\n")
6
+ :markdown
7
+ # hello
8
+ world
9
+ HAML
10
+ end
11
+
12
+ it 'parses string interpolation' do
13
+ expect(render_string(<<'HAML')).to eq("<h1>hello</h1>\nworld\n")
14
+ :markdown
15
+ # #{'hello'}
16
+ world
17
+ HAML
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Plain filter rendering', type: :render do
4
+ it 'renders plain filter' do
5
+ expect(render_string(<<HAML)).to eq("<span>\nhello\n<span>world</span>\n</span>\n")
6
+ %span
7
+ :plain
8
+ he#{'llo'}
9
+ %span world
10
+ HAML
11
+ end
12
+
13
+ it 'strips last empty lines' do
14
+ expect(render_string(<<HAML)).to eq("<span>\nhello\n\nabc\n<span>world</span>\n</span>\n")
15
+ %span
16
+ :plain
17
+ he#{'llo'}
18
+
19
+ abc
20
+
21
+ %span world
22
+ HAML
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Preserve filter rendering', type: :render do
4
+ it 'renders preserve filter' do
5
+ expect(render_string(<<'HAML')).to eq("<span>start</span>\nhello&#x000A; <p>wor&#x000A;ld</p>&#x000A;<span>hello</span>\n<span>end</span>\n")
6
+ %span start
7
+ :preserve
8
+ hello
9
+ #{"<p>wor\nld</p>"}
10
+ <span>hello</span>
11
+ %span end
12
+ HAML
13
+ end
14
+
15
+ it 'preserves last empty lines' do
16
+ expect(render_string(<<HAML)).to eq("hello&#x000A;&#x000A;\n<p></p>\n")
17
+ :preserve
18
+ hello
19
+
20
+
21
+ %p
22
+ HAML
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Ruby filter rendering', type: :render do
4
+ it 'renders ruby filter' do
5
+ expect(render_string(<<HAML)).to eq("3\n")
6
+ :ruby
7
+ hash = {
8
+ a: 3,
9
+ }
10
+ = hash[:a]
11
+ HAML
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'SASS filter rendering', type: :render do
4
+ it 'renders SASS filter' do
5
+ html = render_string(<<'HAML')
6
+ :sass
7
+ nav
8
+ ul
9
+ margin: 0
10
+ content: "hello"
11
+ HAML
12
+ expect(html).to include('<style>')
13
+ expect(html).to include('nav ul {')
14
+ expect(html).to include('content: "hello"')
15
+ end
16
+
17
+ it 'parses string interpolation' do
18
+ html = render_string(<<'HAML')
19
+ :sass
20
+ nav
21
+ ul
22
+ margin: #{0 + 5}px
23
+ HAML
24
+ expect(html).to include('<style>')
25
+ expect(html).to include('nav ul {')
26
+ expect(html).to include('margin: 5px')
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'SCSS filter rendering', type: :render do
4
+ it 'renders SCSS filter' do
5
+ html = render_string(<<'HAML')
6
+ :scss
7
+ nav {
8
+ ul {
9
+ margin: 0;
10
+ content: "hello";
11
+ }
12
+ }
13
+ HAML
14
+ expect(html).to include('<style>')
15
+ expect(html).to include('nav ul {')
16
+ expect(html).to include('content: "hello"')
17
+ end
18
+
19
+ it 'parses string interpolation' do
20
+ html = render_string(<<'HAML')
21
+ :scss
22
+ nav {
23
+ ul {
24
+ margin: #{0 + 5}px;
25
+ }
26
+ }
27
+ HAML
28
+ expect(html).to include('<style>')
29
+ expect(html).to include('nav ul {')
30
+ expect(html).to include('margin: 5px')
31
+ end
32
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'filter rendering', type: :render do
4
+ it 'raises error if invalid filter name is given' do
5
+ expect { render_string(':filter with spaces') }.to raise_error(Faml::SyntaxError)
6
+ end
7
+
8
+ it 'raises error if unregistered filter name is given' do
9
+ expect { render_string(':eagletmt') }.to raise_error(Faml::FilterCompilers::NotFound)
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Haml comment rendering', type: :render do
4
+ it 'renders nothing' do
5
+ expect(render_string(<<HAML)).to eq("<div>\n<p>hello</p>\n<p>world</p>\n</div>\n")
6
+ %div
7
+ %p hello
8
+ -# this
9
+ should
10
+ not
11
+ be rendered
12
+ %p world
13
+ HAML
14
+ end
15
+
16
+ it 'parses empty comment' do
17
+ expect(render_string(<<HAML)).to eq("<div>\n<p>hello</p>\n<p>world</p>\n</div>\n")
18
+ %div
19
+ %p hello
20
+ -#
21
+ %p world
22
+ HAML
23
+ end
24
+ end