slim 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,4 +1,12 @@
1
- 1.0
1
+ master
2
+
3
+ 1.0.1
4
+
5
+ * Only delimiting brackets must be balanced in ruby attributes
6
+ e.g this is possible now `a href=(ruby_code "{")
7
+ * Skip empty lines in text block (#156)
8
+
9
+ 1.0.0
2
10
 
3
11
  * Fixed html attribute issue in sections mode (#127)
4
12
  * Obsolete directive syntax removed
data/README.md CHANGED
@@ -15,11 +15,11 @@ Slim uses [Temple](https://github.com/judofyr/temple) for parsing/compilation an
15
15
 
16
16
  ## Why?
17
17
 
18
- Within the Rails community, _Erb_ and _Haml_ are without doubt the two most popular templating engines. However, _Erb_'s syntax is cumbersome and _Haml_'s performance isn't exactly the best.
18
+ Within the Rails community, _Erb_ and _Haml_ are without doubt the two most popular templating engines. However, _Erb_'s syntax is cumbersome and _Haml_'s syntax can be quite cryptic to the uninitiated.
19
19
 
20
20
  Slim was born to bring a minimalist syntax approach with speed. If people chose not to use Slim, it would not be because of speed.
21
21
 
22
- ___Yes, Slim is speedy!___ Benchmarks are provided at the end of this README file. Alternatively, a benchmark rake task is provided so you could test it yourself (`rake bench`).
22
+ ___Yes, Slim is speedy!___ Benchmarks are provided at the end of this README file. Don't trust the numbers? That's as it should be. Therefore we provide a benchmark rake task so you could test it yourself (`rake bench`).
23
23
 
24
24
  ## How?
25
25
 
@@ -152,6 +152,12 @@ Here's a quick example to demonstrate what a Slim template looks like:
152
152
  h1(id="logo") = page_logo
153
153
  h2[id="tagline" class="small tagline"] = page_tagline
154
154
 
155
+
156
+ If you wrap the attributes, you can spread them across multiple lines:
157
+
158
+ h2[ id="tagline"
159
+ class="small tagline"] = page_tagline
160
+
155
161
  ### Add content to a tag
156
162
 
157
163
  Either start on the same line as the tag
@@ -283,6 +289,11 @@ Here's a quick example to demonstrate what a Slim template looks like:
283
289
 
284
290
  ## Benchmarks
285
291
 
292
+ *The benchmarks are only to demonstrate that Slim's speed should not
293
+ be a determining factor in your template choice. Even if we don't
294
+ agree, we'd prefer you to use any other reason for choosing another
295
+ template language.*
296
+
286
297
  # Linux + Ruby 1.9.2, 1000 iterations
287
298
 
288
299
  user system total real
@@ -73,7 +73,7 @@ module Slim
73
73
  [:code, "#{tmp} = #{code}"],
74
74
  [:case, tmp,
75
75
  ['true', [:static, name]],
76
- ['false, nil', [:static, '']],
76
+ ['false, nil', [:multi]],
77
77
  [:else,
78
78
  [:dynamic,
79
79
  if delimiter = options[:attr_delimiter][name]
@@ -37,30 +37,19 @@ module Slim
37
37
  protected
38
38
 
39
39
  def parse_expression(string)
40
- stack, code = [], ''
41
-
42
- until string.empty?
43
- if stack.empty? && string =~ /\A\}/
44
- # Stack is empty, this means we are finished
45
- # if the next character is a closing bracket
46
- string.slice!(0)
47
- break
48
- elsif string =~ Parser::DELIMITER_REGEX
49
- # Delimiter found, push it on the stack
50
- stack << Parser::DELIMITERS[$&]
51
- code << string.slice!(0)
52
- elsif string =~ Parser::CLOSE_DELIMITER_REGEX
53
- # Closing delimiter found, pop it from the stack if everything is ok
54
- raise "Text interpolation: Unexpected closing #{$&}" if stack.empty?
55
- raise "Text interpolation: Expected closing #{stack.last}" if stack.last != $&
56
- code << string.slice!(0)
57
- stack.pop
58
- else
59
- code << string.slice!(0)
40
+ count, i = 1, 0
41
+ while i < string.size && count != 0
42
+ if string[i] == ?{
43
+ count += 1
44
+ elsif string[i] == ?}
45
+ count -= 1
60
46
  end
47
+ i += 1
61
48
  end
62
49
 
63
- return string, code
50
+ raise "Text interpolation: Expected closing }" if count != 0
51
+
52
+ return string[i..-1], string[0, i-1]
64
53
  end
65
54
  end
66
55
  end
@@ -57,23 +57,23 @@ module Slim
57
57
  result
58
58
  end
59
59
 
60
+ private
61
+
60
62
  DELIMITERS = {
61
63
  '(' => ')',
62
64
  '[' => ']',
63
65
  '{' => '}',
64
66
  }.freeze
65
- DELIMITER_REGEX = /\A[\(\[\{]/
66
- CLOSE_DELIMITER_REGEX = /\A[\)\]\}]/
67
-
68
- private
69
67
 
70
- ATTR_NAME_REGEX = '\A\s*(\w[:\w-]*)'
71
- QUOTED_VALUE_REGEX = /\A("[^"]*"|'[^']*')/
72
68
  ATTR_SHORTCUT = {
73
69
  '#' => 'id',
74
70
  '.' => 'class',
75
71
  }.freeze
76
72
 
73
+ DELIMITER_REGEX = /\A[\(\[\{]/
74
+ ATTR_NAME_REGEX = '\A\s*(\w[:\w-]*)'
75
+ QUOTED_VALUE_REGEX = /\A("[^"]*"|'[^']*')/
76
+
77
77
  if RUBY_VERSION > '1.9'
78
78
  CLASS_ID_REGEX = /\A(#|\.)([\w\u00c0-\uFFFF][\w:\u00c0-\uFFFF-]*)/
79
79
  else
@@ -124,7 +124,7 @@ module Slim
124
124
  end
125
125
 
126
126
  def parse_line
127
- if @line.strip.empty?
127
+ if @line =~ /\A\s*\Z/
128
128
  @stacks.last << [:newline]
129
129
  return
130
130
  end
@@ -178,8 +178,8 @@ module Slim
178
178
  block = [:multi]
179
179
  @stacks.last << [:html, :comment, block]
180
180
  @stacks << block
181
- @stacks.last << [:slim, :interpolate, $2] if $2
182
- parse_text_block($1 ? 2 : 1)
181
+ @stacks.last << [:slim, :interpolate, $2] unless $2.empty?
182
+ parse_text_block($2.empty? ? nil : @indents.last + $1.size + 2)
183
183
  elsif @line =~ %r{\A/\[\s*(.*?)\s*\]\s*\Z}
184
184
  # HTML conditional comment
185
185
  block = [:multi]
@@ -189,15 +189,11 @@ module Slim
189
189
  # Slim comment
190
190
  parse_comment_block
191
191
  end
192
- when /\A[\|']/
192
+ when /\A([\|'])( ?)(.*)\Z/
193
193
  # Found a text block.
194
- trailing_ws = @line.slice!(0) == ?'
195
- if @line.strip.empty?
196
- parse_text_block
197
- else
198
- @stacks.last << [:slim, :interpolate, @line.sub(/\A( )/, '')]
199
- parse_text_block($1 ? 2 : 1)
200
- end
194
+ trailing_ws = $1 == "'"
195
+ @stacks.last << [:slim, :interpolate, $3] unless $3.empty?
196
+ parse_text_block($3.empty? ? nil : @indents.last + $2.size + 1)
201
197
  @stacks.last << [:static, ' '] if trailing_ws
202
198
  when /\A-/
203
199
  # Found a code block.
@@ -235,37 +231,44 @@ module Slim
235
231
  end
236
232
 
237
233
  def parse_comment_block
238
- until @lines.empty? || get_indent(@lines.first) <= @indents.last
234
+ while !@lines.empty? && (@lines.first =~ /\A\s*\Z/ || get_indent(@lines.first) > @indents.last)
239
235
  next_line
240
236
  @stacks.last << [:newline]
241
237
  end
242
238
  end
243
239
 
244
- def parse_text_block(offset = nil)
245
- text_indent = offset ? @indents.last + offset : nil
246
-
240
+ def parse_text_block(text_indent = nil)
241
+ empty_lines = 0
247
242
  until @lines.empty?
248
- indent = get_indent(@lines.first)
249
- break if indent <= @indents.last
243
+ if @lines.first =~ /\A\s*\Z/
244
+ next_line
245
+ @stacks.last << [:newline]
246
+ empty_lines += 1 if text_indent
247
+ else
248
+ indent = get_indent(@lines.first)
249
+ break if indent <= @indents.last
250
250
 
251
- next_line
251
+ if empty_lines > 0
252
+ @stacks.last << [:slim, :interpolate, "\n" * empty_lines]
253
+ empty_lines = 0
254
+ end
252
255
 
253
- # The indentation of first line of the text block
254
- # determines the text base indentation.
255
- newline = text_indent ? "\n" : ''
256
- text_indent ||= indent
256
+ next_line
257
257
 
258
- # The text block lines must be at least indented
259
- # as deep as the first line.
260
- if indent < text_indent
261
- @line.lstrip!
262
- syntax_error!('Unexpected text indentation')
263
- end
258
+ # The text block lines must be at least indented
259
+ # as deep as the first line.
260
+ if text_indent && indent < text_indent
261
+ @line.lstrip!
262
+ syntax_error!('Unexpected text indentation')
263
+ end
264
264
 
265
- @line.slice!(0, text_indent)
265
+ @line.slice!(0, text_indent || indent)
266
+ @stacks.last << [:newline] << [:slim, :interpolate, (text_indent ? "\n" : '') + @line]
266
267
 
267
- # Generate the additional spaces in front.
268
- @stacks.last << [:newline] << [:slim, :interpolate, newline + @line]
268
+ # The indentation of first line of the text block
269
+ # determines the text base indentation.
270
+ text_indent ||= indent
271
+ end
269
272
  end
270
273
  end
271
274
 
@@ -279,8 +282,6 @@ module Slim
279
282
  end
280
283
 
281
284
  def parse_tag(tag)
282
- size = @line.size
283
-
284
285
  if tag == '#' || tag == '.'
285
286
  tag = 'div'
286
287
  else
@@ -305,19 +306,16 @@ module Slim
305
306
  content = [:multi]
306
307
  tag << content
307
308
  @stacks << content
308
- else
309
+ when /\A( ?)(.*)\Z/
309
310
  # Text content
310
- content = [:multi, [:slim, :interpolate, @line.sub(/\A( )/, '')]]
311
+ content = [:multi, [:slim, :interpolate, $2]]
311
312
  tag << content
312
313
  @stacks << content
313
- parse_text_block(size - @line.size + ($1 ? 1 : 0))
314
+ parse_text_block(@orig_line.size - @line.size + $1.size)
314
315
  end
315
316
  end
316
317
 
317
318
  def parse_attributes
318
- # Now we'll have to find all the attributes. We'll store these in an
319
- # nested array: [[name, value], [name2, value2]]. The value is a piece
320
- # of Ruby code.
321
319
  attributes = [:html, :attrs]
322
320
 
323
321
  # Find any literal class/id attributes
@@ -378,53 +376,42 @@ module Slim
378
376
  :column => orig_line.size)
379
377
  end
380
378
 
381
- return attributes
379
+ attributes
382
380
  end
383
381
 
384
- def parse_ruby_attribute(delimiter)
385
- # Delimiter stack
386
- stack = []
382
+ def parse_ruby_attribute(outer_delimiter)
383
+ # Delimiter count
384
+ count, delimiter, close_delimiter = 0, nil, nil
387
385
 
388
386
  # Attribute value buffer
389
387
  value = ''
390
388
 
391
389
  # Attribute ends with space or attribute delimiter
392
- end_regex = /\A[\s#{Regexp.escape delimiter.to_s}]/
393
-
394
- until @line.empty?
395
- if stack.empty? && @line =~ end_regex
396
- # Stack is empty, this means we left the attribute value
397
- # if next character is space or attribute delimiter
398
- break
390
+ end_regex = /\A[\s#{Regexp.escape outer_delimiter.to_s}]/
391
+
392
+ until @line.empty? || (count == 0 && @line =~ end_regex)
393
+ if count > 0
394
+ if @line[0] == delimiter[0]
395
+ count += 1
396
+ elsif @line[0] == close_delimiter[0]
397
+ count -= 1
398
+ end
399
399
  elsif @line =~ DELIMITER_REGEX
400
- # Delimiter found, push it on the stack
401
- stack << DELIMITERS[$&]
402
- value << @line.slice!(0)
403
- elsif @line =~ CLOSE_DELIMITER_REGEX
404
- # Closing delimiter found, pop it from the stack if everything is ok
405
- syntax_error!("Unexpected closing #{$&}") if stack.empty?
406
- syntax_error!("Expected closing #{stack.last}") if stack.last != $&
407
- value << @line.slice!(0)
408
- stack.pop
409
- else
410
- value << @line.slice!(0)
400
+ count = 1
401
+ delimiter, close_delimiter = $&, DELIMITERS[$&]
411
402
  end
403
+ value << @line.slice!(0)
412
404
  end
413
405
 
414
- unless stack.empty?
415
- syntax_error!("Expected closing attribute delimiter #{stack.last}")
416
- end
417
-
418
- if value.empty?
419
- syntax_error!('Invalid empty attribute')
420
- end
406
+ syntax_error!("Expected closing attribute delimiter #{close_delimiter}") if count != 0
407
+ syntax_error!('Invalid empty attribute') if value.empty?
421
408
 
422
409
  # Remove attribute wrapper which doesn't belong to the ruby code
423
410
  # e.g id=[hash[:a] + hash[:b]]
424
411
  value = value[1..-2] if value =~ DELIMITER_REGEX &&
425
412
  DELIMITERS[$&] == value[-1, 1]
426
413
 
427
- return value
414
+ value
428
415
  end
429
416
 
430
417
  # Helper for raising exceptions
@@ -1,5 +1,5 @@
1
1
  module Slim
2
2
  # Slim version string
3
3
  # @api public
4
- VERSION = '1.0.0'
4
+ VERSION = '1.0.1'
5
5
  end
@@ -74,6 +74,14 @@ form action=action_path(:page, :save) method='post'
74
74
  assert_html '<form action="&#47;action-page-save" method="post"></form>', source
75
75
  end
76
76
 
77
+ def test_ruby_attribute_with_unbalanced_delimiters
78
+ source = %q{
79
+ div crazy=action_path('[') id="crazy_delimiters"
80
+ }
81
+
82
+ assert_html '<div crazy="&#47;action-[" id="crazy_delimiters"></div>', source
83
+ end
84
+
77
85
  def test_method_call_in_delimited_attribute_without_quotes
78
86
  source = %q{
79
87
  form(action=action_path(:page, :save) method='post')
@@ -63,8 +63,22 @@ creole:
63
63
  source = %q{
64
64
  javascript:
65
65
  $(function() {});
66
+
67
+
68
+ alert('hello')
69
+ p Hi
70
+ }
71
+ assert_html %{<script type="text/javascript">$(function() {});\n\n\nalert('hello')</script><p>Hi</p>}, source
72
+ end
73
+
74
+ def test_render_with_javascript_including_variable
75
+ # Keep the trailing space behind "javascript: "!
76
+ source = %q{
77
+ - func = "alert('hello');"
78
+ javascript:
79
+ $(function() { #{func} });
66
80
  }
67
- assert_html '<script type="text/javascript">$(function() {});</script>', source
81
+ assert_html %q|<script type="text/javascript">$(function() { alert('hello'); });</script>|, source
68
82
  end
69
83
 
70
84
  def test_render_with_ruby
@@ -7,13 +7,24 @@ class TestSlimHtmlStructure < TestSlim
7
7
  html
8
8
  head
9
9
  title Simple Test Title
10
- body
10
+ body
11
11
  p Hello World, meet Slim.
12
12
  }
13
13
 
14
14
  assert_html '<html><head><title>Simple Test Title</title></head><body><p>Hello World, meet Slim.</p></body></html>', source
15
15
  end
16
16
 
17
+ def test_html_tag_with_text_and_empty_line
18
+ # Keep the trailing space behind "body "!
19
+ source = %q{
20
+ p Hello
21
+
22
+ p World
23
+ }
24
+
25
+ assert_html "<p>Hello</p><p>World</p>", source
26
+ end
27
+
17
28
  def test_html_namespaces
18
29
  source = %q{
19
30
  html:body
@@ -312,22 +323,12 @@ closed(id="test")/
312
323
  source = %q{
313
324
  p Hello
314
325
  /! This is a comment
315
- p World
316
- }
317
-
318
- assert_html "<p>Hello</p><!--This is a comment--><p>World</p>", source
319
- end
320
326
 
321
- def test_render_with_html_comments_2
322
- source = %q{
323
- p Hello
324
- /! This is a comment
325
327
  Another comment
326
- Last line of comment.
327
328
  p World
328
329
  }
329
330
 
330
- assert_html "<p>Hello</p><!--This is a comment\n Another comment\nLast line of comment.--><p>World</p>", source
331
+ assert_html "<p>Hello</p><!--This is a comment\n\nAnother comment--><p>World</p>", source
331
332
  end
332
333
 
333
334
  def test_render_with_html_conditional_and_tag
@@ -78,15 +78,6 @@ p
78
78
  assert_syntax_error "Expected attribute\n (__TEMPLATE__), Line 3\n img(src='img.png' whatsthis?!)\n ^\n", source
79
79
  end
80
80
 
81
- def test_unexpected_closing
82
- source = %q{
83
- p
84
- img src=(1+1)]
85
- }
86
-
87
- assert_syntax_error "Unexpected closing ]\n (__TEMPLATE__), Line 3\n img src=(1+1)]\n ^\n", source
88
- end
89
-
90
81
  def test_invalid_empty_attribute
91
82
  source = %q{
92
83
  p
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slim
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,12 +11,12 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-07-24 00:00:00.000000000 -04:00
14
+ date: 2011-08-07 00:00:00.000000000 -04:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: temple
19
- requirement: &2156211620 !ruby/object:Gem::Requirement
19
+ requirement: &2153659280 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ~>
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: 0.3.0
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *2156211620
27
+ version_requirements: *2153659280
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: tilt
30
- requirement: &2156211100 !ruby/object:Gem::Requirement
30
+ requirement: &2153658760 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ~>
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: '1.2'
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *2156211100
38
+ version_requirements: *2153658760
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: rake
41
- requirement: &2156210620 !ruby/object:Gem::Requirement
41
+ requirement: &2153658280 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,10 +46,10 @@ dependencies:
46
46
  version: 0.8.7
47
47
  type: :development
48
48
  prerelease: false
49
- version_requirements: *2156210620
49
+ version_requirements: *2153658280
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: haml
52
- requirement: &2156210140 !ruby/object:Gem::Requirement
52
+ requirement: &2153657800 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ! '>='
@@ -57,10 +57,10 @@ dependencies:
57
57
  version: 3.1.0
58
58
  type: :development
59
59
  prerelease: false
60
- version_requirements: *2156210140
60
+ version_requirements: *2153657800
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: sass
63
- requirement: &2156209660 !ruby/object:Gem::Requirement
63
+ requirement: &2153657320 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ! '>='
@@ -68,10 +68,10 @@ dependencies:
68
68
  version: 3.1.0
69
69
  type: :development
70
70
  prerelease: false
71
- version_requirements: *2156209660
71
+ version_requirements: *2153657320
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: minitest
74
- requirement: &2156209180 !ruby/object:Gem::Requirement
74
+ requirement: &2153656840 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ! '>='
@@ -79,10 +79,10 @@ dependencies:
79
79
  version: '0'
80
80
  type: :development
81
81
  prerelease: false
82
- version_requirements: *2156209180
82
+ version_requirements: *2153656840
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rcov
85
- requirement: &2156208700 !ruby/object:Gem::Requirement
85
+ requirement: &2153656360 !ruby/object:Gem::Requirement
86
86
  none: false
87
87
  requirements:
88
88
  - - ! '>='
@@ -90,10 +90,10 @@ dependencies:
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
- version_requirements: *2156208700
93
+ version_requirements: *2153656360
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: rdiscount
96
- requirement: &2156208220 !ruby/object:Gem::Requirement
96
+ requirement: &2153655880 !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
99
99
  - - ! '>='
@@ -101,10 +101,10 @@ dependencies:
101
101
  version: '0'
102
102
  type: :development
103
103
  prerelease: false
104
- version_requirements: *2156208220
104
+ version_requirements: *2153655880
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: liquid
107
- requirement: &2156207740 !ruby/object:Gem::Requirement
107
+ requirement: &2153655400 !ruby/object:Gem::Requirement
108
108
  none: false
109
109
  requirements:
110
110
  - - ! '>='
@@ -112,10 +112,10 @@ dependencies:
112
112
  version: '0'
113
113
  type: :development
114
114
  prerelease: false
115
- version_requirements: *2156207740
115
+ version_requirements: *2153655400
116
116
  - !ruby/object:Gem::Dependency
117
117
  name: yard
118
- requirement: &2156207260 !ruby/object:Gem::Requirement
118
+ requirement: &2153654920 !ruby/object:Gem::Requirement
119
119
  none: false
120
120
  requirements:
121
121
  - - ! '>='
@@ -123,10 +123,10 @@ dependencies:
123
123
  version: '0'
124
124
  type: :development
125
125
  prerelease: false
126
- version_requirements: *2156207260
126
+ version_requirements: *2153654920
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: creole
129
- requirement: &2156206780 !ruby/object:Gem::Requirement
129
+ requirement: &2153654440 !ruby/object:Gem::Requirement
130
130
  none: false
131
131
  requirements:
132
132
  - - ! '>='
@@ -134,7 +134,7 @@ dependencies:
134
134
  version: '0'
135
135
  type: :development
136
136
  prerelease: false
137
- version_requirements: *2156206780
137
+ version_requirements: *2153654440
138
138
  description: Slim is a template language whose goal is reduce the syntax to the essential
139
139
  parts without becoming cryptic.
140
140
  email:
@@ -235,7 +235,6 @@ files:
235
235
  - test/slim/test_slim_template.rb
236
236
  - test/slim/test_text_interpolation.rb
237
237
  - test/slim/test_wrapper.rb
238
- - test_ruby_errors.rb
239
238
  has_rdoc: true
240
239
  homepage: http://github.com/stonean/slim
241
240
  licenses: []
@@ -1,191 +0,0 @@
1
- require 'helper'
2
-
3
- class TestSlimRubyErrors < TestSlim
4
- def test_broken_output_line
5
- source = %q{
6
- p = hello_world + \
7
- hello_world + \
8
- unknown_ruby_method
9
- }
10
-
11
- assert_ruby_error NameError, "test.slim:4", source, :file => 'test.slim'
12
- end
13
-
14
- def test_broken_output_line2
15
- source = %q{
16
- p = hello_world + \
17
- hello_world
18
- p Hello
19
- = unknown_ruby_method
20
- }
21
-
22
- assert_ruby_error NameError,"(__TEMPLATE__):5", source
23
- end
24
-
25
- def test_output_block
26
- source = %q{
27
- p = hello_world "Hello Ruby" do
28
- = unknown_ruby_method
29
- }
30
-
31
- assert_ruby_error NameError,"(__TEMPLATE__):3", source
32
- end
33
-
34
- def test_output_block2
35
- source = %q{
36
- p = hello_world "Hello Ruby" do
37
- = "Hello from block"
38
- p Hello
39
- = unknown_ruby_method
40
- }
41
-
42
- assert_ruby_error NameError, "(__TEMPLATE__):5", source
43
- end
44
-
45
- def test_text_block
46
- source = %q{
47
- p Text line 1 Text line 2
48
- = unknown_ruby_method
49
- }
50
-
51
- assert_ruby_error NameError,"(__TEMPLATE__):4", source
52
- end
53
-
54
- def test_text_block2
55
- source = %q{
56
- |
57
- Text line 1
58
- Text line 2
59
- = unknown_ruby_method
60
- }
61
-
62
- assert_ruby_error NameError,"(__TEMPLATE__):5", source
63
- end
64
-
65
- def test_comment
66
- source = %q{
67
- / Comment line 1
68
- Comment line 2
69
- = unknown_ruby_method
70
- }
71
-
72
- assert_ruby_error NameError,"(__TEMPLATE__):4", source
73
- end
74
-
75
- def test_embedded_ruby
76
- source = %q{
77
- ruby:
78
- a = 1
79
- b = 2
80
- = a + b
81
- = unknown_ruby_method
82
- }
83
-
84
- assert_ruby_error NameError,"(__TEMPLATE__):6", source
85
- end
86
-
87
- def test_embedded_markdown
88
- source = %q{
89
- markdown:
90
- #Header
91
- Hello from #{"Markdown!"}
92
- "Second Line!"
93
- = unknown_ruby_method
94
- }
95
-
96
- assert_ruby_error NameError,"(__TEMPLATE__):6", source
97
- end
98
-
99
- def test_embedded_liquid
100
- source = %q{
101
- - text = 'before liquid block'
102
- liquid:
103
- First
104
- {{text}}
105
- Third
106
- = unknown_ruby_method
107
- }
108
-
109
- assert_ruby_error NameError,"(__TEMPLATE__):7", source
110
- end
111
-
112
- def test_embedded_javascript
113
- source = %q{
114
- javascript:
115
- alert();
116
- alert();
117
- = unknown_ruby_method
118
- }
119
-
120
- assert_ruby_error NameError,"(__TEMPLATE__):5", source
121
- end
122
-
123
- def test_invalid_nested_code
124
- source = %q{
125
- p
126
- - test = 123
127
- = "Hello from within a block! "
128
- }
129
- assert_ruby_syntax_error "(__TEMPLATE__):5", source
130
- end
131
-
132
- def test_invalid_nested_output
133
- source = %q{
134
- p
135
- = "Hello Ruby!"
136
- = "Hello from within a block! "
137
- }
138
- assert_ruby_syntax_error "(__TEMPLATE__):5", source
139
- end
140
-
141
- def test_invalid_embedded_engine
142
- source = %q{
143
- p
144
- embed_unknown:
145
- 1+1
146
- }
147
-
148
- assert_runtime_error 'Embedded engine embed_unknown not found', source
149
- end
150
-
151
- def test_explicit_end
152
- source = %q{
153
- div
154
- - if show_first?
155
- p The first paragraph
156
- - end
157
- }
158
-
159
- assert_runtime_error 'Explicit end statements are forbidden', source
160
- end
161
-
162
- def test_id_attribute_merging2
163
- source = %{
164
- #alpha id="beta" Test it
165
- }
166
- assert_runtime_error 'Multiple id attributes specified', source
167
- end
168
-
169
- def test_multiline_attributes
170
- source = %q{
171
- p(id="id"
172
- foo=1+1
173
- class=unknown_ruby_method)
174
- p
175
- }
176
-
177
- assert_ruby_error NameError,"(__TEMPLATE__):3", source
178
- end
179
-
180
-
181
- def test_multiline_ruby_attribute
182
- source = %q{
183
- p id=(1+
184
- +2
185
- +unknown_ruby_method)
186
- p
187
- }
188
-
189
- assert_ruby_error NameError,"(__TEMPLATE__):4", source
190
- end
191
- end