slim 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,24 @@
1
1
  rvm:
2
2
  - 1.8.7
3
- - 1.9.2
4
3
  - 1.9.3
5
4
  - ruby-head
6
5
  - jruby
7
- - rbx-2.0
6
+ - rbx-18mode
8
7
  env:
9
8
  - "TASK=test"
10
9
  - "TASK=test TEMPLE=master"
11
10
  - "TASK=test:rails RAILS=master"
12
11
  - "TASK=test:rails RAILS=3.0.11"
13
12
  - "TASK=test:rails RAILS=3.1.3"
13
+ matrix:
14
+ exclude:
15
+ # Test Rails master only on 1.9.3+ Rubies
16
+ - rvm: 1.8.7
17
+ env: "TASK=test:rails RAILS=master"
18
+ - rvm: jruby
19
+ env: "TASK=test:rails RAILS=master"
20
+ - rvm: rbx-18mode
21
+ env: "TASK=test:rails RAILS=master"
14
22
  script: "bundle exec rake test:ci"
15
23
  notifications:
16
24
  email: false
data/CHANGES CHANGED
@@ -1,4 +1,9 @@
1
- master
1
+ 1.1.1
2
+
3
+ * Evaluating a html attribute now happens only once (#219)
4
+ * Code with trailing comma is treated as broken line (#226)
5
+ * Support option :remove_empty_attrs (default true)
6
+ * Require temple 0.4.0
2
7
 
3
8
  1.1.0
4
9
 
@@ -79,7 +79,7 @@ module Slim
79
79
  if delimiter = options[:attr_delimiter][name]
80
80
  "#{tmp}.respond_to?(:join) ? #{tmp}.flatten.compact.join(#{delimiter.inspect}) : #{tmp}"
81
81
  else
82
- code
82
+ tmp
83
83
  end
84
84
  ]]]]
85
85
  end
@@ -33,7 +33,8 @@ module Slim
33
33
  # Symbol | :format | :xhtml | HTML output format
34
34
  # String | :attr_wrapper | '"' | Character to wrap attributes in html (can be ' or ")
35
35
  # Hash | :attr_delimiter | {'class' => ' '} | Joining character used if multiple html attributes are supplied (e.g. id1_id2)
36
- # Symbol | :sort_attrs | true | Sort attributes by name
36
+ # Boolean | :sort_attrs | true | Sort attributes by name
37
+ # Boolean | :remove_empty_attrs| true | Remove attributes with empty value
37
38
  # Boolean | :pretty | false | Pretty html indenting (This is slower!)
38
39
  # String | :indent | ' ' | Indentation string
39
40
  # Boolean | :streaming | false (true in Rails > 3.1) | Enable output streaming
@@ -61,8 +62,10 @@ module Slim
61
62
  use Slim::Sections, :sections, :dictionary, :dictionary_access
62
63
  use Slim::EndInserter
63
64
  use Slim::Compiler, :disable_capture, :attr_delimiter
64
- use Temple::HTML::AttributeMerger, :attr_delimiter, :sort_attrs
65
- use Temple::HTML::Pretty, :format, :attr_wrapper, :pretty, :indent
65
+ html :AttributeMerger, :attr_delimiter
66
+ html :AttributeSorter, :sort_attrs
67
+ html :AttributeRemover, :remove_empty_attrs
68
+ html :Pretty, :format, :attr_wrapper, :pretty, :indent
66
69
  filter :Escapable, :use_html_safe, :disable_escape
67
70
  filter :ControlFlow
68
71
  filter :MultiFlattener
@@ -224,7 +224,7 @@ module Slim
224
224
  end
225
225
  end
226
226
 
227
- def parse_text_block(first_line = nil, text_indent = nil)
227
+ def parse_text_block(first_line = nil, text_indent = nil, in_tag = false)
228
228
  result = [:multi]
229
229
  if !first_line || first_line.empty?
230
230
  text_indent = nil
@@ -253,7 +253,11 @@ module Slim
253
253
  # The text block lines must be at least indented
254
254
  # as deep as the first line.
255
255
  offset = text_indent ? indent - text_indent : 0
256
- syntax_error!('Unexpected text indentation') if offset < 0
256
+ if offset < 0
257
+ syntax_error!("Text line not indented deep enough.\n" +
258
+ "The first text line defines the necessary text indentation." +
259
+ (in_tag ? "\nAre you trying to nest a child tag in a tag containing text? Use | for the text block!" : ''))
260
+ end
257
261
 
258
262
  result << [:newline] << [:slim, :interpolate, (text_indent ? "\n" : '') + (' ' * offset) + @line]
259
263
 
@@ -267,7 +271,7 @@ module Slim
267
271
 
268
272
  def parse_broken_line
269
273
  broken_line = @line.strip
270
- while broken_line[-1] == ?\\
274
+ while broken_line =~ /[,\\]\Z/
271
275
  next_line || syntax_error!('Unexpected end of file')
272
276
  broken_line << "\n" << @line.strip
273
277
  end
@@ -312,7 +316,7 @@ module Slim
312
316
  @stacks << content
313
317
  when /\A( ?)(.*)\Z/
314
318
  # Text content
315
- tag << parse_text_block($2, @orig_line.size - @line.size + $1.size)
319
+ tag << parse_text_block($2, @orig_line.size - @line.size + $1.size, true)
316
320
  end
317
321
  end
318
322
 
@@ -1,5 +1,5 @@
1
1
  module Slim
2
2
  # Slim version string
3
3
  # @api public
4
- VERSION = '1.1.0'
4
+ VERSION = '1.1.1'
5
5
  end
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = %w(lib)
21
21
 
22
- s.add_runtime_dependency('temple', ['~> 0.3.5'])
22
+ s.add_runtime_dependency('temple', ['~> 0.4.0'])
23
23
  s.add_runtime_dependency('tilt', ['~> 1.3.2'])
24
24
 
25
25
  s.add_development_dependency('rake', ['>= 0.8.7'])
@@ -1,6 +1,6 @@
1
1
  require File.expand_path('../helper', __FILE__)
2
2
 
3
- class TestSlim < ActionController::IntegrationTest
3
+ class TestSlim < ActionDispatch::IntegrationTest
4
4
  test "normal view" do
5
5
  get "slim/normal"
6
6
  assert_response :success
@@ -59,13 +59,7 @@ class TestSlim < ActionController::IntegrationTest
59
59
  post "parents", 'parent[name]' => "p1", 'parent[children_attributes][0][name]' => "c1"
60
60
  get "parents/1/edit"
61
61
 
62
- assert_html '<form accept-charset="UTF-8" action="/parents/1" class="edit_parent" enctype="multipart/form-data" id="edit_parent_1" method="post">'+
63
- '<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="put" />'+
64
- '</div><h1>Parent</h1><input id="parent_name" name="parent[name]" size="30" type="text" value="p1" />'+
65
- '<h2>Children</h2>'+
66
- '<ul><li><input id="parent_children_attributes_0_name" name="parent[children_attributes][0][name]" size="30" type="text" value="c1" /></li>'+
67
- '<input id="parent_children_attributes_0_id" name="parent[children_attributes][0][id]" type="hidden" value="1" /></ul>'+
68
- '</form>'
62
+ assert_match(%r{<form accept-charset="UTF-8" action="/parents/1" class="edit_parent" enctype="multipart/form-data" id="edit_parent_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="[^"]+" /></div><h1>Parent</h1><input id="parent_name" name="parent\[name\]" size="30" type="text" value="p1" /><h2>Children</h2><ul><li><input id="parent_children_attributes_0_name" name="parent\[children_attributes\]\[0\]\[name\]" size="30" type="text" value="c1" /></li><input id="parent_children_attributes_0_id" name="parent\[children_attributes\]\[0\]\[id\]" type="hidden" value="1" /></ul></form>}, @response.body)
69
63
  end
70
64
 
71
65
  protected
@@ -9,7 +9,7 @@ MiniTest::Unit.autorun
9
9
 
10
10
  Slim::Engine.after Slim::Parser, Temple::Filters::Validator, :grammar => Slim::Grammar
11
11
  Slim::Engine.before Slim::Compiler, Temple::Filters::Validator, :grammar => Slim::Grammar
12
- Slim::Engine.before Temple::HTML::Pretty, Temple::Filters::Validator
12
+ Slim::Engine.before :Pretty, Temple::Filters::Validator
13
13
 
14
14
  class TestSlim < MiniTest::Unit::TestCase
15
15
  def setup
@@ -72,7 +72,7 @@ class TestSlim < MiniTest::Unit::TestCase
72
72
  end
73
73
 
74
74
  class Env
75
- attr_reader :var
75
+ attr_reader :var, :x
76
76
 
77
77
  class ::HtmlSafeString < String
78
78
  def html_safe?
@@ -88,6 +88,7 @@ class Env
88
88
 
89
89
  def initialize
90
90
  @var = 'instance'
91
+ @x = 0
91
92
  end
92
93
 
93
94
  def id_helper
@@ -144,6 +145,11 @@ class Env
144
145
  def output_number
145
146
  1337
146
147
  end
148
+
149
+ def succ_x
150
+ @x = @x.succ
151
+ end
152
+
147
153
  end
148
154
 
149
155
  class ViewEnv
@@ -6,7 +6,7 @@ class TestSlimChainManipulation < TestSlim
6
6
  p Test
7
7
  }
8
8
  chain = proc do |engine|
9
- engine.replace(Temple::HTML::Pretty, :ReplacementFilter) do |exp|
9
+ engine.replace(:Pretty, :ReplacementFilter) do |exp|
10
10
  [:dynamic, '1+1']
11
11
  end
12
12
  end
@@ -149,6 +149,15 @@ p = \
149
149
  assert_html '<p>Hello Ruby!</p>7', source
150
150
  end
151
151
 
152
+ def test_render_with_comma_end
153
+ source = %q{
154
+ p = message("Hello",
155
+ "Ruby!")
156
+ }
157
+
158
+ assert_html '<p>Hello Ruby!</p>', source
159
+ end
160
+
152
161
  def test_render_with_no_trailing_character
153
162
  source = %q{
154
163
  p
@@ -459,4 +459,13 @@ html: body: .content
459
459
  }
460
460
  assert_html %{<html><body><div class=\"content\">Text</div></body></html>}, source
461
461
  end
462
+
463
+ def test_eval_attributes_once
464
+ source = %q{
465
+ input[value=succ_x]
466
+ input[value=succ_x]
467
+ }
468
+ assert_html %{<input value="1" /><input value="2" />}, source
469
+ end
470
+
462
471
  end
@@ -26,7 +26,23 @@ p
26
26
  text
27
27
  }
28
28
 
29
- assert_syntax_error "Unexpected text indentation\n (__TEMPLATE__), Line 4\n text\n ^\n", source
29
+ assert_syntax_error "Text line not indented deep enough.\nThe first text line defines the necessary text indentation.\n (__TEMPLATE__), Line 4\n text\n ^\n", source
30
+ end
31
+
32
+ def test_unexpected_text_indentation_in_tag
33
+ source = %q{
34
+ ul
35
+ li List1
36
+ ul
37
+ li a
38
+ li b
39
+ li List2
40
+ ul
41
+ li a
42
+ li b
43
+ }
44
+
45
+ assert_syntax_error "Text line not indented deep enough.\nThe first text line defines the necessary text indentation.\nAre you trying to nest a child tag in a tag containing text? Use | for the text block!\n (__TEMPLATE__), Line 4\n ul\n ^\n", source
30
46
  end
31
47
 
32
48
  def test_malformed_indentation
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.1.0
4
+ version: 1.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,22 +11,22 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-01-06 00:00:00.000000000 Z
14
+ date: 2012-02-29 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: temple
18
- requirement: &2152139880 !ruby/object:Gem::Requirement
18
+ requirement: &17637820 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 0.3.5
23
+ version: 0.4.0
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *2152139880
26
+ version_requirements: *17637820
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: tilt
29
- requirement: &2152135380 !ruby/object:Gem::Requirement
29
+ requirement: &17637240 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ~>
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: 1.3.2
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *2152135380
37
+ version_requirements: *17637240
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: rake
40
- requirement: &2152133280 !ruby/object:Gem::Requirement
40
+ requirement: &17636740 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: 0.8.7
46
46
  type: :development
47
47
  prerelease: false
48
- version_requirements: *2152133280
48
+ version_requirements: *17636740
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: sass
51
- requirement: &2152132380 !ruby/object:Gem::Requirement
51
+ requirement: &17636160 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: 3.1.0
57
57
  type: :development
58
58
  prerelease: false
59
- version_requirements: *2152132380
59
+ version_requirements: *17636160
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: minitest
62
- requirement: &2152131200 !ruby/object:Gem::Requirement
62
+ requirement: &17652060 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: '0'
68
68
  type: :development
69
69
  prerelease: false
70
- version_requirements: *2152131200
70
+ version_requirements: *17652060
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: kramdown
73
- requirement: &2152129720 !ruby/object:Gem::Requirement
73
+ requirement: &17651560 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: '0'
79
79
  type: :development
80
80
  prerelease: false
81
- version_requirements: *2152129720
81
+ version_requirements: *17651560
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: creole
84
- requirement: &2152128100 !ruby/object:Gem::Requirement
84
+ requirement: &17650940 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
- version_requirements: *2152128100
92
+ version_requirements: *17650940
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: builder
95
- requirement: &2152125140 !ruby/object:Gem::Requirement
95
+ requirement: &17649640 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,7 +100,7 @@ dependencies:
100
100
  version: '0'
101
101
  type: :development
102
102
  prerelease: false
103
- version_requirements: *2152125140
103
+ version_requirements: *17649640
104
104
  description: Slim is a template language whose goal is reduce the syntax to the essential
105
105
  parts without becoming cryptic.
106
106
  email:
@@ -226,9 +226,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
226
  version: '0'
227
227
  requirements: []
228
228
  rubyforge_project: slim
229
- rubygems_version: 1.8.10
229
+ rubygems_version: 1.8.15
230
230
  signing_key:
231
231
  specification_version: 3
232
232
  summary: Slim is a template language.
233
233
  test_files: []
234
- has_rdoc: