slim 1.3.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/.travis.yml +9 -5
  2. data/CHANGES +23 -0
  3. data/Gemfile +13 -2
  4. data/README.md +346 -105
  5. data/Rakefile +21 -9
  6. data/lib/slim.rb +3 -3
  7. data/lib/slim/boolean_attributes.rb +67 -0
  8. data/lib/slim/command.rb +23 -23
  9. data/lib/slim/control_structures.rb +57 -0
  10. data/lib/slim/embedded_engine.rb +80 -43
  11. data/lib/slim/end_inserter.rb +1 -1
  12. data/lib/slim/engine.rb +21 -15
  13. data/lib/slim/filter.rb +0 -6
  14. data/lib/slim/grammar.rb +2 -7
  15. data/lib/slim/interpolation.rb +1 -1
  16. data/lib/slim/logic_less/filter.rb +8 -8
  17. data/lib/slim/logic_less/wrapper.rb +1 -1
  18. data/lib/slim/parser.rb +51 -52
  19. data/lib/slim/splat_attributes.rb +112 -0
  20. data/lib/slim/translator.rb +13 -12
  21. data/lib/slim/version.rb +1 -1
  22. data/slim.gemspec +1 -1
  23. data/test/{slim → core}/helper.rb +3 -7
  24. data/test/{slim → core}/test_code_blocks.rb +0 -0
  25. data/test/{slim → core}/test_code_escaping.rb +4 -4
  26. data/test/{slim → core}/test_code_evaluation.rb +3 -112
  27. data/test/{slim → core}/test_code_output.rb +0 -0
  28. data/test/{slim → core}/test_code_structure.rb +0 -0
  29. data/test/{slim → core}/test_embedded_engines.rb +8 -3
  30. data/test/{slim → core}/test_encoding.rb +0 -0
  31. data/test/core/test_html_attributes.rb +218 -0
  32. data/test/{slim → core}/test_html_escaping.rb +17 -0
  33. data/test/{slim → core}/test_html_structure.rb +13 -98
  34. data/test/{slim → core}/test_parser_errors.rb +24 -15
  35. data/test/{slim → core}/test_pretty.rb +0 -0
  36. data/test/{slim → core}/test_ruby_errors.rb +7 -0
  37. data/test/{slim → core}/test_slim_template.rb +0 -0
  38. data/test/{slim → core}/test_text_interpolation.rb +2 -2
  39. data/test/core/test_thread_options.rb +18 -0
  40. data/test/{slim/logic_less → logic_less}/test_logic_less.rb +21 -0
  41. data/test/{slim/logic_less → logic_less}/test_wrapper.rb +3 -3
  42. data/test/rails/app/controllers/slim_controller.rb +4 -2
  43. data/test/rails/app/views/parents/_form.html.slim +1 -0
  44. data/test/rails/app/views/parents/edit.html.slim +2 -1
  45. data/test/rails/app/views/parents/new.html.slim +2 -1
  46. data/test/rails/app/views/slim/thread_options.html.slim +1 -0
  47. data/test/rails/test/test_slim.rb +6 -4
  48. data/test/{slim/translator → translator}/test_translator.rb +0 -0
  49. metadata +44 -82
  50. data/lib/slim/compiler.rb +0 -194
  51. data/test/rails/app/views/slim/nil.html.slim +0 -1
  52. data/test/slim/test_chain_manipulation.rb +0 -42
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.3.0
4
+ version: 1.3.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,27 +11,22 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-09-04 00:00:00.000000000 Z
14
+ date: 2012-09-26 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: temple
18
- requirement: !ruby/object:Gem::Requirement
18
+ requirement: &18956260 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 0.4.1
23
+ version: 0.5.0
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
- requirements:
29
- - - ~>
30
- - !ruby/object:Gem::Version
31
- version: 0.4.1
26
+ version_requirements: *18956260
32
27
  - !ruby/object:Gem::Dependency
33
28
  name: tilt
34
- requirement: !ruby/object:Gem::Requirement
29
+ requirement: &18955320 !ruby/object:Gem::Requirement
35
30
  none: false
36
31
  requirements:
37
32
  - - ~>
@@ -39,15 +34,10 @@ dependencies:
39
34
  version: 1.3.3
40
35
  type: :runtime
41
36
  prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: 1.3.3
37
+ version_requirements: *18955320
48
38
  - !ruby/object:Gem::Dependency
49
39
  name: rake
50
- requirement: !ruby/object:Gem::Requirement
40
+ requirement: &18970580 !ruby/object:Gem::Requirement
51
41
  none: false
52
42
  requirements:
53
43
  - - ! '>='
@@ -55,15 +45,10 @@ dependencies:
55
45
  version: 0.8.7
56
46
  type: :development
57
47
  prerelease: false
58
- version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
- requirements:
61
- - - ! '>='
62
- - !ruby/object:Gem::Version
63
- version: 0.8.7
48
+ version_requirements: *18970580
64
49
  - !ruby/object:Gem::Dependency
65
50
  name: sass
66
- requirement: !ruby/object:Gem::Requirement
51
+ requirement: &18970100 !ruby/object:Gem::Requirement
67
52
  none: false
68
53
  requirements:
69
54
  - - ! '>='
@@ -71,15 +56,10 @@ dependencies:
71
56
  version: 3.1.0
72
57
  type: :development
73
58
  prerelease: false
74
- version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
- requirements:
77
- - - ! '>='
78
- - !ruby/object:Gem::Version
79
- version: 3.1.0
59
+ version_requirements: *18970100
80
60
  - !ruby/object:Gem::Dependency
81
61
  name: minitest
82
- requirement: !ruby/object:Gem::Requirement
62
+ requirement: &18969540 !ruby/object:Gem::Requirement
83
63
  none: false
84
64
  requirements:
85
65
  - - ! '>='
@@ -87,15 +67,10 @@ dependencies:
87
67
  version: '0'
88
68
  type: :development
89
69
  prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
- requirements:
93
- - - ! '>='
94
- - !ruby/object:Gem::Version
95
- version: '0'
70
+ version_requirements: *18969540
96
71
  - !ruby/object:Gem::Dependency
97
72
  name: kramdown
98
- requirement: !ruby/object:Gem::Requirement
73
+ requirement: &18968820 !ruby/object:Gem::Requirement
99
74
  none: false
100
75
  requirements:
101
76
  - - ! '>='
@@ -103,15 +78,10 @@ dependencies:
103
78
  version: '0'
104
79
  type: :development
105
80
  prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- none: false
108
- requirements:
109
- - - ! '>='
110
- - !ruby/object:Gem::Version
111
- version: '0'
81
+ version_requirements: *18968820
112
82
  - !ruby/object:Gem::Dependency
113
83
  name: creole
114
- requirement: !ruby/object:Gem::Requirement
84
+ requirement: &18967940 !ruby/object:Gem::Requirement
115
85
  none: false
116
86
  requirements:
117
87
  - - ! '>='
@@ -119,15 +89,10 @@ dependencies:
119
89
  version: '0'
120
90
  type: :development
121
91
  prerelease: false
122
- version_requirements: !ruby/object:Gem::Requirement
123
- none: false
124
- requirements:
125
- - - ! '>='
126
- - !ruby/object:Gem::Version
127
- version: '0'
92
+ version_requirements: *18967940
128
93
  - !ruby/object:Gem::Dependency
129
94
  name: builder
130
- requirement: !ruby/object:Gem::Requirement
95
+ requirement: &18966900 !ruby/object:Gem::Requirement
131
96
  none: false
132
97
  requirements:
133
98
  - - ! '>='
@@ -135,12 +100,7 @@ dependencies:
135
100
  version: '0'
136
101
  type: :development
137
102
  prerelease: false
138
- version_requirements: !ruby/object:Gem::Requirement
139
- none: false
140
- requirements:
141
- - - ! '>='
142
- - !ruby/object:Gem::Version
143
- version: '0'
103
+ version_requirements: *18966900
144
104
  description: Slim is a template language whose goal is reduce the syntax to the essential
145
105
  parts without becoming cryptic.
146
106
  email:
@@ -174,8 +134,9 @@ files:
174
134
  - benchmarks/view.slim
175
135
  - bin/slimrb
176
136
  - lib/slim.rb
137
+ - lib/slim/boolean_attributes.rb
177
138
  - lib/slim/command.rb
178
- - lib/slim/compiler.rb
139
+ - lib/slim/control_structures.rb
179
140
  - lib/slim/embedded_engine.rb
180
141
  - lib/slim/end_inserter.rb
181
142
  - lib/slim/engine.rb
@@ -186,10 +147,30 @@ files:
186
147
  - lib/slim/logic_less/filter.rb
187
148
  - lib/slim/logic_less/wrapper.rb
188
149
  - lib/slim/parser.rb
150
+ - lib/slim/splat_attributes.rb
189
151
  - lib/slim/template.rb
190
152
  - lib/slim/translator.rb
191
153
  - lib/slim/version.rb
192
154
  - slim.gemspec
155
+ - test/core/helper.rb
156
+ - test/core/test_code_blocks.rb
157
+ - test/core/test_code_escaping.rb
158
+ - test/core/test_code_evaluation.rb
159
+ - test/core/test_code_output.rb
160
+ - test/core/test_code_structure.rb
161
+ - test/core/test_embedded_engines.rb
162
+ - test/core/test_encoding.rb
163
+ - test/core/test_html_attributes.rb
164
+ - test/core/test_html_escaping.rb
165
+ - test/core/test_html_structure.rb
166
+ - test/core/test_parser_errors.rb
167
+ - test/core/test_pretty.rb
168
+ - test/core/test_ruby_errors.rb
169
+ - test/core/test_slim_template.rb
170
+ - test/core/test_text_interpolation.rb
171
+ - test/core/test_thread_options.rb
172
+ - test/logic_less/test_logic_less.rb
173
+ - test/logic_less/test_wrapper.rb
193
174
  - test/rails/Rakefile
194
175
  - test/rails/app/controllers/application_controller.rb
195
176
  - test/rails/app/controllers/parents_controller.rb
@@ -206,10 +187,10 @@ files:
206
187
  - test/rails/app/views/slim/content_for.html.slim
207
188
  - test/rails/app/views/slim/erb.html.erb
208
189
  - test/rails/app/views/slim/integers.html.slim
209
- - test/rails/app/views/slim/nil.html.slim
210
190
  - test/rails/app/views/slim/no_layout.html.slim
211
191
  - test/rails/app/views/slim/normal.html.slim
212
192
  - test/rails/app/views/slim/partial.html.slim
193
+ - test/rails/app/views/slim/thread_options.html.slim
213
194
  - test/rails/app/views/slim/variables.html.slim
214
195
  - test/rails/config.ru
215
196
  - test/rails/config/application.rb
@@ -230,25 +211,7 @@ files:
230
211
  - test/rails/script/rails
231
212
  - test/rails/test/helper.rb
232
213
  - test/rails/test/test_slim.rb
233
- - test/slim/helper.rb
234
- - test/slim/logic_less/test_logic_less.rb
235
- - test/slim/logic_less/test_wrapper.rb
236
- - test/slim/test_chain_manipulation.rb
237
- - test/slim/test_code_blocks.rb
238
- - test/slim/test_code_escaping.rb
239
- - test/slim/test_code_evaluation.rb
240
- - test/slim/test_code_output.rb
241
- - test/slim/test_code_structure.rb
242
- - test/slim/test_embedded_engines.rb
243
- - test/slim/test_encoding.rb
244
- - test/slim/test_html_escaping.rb
245
- - test/slim/test_html_structure.rb
246
- - test/slim/test_parser_errors.rb
247
- - test/slim/test_pretty.rb
248
- - test/slim/test_ruby_errors.rb
249
- - test/slim/test_slim_template.rb
250
- - test/slim/test_text_interpolation.rb
251
- - test/slim/translator/test_translator.rb
214
+ - test/translator/test_translator.rb
252
215
  homepage: http://slim-lang.com/
253
216
  licenses: []
254
217
  post_install_message:
@@ -270,9 +233,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
270
233
  version: '0'
271
234
  requirements: []
272
235
  rubyforge_project: slim
273
- rubygems_version: 1.8.24
236
+ rubygems_version: 1.8.15
274
237
  signing_key:
275
238
  specification_version: 3
276
239
  summary: Slim is a template language.
277
240
  test_files: []
278
- has_rdoc:
@@ -1,194 +0,0 @@
1
- module Slim
2
- # @api private
3
- class Compiler < Filter
4
- def call(exp)
5
- @attr_delimiter, @splat_used = unique_name, false
6
- exp = compile(exp)
7
- if @splat_used
8
- [:multi, [:code, "#{@attr_delimiter} = #{@options[:attr_delimiter].inspect}"], exp]
9
- else
10
- exp
11
- end
12
- end
13
-
14
- # Handle control expression `[:slim, :control, code, content]`
15
- #
16
- # @param [String] code Ruby code
17
- # @param [Array] content Temple expression
18
- # @return [Array] Compiled temple expression
19
- def on_slim_control(code, content)
20
- [:multi,
21
- [:code, code],
22
- compile(content)]
23
- end
24
-
25
- # Handle output expression `[:slim, :output, escape, code, content]`
26
- #
27
- # @param [Boolean] escape Escape html
28
- # @param [String] code Ruby code
29
- # @param [Array] content Temple expression
30
- # @return [Array] Compiled temple expression
31
- def on_slim_output(escape, code, content)
32
- if empty_exp?(content)
33
- [:multi, [:escape, escape, [:dynamic, code]], content]
34
- else
35
- tmp = unique_name
36
-
37
- [:multi,
38
- # Capture the result of the code in a variable. We can't do
39
- # `[:dynamic, code]` because it's probably not a complete
40
- # expression (which is a requirement for Temple).
41
- [:block, "#{tmp} = #{code}",
42
-
43
- # Capture the content of a block in a separate buffer. This means
44
- # that `yield` will not output the content to the current buffer,
45
- # but rather return the output.
46
- #
47
- # The capturing can be disabled with the option :disable_capture.
48
- # Output code in the block writes directly to the output buffer then.
49
- # Rails handles this by replacing the output buffer for helpers.
50
- options[:disable_capture] ? compile(content) : [:capture, unique_name, compile(content)]],
51
-
52
- # Output the content.
53
- [:escape, escape, [:dynamic, tmp]]]
54
- end
55
- end
56
-
57
- # Handle text expression `[:slim, :text, content]`
58
- #
59
- # @param [Array] content Temple expression
60
- # @return [Array] Compiled temple expression
61
- def on_slim_text(content)
62
- compile(content)
63
- end
64
-
65
- # Handle tag expression `[:slim, :tag, name, attrs, content]`
66
- #
67
- # @param [String] name Tag name
68
- # @param [Array] attrs Temple expression
69
- # @param [Array] content Temple expression
70
- # @return [Array] Compiled temple expression
71
- def on_slim_tag(name, attrs, content = nil)
72
- if name == '*'
73
- hash, merger, formatter = splat_attributes(attrs[2..-1])
74
- tmp = unique_name
75
- tag = [:multi,
76
- merger,
77
- [:code, "#{tmp} = #{hash}.delete('tag').to_s"],
78
- [:if, "#{tmp}.empty?",
79
- [:code, "#{tmp} = #{@options[:default_tag].inspect}"]],
80
- [:static, '<'],
81
- [:dynamic, "#{tmp}"],
82
- formatter]
83
- tag << if content
84
- [:multi,
85
- [:static, '>'],
86
- compile(content),
87
- [:static, '</'],
88
- [:dynamic, "#{tmp}"],
89
- [:static, '>']]
90
- else
91
- [:static, '/>']
92
- end
93
- else
94
- tag = [:html, :tag, name, compile(attrs)]
95
- content ? (tag << compile(content)) : tag
96
- end
97
- end
98
-
99
- # Handle attributes expression `[:slim, :attrs, *attrs]`
100
- #
101
- # @param [Array] attrs Array of temple expressions
102
- # @return [Array] Compiled temple expression
103
- def on_slim_attrs(*attrs)
104
- if attrs.any? {|attr| attr[1] == :splat}
105
- hash, merger, formatter = splat_attributes(attrs)
106
- [:multi, merger, formatter]
107
- else
108
- [:html, :attrs, *attrs.map {|a| compile(a) }]
109
- end
110
- end
111
-
112
- # Handle attribute expression `[:slim, :attr, escape, code]`
113
- #
114
- # @param [Boolean] escape Escape html
115
- # @param [String] code Ruby code
116
- # @return [Array] Compiled temple expression
117
- def on_slim_attr(name, escape, code)
118
- value = case code
119
- when 'true'
120
- [:static, name]
121
- when 'false', 'nil'
122
- [:multi]
123
- else
124
- tmp = unique_name
125
- [:multi,
126
- [:code, "#{tmp} = #{code}"],
127
- [:case, tmp,
128
- ['true', [:static, name]],
129
- ['false, nil', [:multi]],
130
- [:else,
131
- [:escape, escape, [:dynamic,
132
- if delimiter = options[:attr_delimiter][name]
133
- "#{tmp}.respond_to?(:join) ? #{tmp}.flatten.compact.join(#{delimiter.inspect}) : #{tmp}"
134
- else
135
- tmp
136
- end
137
- ]]]]]
138
- end
139
- [:html, :attr, name, value]
140
- end
141
-
142
- protected
143
-
144
- def splat_attributes(attrs)
145
- @splat_used = true
146
-
147
- hash, name, value, tmp = unique_name, unique_name, unique_name, unique_name
148
-
149
- merger = [:multi, [:code, "#{hash} = {}"]]
150
- attrs.each do |attr|
151
- merger << if attr[0] == :html && attr[1] == :attr
152
- [:multi,
153
- [:capture, tmp, compile(attr[3])],
154
- [:code, "(#{hash}[#{attr[2].inspect}] ||= []) << #{tmp}"]]
155
- elsif attr[0] == :slim
156
- if attr[1] == :attr
157
- [:code, "(#{hash}[#{attr[2].inspect}] ||= []) << (#{attr[4]})"]
158
- elsif attr[1] == :splat
159
- [:code, "(#{attr[2]}).each {|#{name},#{value}| (#{hash}[#{name}.to_s] ||= []) << (#{value}) }"]
160
- else
161
- attr
162
- end
163
- else
164
- attr
165
- end
166
- end
167
-
168
- merger << [:block, "#{hash}.keys.each do |#{name}|",
169
- [:multi,
170
- [:code, "#{value} = #{hash}[#{name}]"],
171
- [:code, "#{value}.flatten!"],
172
- [:block, "#{value}.map! do |#{tmp}|",
173
- [:case, tmp,
174
- ['true', [:code, name]],
175
- ['false, nil', [:multi]],
176
- [:else, [:code, tmp]]]],
177
- [:if, "#{value}.size > 1 && !#{@attr_delimiter}[#{name}]",
178
- [:code, "raise(\"Multiple #\{#{name}\} attributes specified\")"]],
179
- [:code, "#{hash}[#{name}] = #{value}.compact.join(#{@attr_delimiter}[#{name}].to_s)"]]]
180
-
181
- attr = [:multi,
182
- [:static, ' '],
183
- [:dynamic, name],
184
- [:static, "=#{options[:attr_wrapper]}"],
185
- [:escape, true, [:dynamic, value]],
186
- [:static, options[:attr_wrapper]]]
187
- attr = [:if, "!#{value}.empty?", attr] if options[:remove_empty_attrs]
188
- enumerator = options[:sort_attrs] ? "#{hash}.sort_by {|#{name},#{value}| #{name} }" : hash
189
- formatter = [:block, "#{enumerator}.each do |#{name},#{value}|", attr]
190
-
191
- return hash, merger, formatter
192
- end
193
- end
194
- end
@@ -1 +0,0 @@
1
- p= @nil
@@ -1,42 +0,0 @@
1
- require 'helper'
2
-
3
- class TestSlimChainManipulation < TestSlim
4
- def test_replace
5
- source = %q{
6
- p Test
7
- }
8
- chain = proc do |engine|
9
- engine.replace(:Pretty, :ReplacementFilter) do |exp|
10
- [:dynamic, '1+1']
11
- end
12
- end
13
-
14
- assert_html '2', source, :chain => chain
15
- end
16
-
17
- def test_before
18
- source = %q{
19
- p Test
20
- }
21
- chain = proc do |engine|
22
- engine.before(Slim::Parser, :WrapInput) do |input|
23
- "p Header\n#{input}\np Footer"
24
- end
25
- end
26
-
27
- assert_html '<p>Header</p><p>Test</p><p>Footer</p>', source, :chain => chain
28
- end
29
-
30
- def test_after
31
- source = %q{
32
- p Test
33
- }
34
- chain = proc do |engine|
35
- engine.after(Slim::Parser, :ReplaceParsedExp) do |exp|
36
- [:slim, :output, false, '1+1', [:multi]]
37
- end
38
- end
39
-
40
- assert_html '2', source, :chain => chain
41
- end
42
- end