hamlit 1.5.3 → 1.5.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b37fdbe2260e2bb676c56133ab5c61fb5064900
4
- data.tar.gz: ae2188f3122c3a02bff15888f0d9891368bd388b
3
+ metadata.gz: 48cbd681aed1b48f72d46f0256620e5d6d358445
4
+ data.tar.gz: 804f4570f39a8d92091157197dd26791c908dfd6
5
5
  SHA512:
6
- metadata.gz: 5ae27755753ed242c704eac31eb066f702f2383b12851fda96accbcc2a20b3887a0c12f87a73fe45154f152e744f8248137dd8930ab2b78db660347544dea17e
7
- data.tar.gz: 00af5e2645cf488be39c75708d70e2f14fb23c6f6778b38d74ce82a4d4931e2e010506b53868a260f80ab91a57ec36a36a3a3d28f3439f3b07b6c508d74eae09
6
+ metadata.gz: 79e74c4d9128dda022f1275ef9adbd1f0f90733b0f0223e836a8985dac426a29620563602d3ccda345296b1ee251da0c92cd0c93c96d6af091eb6b64a844a0b8
7
+ data.tar.gz: 8567ec9a0f5984c122cfa99d14c8afbf7b55cf29be98f5439d50fd92f169d4200ee2cb3c398802f7c7a21c919c06dce822d3586e1dd7d8135979bcef539796bf
@@ -1,3 +1,8 @@
1
+ ## v1.5.4
2
+
3
+ - Recursively remove whitespace inside a tag
4
+ - Fix ! operator immediately before whitespace
5
+
1
6
  ## v1.5.3
2
7
 
3
8
  - Support !, !=, !==, &= and ~ as inline operators
@@ -1,30 +1,18 @@
1
+ require 'hamlit/concerns/whitespace'
2
+
1
3
  # This module is created to compile [:haml, :strip],
2
4
  # which is sexp for whitespace inner removal.module Hamlit
3
5
  module Hamlit
4
6
  module Compilers
5
7
  module Strip
6
- def on_haml_strip(*exps)
7
- stripped = strip_newline(exps)
8
- on_multi(*stripped)
9
- end
10
-
11
- private
8
+ include Concerns::Whitespace
12
9
 
13
- def strip_newline(content)
14
- indexes = newline_indexes(content)
15
-
16
- content = content.dup
17
- content.delete_at(indexes.last)
18
- content.delete_at(indexes.first)
19
- content
20
- end
10
+ def on_haml_strip(*exps)
11
+ exps = exps.dup
12
+ remove_first_space!(exps)
13
+ remove_last_space!(exps)
21
14
 
22
- def newline_indexes(exps)
23
- indexes = []
24
- exps.each_with_index do |exp, index|
25
- indexes << index if exp == [:static, "\n"]
26
- end
27
- indexes
15
+ on_multi(*exps)
28
16
  end
29
17
  end
30
18
  end
@@ -1,9 +1,11 @@
1
1
  require 'set'
2
2
 
3
- # Hamlit::Parsers::Whitespace cares about "whitespace removal",
3
+ # Hamlit::Concerns::Whitespace cares about "whitespace removal",
4
4
  # which is achieved by '<' or '>' after html tag.
5
+ # NOTE: Whitespace means [:static, "\n"] because it is rendered
6
+ # as whitespace on browsers.
5
7
  module Hamlit
6
- module Parsers
8
+ module Concerns
7
9
  module Whitespace
8
10
  def parse_whitespace_removal(scanner)
9
11
  if scanner.match?(/</)
@@ -16,20 +18,11 @@ module Hamlit
16
18
  inner_removal
17
19
  end
18
20
 
19
- def remove_last_outer_space!(exps)
20
- exps.reverse!
21
- remove_first_outer_space!(exps)
22
- ensure
23
- exps.reverse!
24
- end
25
-
26
- private
27
-
28
- def remove_first_outer_space!(exps)
21
+ # `<` removes spaces inside script or silent script recursively.
22
+ def remove_first_space!(exps)
29
23
  deleted = false
30
- exps.delete_if do |exp|
31
- break if deleted
32
24
 
25
+ exps.delete_if do |exp|
33
26
  name, *args = exp
34
27
  case name
35
28
  when :static
@@ -41,13 +34,30 @@ module Hamlit
41
34
  when :newline
42
35
  next false
43
36
  when :haml
44
- remove_last_outer_space!(exp) if args.first == :script
37
+ # recursive call for script
38
+ remove_last_space!(exp) if args.first == :script
39
+ when :multi
40
+ break if exp == :multi
41
+ # to flatten multi
42
+ remove_last_space!(exp)
45
43
  end
46
44
  break
47
45
  end
48
- remove_last_outer_space!(exps) if deleted
46
+
47
+ # recursive call for silent script
48
+ remove_last_space!(exps) if deleted
49
+ end
50
+
51
+ def remove_last_space!(exps)
52
+ exps.reverse!
53
+ remove_first_space!(exps)
54
+ ensure
55
+ exps.reverse!
56
+ exps
49
57
  end
50
58
 
59
+ private
60
+
51
61
  def reset_outer_removal
52
62
  @outer_removal = Set.new
53
63
  @tag_indent = 0
@@ -8,7 +8,6 @@ require 'hamlit/parsers/multiline'
8
8
  require 'hamlit/parsers/script'
9
9
  require 'hamlit/parsers/tag'
10
10
  require 'hamlit/parsers/text'
11
- require 'hamlit/parsers/whitespace'
12
11
 
13
12
  module Hamlit
14
13
  class Parser < Temple::Parser
@@ -20,7 +19,6 @@ module Hamlit
20
19
  include Parsers::Script
21
20
  include Parsers::Tag
22
21
  include Parsers::Text
23
- include Parsers::Whitespace
24
22
 
25
23
  SKIP_NEWLINE_EXPS = %i[newline code multi].freeze
26
24
  SKIP_NEWLINE_FILTERS = %w[ruby markdown erb].freeze
@@ -56,7 +54,7 @@ module Hamlit
56
54
 
57
55
  @current_lineno += 1
58
56
  node = parse_line(current_line)
59
- remove_last_outer_space!(ast) if outer_remove?
57
+ remove_last_space!(ast) if outer_remove?
60
58
 
61
59
  ast << [:newline] if @current_indent > 0
62
60
  ast << node
@@ -104,7 +102,7 @@ module Hamlit
104
102
  return parse_text(scanner, lstrip: true, escape: false) if scanner.scan(/!( |==)/)
105
103
  return parse_script(scanner, force_escape: true) if scanner.match?(/&=/)
106
104
  return parse_script(scanner, disable_escape: true) if scanner.match?(/!=/)
107
- return parse_text(scanner, lstrip: true, escape: false) if inline && scanner.scan(/!/)
105
+ return parse_text(scanner, lstrip: true, escape: false) if scanner.scan(/!/)
108
106
 
109
107
  case scanner.peek(1)
110
108
  when '=', '~'
@@ -1,5 +1,6 @@
1
1
  require 'hamlit/concerns/error'
2
2
  require 'hamlit/concerns/indentable'
3
+ require 'hamlit/concerns/whitespace'
3
4
  require 'hamlit/helpers'
4
5
 
5
6
  module Hamlit
@@ -7,6 +8,7 @@ module Hamlit
7
8
  module Tag
8
9
  include Concerns::Error
9
10
  include Concerns::Indentable
11
+ include Concerns::Whitespace
10
12
 
11
13
  TAG_ID_CLASS_REGEXP = /[a-zA-Z0-9_-]+/
12
14
  TAG_REGEXP = /[a-zA-Z0-9\-_:]+/
@@ -1,3 +1,3 @@
1
1
  module Hamlit
2
- VERSION = "1.5.3"
2
+ VERSION = "1.5.4"
3
3
  end
data/release ADDED
@@ -0,0 +1,6 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ source ./test
6
+ bundle exec rake release
@@ -9,7 +9,7 @@ describe Hamlit::Engine do
9
9
  end
10
10
 
11
11
  it 'renders xml doctype' do
12
- assert_render(<<-HAML, <<-HTML)
12
+ assert_render(<<-HAML, <<-HTML, format: :xhtml)
13
13
  !!! XML
14
14
  HAML
15
15
  <?xml version='1.0' encoding='utf-8' ?>
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Engine do
2
2
  describe 'tab indent' do
3
3
  it 'accepts tab indentation' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
5
5
  %p
6
6
  \t%a
7
7
  HAML
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Engine do
2
2
  describe 'multiline' do
3
3
  it 'joins multi-lines ending with pipe' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: [])
5
5
  a |
6
6
  b |
7
7
  HAML
@@ -18,7 +18,7 @@ describe Hamlit::Engine do
18
18
 
19
19
  describe 'html escape' do
20
20
  it 'escapes attribute values on static attributes' do
21
- assert_render(<<-'HAML', <<-HTML)
21
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :faml)
22
22
  %a(title="'")
23
23
  %a(title = "'\"")
24
24
  %a(href='/search?foo=bar&hoge=<fuga>')
@@ -30,7 +30,7 @@ describe Hamlit::Engine do
30
30
  end
31
31
 
32
32
  it 'escapes attribute values on dynamic attributes' do
33
- assert_render(<<-'HAML', <<-HTML)
33
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :faml)
34
34
  - title = "'\""
35
35
  - href = '/search?foo=bar&hoge=<fuga>'
36
36
  %a(title=title)
@@ -41,7 +41,7 @@ describe Hamlit::Engine do
41
41
  end
42
42
 
43
43
  it 'accepts even illegal input for haml' do
44
- assert_render(<<-'HAML', <<-HTML)
44
+ assert_render(<<-'HAML', <<-HTML, error_with: [:haml, :faml])
45
45
  %span{ class: '}}}', id: '{}}' } }{
46
46
  HAML
47
47
  <span class='}}}' id='{}}'>}{</span>
@@ -122,7 +122,7 @@ describe Hamlit::Engine do
122
122
  end
123
123
 
124
124
  it 'joins attribute class and element class' do
125
- assert_render(<<-HAML, <<-HTML)
125
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
126
126
  .foo{ class: ['bar'] }
127
127
  .foo{ class: ['bar', nil] }
128
128
  .foo{ class: ['bar', 'baz'] }
@@ -198,8 +198,9 @@ describe Hamlit::Engine do
198
198
  HTML
199
199
  end
200
200
 
201
- it 'does not delete some attributes, for optimization' do
202
- assert_render(<<-'HAML', <<-HTML)
201
+ # NOTE: This incompatibility will not be fixed for performance.
202
+ it 'does not delete non-boolean attributes, for optimization' do
203
+ assert_render(<<-'HAML', <<-HTML, compatible_only: []) # wontfix
203
204
  - val = false
204
205
  %a{ href: val }
205
206
  - val = nil
@@ -213,7 +214,7 @@ describe Hamlit::Engine do
213
214
 
214
215
  describe 'html escape' do
215
216
  it 'escapes attribute values on static attributes' do
216
- assert_render(<<-'HAML', <<-HTML)
217
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :faml)
217
218
  %a{title: "'"}
218
219
  %a{title: "'\""}
219
220
  %a{href: '/search?foo=bar&hoge=<fuga>'}
@@ -225,7 +226,7 @@ describe Hamlit::Engine do
225
226
  end
226
227
 
227
228
  it 'escapes attribute values on dynamic attributes' do
228
- assert_render(<<-'HAML', <<-HTML)
229
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :faml)
229
230
  - title = "'\""
230
231
  - href = '/search?foo=bar&hoge=<fuga>'
231
232
  %a{title: title}
@@ -237,7 +238,7 @@ describe Hamlit::Engine do
237
238
  end
238
239
 
239
240
  it 'escapes attribute values on hash attributes' do
240
- assert_render(<<-'HAML', <<-HTML)
241
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :faml)
241
242
  - title = { title: "'\"" }
242
243
  - href = { href: '/search?foo=bar&hoge=<fuga>' }
243
244
  %a{ title }
@@ -260,7 +261,7 @@ describe Hamlit::Engine do
260
261
  end
261
262
 
262
263
  it 'renders true attributes' do
263
- assert_render(<<-'HAML', <<-HTML)
264
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml)
264
265
  %span{ data: { disable: true } } bar
265
266
  HAML
266
267
  <span data-disable>bar</span>
@@ -39,7 +39,7 @@ describe Hamlit::Engine do
39
39
  end
40
40
 
41
41
  it 'renders block script' do
42
- assert_render(<<-HAML, <<-HTML)
42
+ assert_render(<<-HAML, <<-HTML, compatible_only: [])
43
43
  = 3.times do |i|
44
44
  = i
45
45
  4
@@ -53,7 +53,7 @@ describe Hamlit::Engine do
53
53
  end
54
54
 
55
55
  it 'renders tag internal block script' do
56
- assert_render(<<-HAML, <<-HTML)
56
+ assert_render(<<-HAML, <<-HTML, compatible_only: [])
57
57
  %span
58
58
  = 1.times do |i|
59
59
  = i
@@ -85,7 +85,7 @@ describe Hamlit::Engine do
85
85
  end
86
86
 
87
87
  it 'renders !=' do
88
- assert_render(<<-HAML, <<-HTML, escape_html: true)
88
+ assert_render(<<-HAML, <<-HTML, escape_html: true, compatible_only: [])
89
89
  != '<"&>'
90
90
  != '<"&>'.tap do |str|
91
91
  -# no operation
@@ -96,7 +96,7 @@ describe Hamlit::Engine do
96
96
  end
97
97
 
98
98
  it 'renders &=' do
99
- assert_render(<<-HAML, <<-HTML, escape_html: false)
99
+ assert_render(<<-HAML, <<-HTML, escape_html: false, compatible_only: [])
100
100
  &= '<"&>'
101
101
  &= '<"&>'.tap do |str|
102
102
  -# no operation
@@ -77,7 +77,7 @@ describe Hamlit::Engine do
77
77
  end
78
78
 
79
79
  it 'renders empty elsif statement' do
80
- assert_render(<<-'HAML', <<-HTML)
80
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml, error_with: :faml)
81
81
  %span
82
82
  - if false
83
83
  - elsif false
@@ -88,7 +88,7 @@ describe Hamlit::Engine do
88
88
  end
89
89
 
90
90
  it 'renders empty else statement' do
91
- assert_render(<<-'HAML', <<-HTML)
91
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml, error_with: :faml)
92
92
  %span
93
93
  - if false
94
94
  ng
@@ -100,7 +100,7 @@ describe Hamlit::Engine do
100
100
  end
101
101
 
102
102
  it 'renders empty when statement' do
103
- assert_render(<<-'HAML', <<-HTML)
103
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml, error_with: :faml)
104
104
  %span
105
105
  - case
106
106
  - when false
@@ -188,7 +188,7 @@ describe Hamlit::Engine do
188
188
  end
189
189
 
190
190
  it 'joins a next line if a current line ends with ","' do
191
- assert_render("- foo = [', \n ']\n= foo", <<-HTML)
191
+ assert_render("- foo = [', \n ']\n= foo", <<-HTML, compatible_only: :haml)
192
192
  [&quot;, &quot;]
193
193
  HTML
194
194
  end
@@ -226,7 +226,7 @@ describe Hamlit::Engine do
226
226
  end
227
227
 
228
228
  it 'accepts ! operator' do
229
- assert_render(<<-'HAML', <<-'HTML')
229
+ assert_render(<<-'HAML', <<-'HTML', compatible_only: :faml)
230
230
  %span!#{'<nyaa>'}
231
231
  %span! #{'<nyaa>'}
232
232
  !#{'<nyaa>'}
@@ -234,7 +234,7 @@ describe Hamlit::Engine do
234
234
  HAML
235
235
  <span><nyaa></span>
236
236
  <span><nyaa></span>
237
- !&lt;nyaa&gt;
237
+ <nyaa>
238
238
  <nyaa>
239
239
  HTML
240
240
  end
@@ -297,6 +297,29 @@ describe Hamlit::Engine do
297
297
  <span>foofoo2<span>bar</span></span>
298
298
  HTML
299
299
  end
300
+
301
+ it 'removes whitespace inside script inside silent script' do
302
+ assert_render(<<-HAML, <<-HTML, compatible_only: [:haml, :faml])
303
+ .bar<
304
+ - 3.times do
305
+ = 'foo'
306
+ HAML
307
+ <div class='bar'>foofoofoo</div>
308
+ HTML
309
+ end
310
+
311
+ it 'removes whitespace inside script recursively' do
312
+ assert_render(<<-HAML, <<-HTML, compatible_only: [:haml, :faml])
313
+ .foo<
314
+ - 1.times do
315
+ = 2.times do
316
+ - 2.times do
317
+ = 1.times do
318
+ = 'bar'
319
+ HAML
320
+ <div class='foo'>bar1bar1bar1bar12</div>
321
+ HTML
322
+ end
300
323
  end
301
324
  end
302
325
  end
@@ -13,7 +13,7 @@ describe Hamlit::Engine do
13
13
  end
14
14
 
15
15
  it 'renders . or # which is not continued by tag name' do
16
- assert_render(<<-HAML, <<-HTML)
16
+ assert_render(<<-HAML, <<-HTML, compatible_only: [], error_with: :haml)
17
17
  .
18
18
  .*
19
19
  #
@@ -72,7 +72,7 @@ describe Hamlit::Engine do
72
72
  end
73
73
 
74
74
  it 'renders ! operator' do
75
- assert_render(<<-'HAML', <<-HTML)
75
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :faml)
76
76
  aaa#{'<a>'}
77
77
  !aaa#{'<a>'}
78
78
  ! aaa#{'<a>'}
@@ -80,10 +80,10 @@ describe Hamlit::Engine do
80
80
  !!aa
81
81
  HAML
82
82
  aaa&lt;a&gt;
83
- !aaa&lt;a&gt;
84
83
  aaa<a>
85
84
  aaa<a>
86
- !!aa
85
+ aaa<a>
86
+ !aa
87
87
  HTML
88
88
  end
89
89
 
@@ -91,7 +91,7 @@ describe Hamlit::Engine do
91
91
  specify { assert_render('#{}', "\n") }
92
92
  specify { assert_render('1#{}', "1\n") }
93
93
  specify { assert_render('1#{2}', "12\n") }
94
- specify { assert_render('1#{2', "1\#{2\n") }
94
+ specify { assert_render('1#{2', "1\#{2\n", error_with: [:haml, :faml]) }
95
95
  specify { assert_render('}#{1}', "}1\n") }
96
96
  specify { assert_render('#{1}2', "12\n") }
97
97
  specify { assert_render('1#{ "2#{3}4" }5', "12345\n") }
@@ -100,7 +100,7 @@ describe Hamlit::Engine do
100
100
  specify { assert_render('あ#{1}', "あ1\n") }
101
101
  specify { assert_render('あ#{"い"}う', "あいう\n") }
102
102
  specify { assert_render('a#{"<b>"}c', "a&lt;b&gt;c\n") }
103
- specify { assert_render(":plain\n あ\n \#{'い'}", "あ\nい\n\n") }
103
+ specify { assert_render(":plain\n あ\n \#{'い'}", "あ\nい\n\n", compatible_only: :haml) }
104
104
  end
105
105
  end
106
106
  end
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Filters::Coffee do
2
2
  describe '#compile' do
3
3
  it 'renders coffee filter' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
5
5
  :coffee
6
6
  foo = ->
7
7
  alert('hello')
@@ -20,7 +20,7 @@ describe Hamlit::Filters::Coffee do
20
20
  end
21
21
 
22
22
  it 'renders coffeescript filter' do
23
- assert_render(<<-HAML, <<-HTML)
23
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
24
24
  :coffee
25
25
  foo = ->
26
26
  alert('hello')
@@ -39,7 +39,7 @@ describe Hamlit::Filters::Coffee do
39
39
  end
40
40
 
41
41
  it 'renders coffeescript filter' do
42
- assert_render(<<-'HAML', <<-HTML)
42
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml)
43
43
  :coffee
44
44
  foo = ->
45
45
  alert("#{'<&>'}")
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Filters::Erb do
2
2
  describe '#compile' do
3
3
  it 'renders erb filter' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: [], error_with: :faml)
5
5
  :erb
6
6
  <% if true %>
7
7
  ok
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Filters::Javascript do
2
2
  describe '#compile' do
3
3
  it 'just renders script tag for empty filter' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: [])
5
5
  before
6
6
  :javascript
7
7
  after
@@ -30,7 +30,7 @@ describe Hamlit::Filters::Javascript do
30
30
  end
31
31
 
32
32
  it 'accepts illegal indentation' do
33
- assert_render(<<-HAML, <<-HTML)
33
+ assert_render(<<-HAML, <<-HTML, compatible_only: :faml)
34
34
  :javascript
35
35
  if {
36
36
  alert('hello');
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Filters::Less do
2
2
  describe '#compile' do
3
3
  it 'renders less filter' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml, error_with: :faml)
5
5
  :less
6
6
  .users_controller {
7
7
  .show_action {
@@ -20,7 +20,7 @@ describe Hamlit::Filters::Less do
20
20
  end
21
21
 
22
22
  it 'parses string interpolation' do
23
- assert_render(<<-'HAML', <<-HTML)
23
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml, error_with: :faml)
24
24
  :less
25
25
  .foo {
26
26
  content: "#{'<&>'}";
@@ -13,7 +13,7 @@ describe Hamlit::Filters::Markdown do
13
13
  end
14
14
 
15
15
  it 'renders markdown filter with string interpolation' do
16
- assert_render(<<-'HAML', <<-HTML)
16
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :faml)
17
17
  - project = '<Hamlit>'
18
18
  :markdown
19
19
  # #{project}
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Filters::Sass do
2
2
  describe '#compile' do
3
3
  it 'renders sass filter' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
5
5
  :sass
6
6
  .users_controller
7
7
  .show_action
@@ -17,7 +17,7 @@ describe Hamlit::Filters::Sass do
17
17
  end
18
18
 
19
19
  it 'renders sass filter with string interpolation' do
20
- assert_render(<<-'HAML', <<-HTML)
20
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml)
21
21
  :sass
22
22
  .users_controller
23
23
  .show_action
@@ -1,7 +1,7 @@
1
1
  describe Hamlit::Filters::Scss do
2
2
  describe '#compile' do
3
3
  it 'renders scss filter' do
4
- assert_render(<<-HAML, <<-HTML)
4
+ assert_render(<<-HAML, <<-HTML, compatible_only: :haml)
5
5
  :scss
6
6
  .users_controller {
7
7
  .show_action {
@@ -19,7 +19,7 @@ describe Hamlit::Filters::Scss do
19
19
  end
20
20
 
21
21
  it 'parses string interpolation' do
22
- assert_render(<<-'HAML', <<-HTML)
22
+ assert_render(<<-'HAML', <<-HTML, compatible_only: :haml)
23
23
  :scss
24
24
  .users_controller {
25
25
  .show_action {
@@ -1,7 +1,11 @@
1
+ require 'haml'
2
+ require 'faml'
1
3
  require 'hamlit'
2
4
  require 'unindent'
3
5
 
4
6
  module HamlitSpecHelper
7
+ DEFAULT_OPTIONS = { ugly: true, escape_html: true }.freeze
8
+
5
9
  def parse_string(str)
6
10
  Hamlit::Parser.new.call(str)
7
11
  end
@@ -11,10 +15,21 @@ module HamlitSpecHelper
11
15
  end
12
16
 
13
17
  def assert_render(haml, html, options = {})
14
- haml = haml.unindent
15
- html = html.unindent
18
+ errs = array_wrap(options.delete(:error_with) || [])
19
+ impls = array_wrap(options.delete(:compatible_only) || [:haml, :faml] - errs)
20
+ haml = haml.unindent
21
+ html = html.unindent
16
22
 
17
23
  expect(render_string(haml, options)).to eq(html)
24
+ impls.each do |impl|
25
+ expect_compatibility(impl, haml, options)
26
+ end
27
+ errs.each do |impl|
28
+ expect_compatibility(impl, haml, options, type: :error)
29
+ end
30
+ ([:haml, :faml] - impls - errs).each do |impl|
31
+ expect_compatibility(impl, haml, options, type: :failure)
32
+ end
18
33
  end
19
34
 
20
35
  def assert_parse(haml, &block)
@@ -28,6 +43,58 @@ module HamlitSpecHelper
28
43
  result = described_class.new.call(before)
29
44
  expect(result).to eq(after)
30
45
  end
46
+
47
+ private
48
+
49
+ def expect_compatibility(impl, haml, options, type: :success)
50
+ case impl
51
+ when :haml
52
+ expect_haml(haml, options, type: type)
53
+ when :faml
54
+ expect_faml(haml, options, type: type)
55
+ end
56
+ end
57
+
58
+ def expect_faml(haml, options, type: :success)
59
+ hamlit_html = render_string(haml, options)
60
+ options = options.dup
61
+ options.delete(:escape_html)
62
+
63
+ case type
64
+ when :success
65
+ faml_html = eval Faml::Engine.new(options).call(haml)
66
+ expect(hamlit_html).to eq(faml_html)
67
+ when :failure
68
+ faml_html = eval Faml::Engine.new(options).call(haml)
69
+ expect(hamlit_html).to_not eq(faml_html)
70
+ when :error
71
+ expect {
72
+ eval Faml::Engine.new(options).call(haml)
73
+ }.to raise_error
74
+ end
75
+ end
76
+
77
+ def expect_haml(haml, options, type: :success)
78
+ hamlit_html = render_string(haml, options)
79
+ options = DEFAULT_OPTIONS.merge(options)
80
+ case type
81
+ when :success
82
+ haml_html = Haml::Engine.new(haml, options).render(Object.new, {})
83
+ expect(hamlit_html).to eq(haml_html)
84
+ when :failure
85
+ haml_html = Haml::Engine.new(haml, options).render(Object.new, {})
86
+ expect(hamlit_html).to_not eq(haml_html)
87
+ when :error
88
+ expect {
89
+ Haml::Engine.new(haml, options).render(Object.new, {})
90
+ }.to raise_error
91
+ end
92
+ end
93
+
94
+ def array_wrap(arr)
95
+ return arr if arr.is_a?(Array)
96
+ [arr]
97
+ end
31
98
  end
32
99
 
33
100
  RSpec.configure do |config|
data/test ADDED
@@ -0,0 +1,25 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+ trap 'rm .ruby-version' 0
5
+
6
+ VERSIONS=(
7
+ 2.0.0
8
+ 2.1.6
9
+ 2.2.2
10
+ )
11
+
12
+ function test_with() {
13
+ version=$1
14
+ rbenv local $version
15
+ ruby -v
16
+ rake spec
17
+ }
18
+
19
+ for version in ${VERSIONS[@]}; do
20
+ test_with $version
21
+ done
22
+
23
+ rbenv local ${VERSIONS[2]}
24
+ ruby -v
25
+ rake rails:spec
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hamlit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-06 00:00:00.000000000 Z
11
+ date: 2015-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils
@@ -339,6 +339,7 @@ files:
339
339
  - lib/hamlit/concerns/registerable.rb
340
340
  - lib/hamlit/concerns/ripperable.rb
341
341
  - lib/hamlit/concerns/string_interpolation.rb
342
+ - lib/hamlit/concerns/whitespace.rb
342
343
  - lib/hamlit/engine.rb
343
344
  - lib/hamlit/filters/base.rb
344
345
  - lib/hamlit/filters/coffee.rb
@@ -365,11 +366,11 @@ files:
365
366
  - lib/hamlit/parsers/script.rb
366
367
  - lib/hamlit/parsers/tag.rb
367
368
  - lib/hamlit/parsers/text.rb
368
- - lib/hamlit/parsers/whitespace.rb
369
369
  - lib/hamlit/railtie.rb
370
370
  - lib/hamlit/template.rb
371
371
  - lib/hamlit/temple.rb
372
372
  - lib/hamlit/version.rb
373
+ - release
373
374
  - spec/Rakefile
374
375
  - spec/hamlit/engine/comment_spec.rb
375
376
  - spec/hamlit/engine/doctype_spec.rb
@@ -458,6 +459,7 @@ files:
458
459
  - spec/rails/vendor/assets/javascripts/.keep
459
460
  - spec/rails/vendor/assets/stylesheets/.keep
460
461
  - spec/spec_helper.rb
462
+ - test
461
463
  homepage: https://github.com/k0kubun/hamlit
462
464
  licenses:
463
465
  - MIT
@@ -571,3 +573,4 @@ test_files:
571
573
  - spec/rails/vendor/assets/javascripts/.keep
572
574
  - spec/rails/vendor/assets/stylesheets/.keep
573
575
  - spec/spec_helper.rb
576
+ has_rdoc: