slim 0.8.3 → 0.8.4

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.
data/README.md CHANGED
@@ -233,6 +233,10 @@ Here's a quick example to demonstrate what a Slim template looks like:
233
233
  h1 id="headline"
234
234
  == page_headline
235
235
 
236
+ Alternatively, if you prefer to use single equal sign, you may do so by setting the `auto_escape` option to false.
237
+
238
+ Slim::Engine.default_options[:auto_escape] = false
239
+
236
240
  ### Treat multiple lines of code as text that should bypass parsing
237
241
 
238
242
  Use a pipe (`|`) or single quote (`` ' ``) to start the escape.
@@ -332,5 +336,6 @@ This project is released under the MIT license.
332
336
  ## Slim related projects
333
337
 
334
338
  * [Textmate bundle](https://github.com/fredwu/ruby-slim-textmate-bundle)
339
+ * [Haml2Slim converter](https://github.com/fredwu/haml2slim)
335
340
  * [Rails 3 Generators](https://github.com/leogalmeida/slim-rails)
336
341
  * [Slim for Clojure](https://github.com/chaslemley/slim.clj)
data/lib/slim/compiler.rb CHANGED
@@ -2,7 +2,7 @@ module Slim
2
2
  # Compiles Slim expressions into Temple::HTML expressions.
3
3
  # @api private
4
4
  class Compiler < Filter
5
- set_default_options :disable_capture => false
5
+ set_default_options :auto_escape => true
6
6
 
7
7
  # Handle control expression `[:slim, :control, code, content]`
8
8
  #
@@ -15,6 +15,14 @@ module Slim
15
15
  compile!(content)]
16
16
  end
17
17
 
18
+ # Handle comment expression `[:slim, :comment, content]`
19
+ #
20
+ # @param [Array] content Temple expression
21
+ # @return [Array] Compiled temple expression
22
+ def on_slim_comment(content)
23
+ [:html, :comment, compile!(content)]
24
+ end
25
+
18
26
  # Handle output expression `[:slim, :output, escape, code, content]`
19
27
  #
20
28
  # @param [Boolean] escape Escape html
@@ -23,7 +31,7 @@ module Slim
23
31
  # @return [Array] Compiled temple expression
24
32
  def on_slim_output(escape, code, content)
25
33
  if empty_exp?(content)
26
- [:multi, escape ? [:escape, :dynamic, code] : [:dynamic, code], content]
34
+ [:multi, escape && options[:auto_escape] ? [:escape, :dynamic, code] : [:dynamic, code], content]
27
35
  else
28
36
  on_slim_output_block(escape, code, content)
29
37
  end
@@ -66,7 +74,7 @@ module Slim
66
74
  # @param [String] type Directive type
67
75
  # @return [Array] Compiled temple expression
68
76
  def on_slim_directive(type)
69
- if type =~ /^doctype/
77
+ if type =~ /^doctype/i
70
78
  [:html, :doctype, $'.strip]
71
79
  end
72
80
  end
data/lib/slim/engine.rb CHANGED
@@ -7,26 +7,46 @@ module Slim
7
7
  # # Indent html for pretty debugging
8
8
  # Slim::Engine.set_default_options :pretty => true
9
9
  #
10
+ # This overwrites some temple default options.
10
11
  set_default_options :pretty => false,
11
12
  :attr_wrapper => '"',
12
13
  :format => :html5,
13
14
  :id_delimiter => nil,
14
- :generator => Temple::Generators::ArrayBuffer,
15
- :disable_capture => false,
16
- :debug => false
15
+ :generator => Temple::Generators::ArrayBuffer
17
16
 
17
+ # Document all supported options with purpose, type etc.
18
+ #
19
+ # Type | Name | Default value | Purpose
20
+ # --------------------------------------------------------------------------------------------------------------------------------------------
21
+ # String | :file | nil | Name of parsed file, set automatically by Slim::Template
22
+ # Integer | :tabsize | 4 | Number of whitespaces per tab (used by the parser)
23
+ # String list | :enable_engines | All enabled | List of enabled embedded engines (whitelist)
24
+ # String list | :disable_engines | None disabled | List of disabled embedded engines (blacklist)
25
+ # Boolean | :sections | false | Enable sections mode (logic-less)
26
+ # String | :dictionary | "self" | Name of dictionary variable in sections mode
27
+ # Symbol | :dictionary_access | :wrapped | Access mode of dictionary variable (:wrapped, :symbol, :string)
28
+ # Boolean | :disable_capture | false (true in Rails) | Disable capturing in blocks (blocks write to the default buffer then)
29
+ # Boolean | :auto_escape | true | Enable automatic escaping of strings
30
+ # Boolean | :use_html_safe | false (true in Rails) | Use String#html_safe? from ActiveSupport (Works together with :auto_escape)
31
+ # Boolean | :debug | false | Enable debug outputs (Temple internals)
32
+ # Symbol | :format | :html5 | HTML output format
33
+ # String | :attr_wrapper | '"' | Character to wrap attributes in html (can be ' or ")
34
+ # String | :id_delimiter | '_' | Joining character used if multiple html ids are supplied (e.g. #id1#id2)
35
+ # Boolean | :pretty | false | Pretty html indenting (This is slower!)
36
+ # Class | :generator | ArrayBuffer/RailsOutputBuffer | Temple code generator (defaults generates array buffer)
18
37
  use Slim::Parser, :file, :tabsize
19
38
  use Slim::EmbeddedEngine, :enable_engines, :disable_engines
20
39
  use Slim::Interpolation
21
40
  use Slim::Sections, :sections, :dictionary, :dictionary_access
22
41
  use Slim::EndInserter
23
- use Slim::Compiler, :disable_capture
42
+ use Slim::Compiler, :disable_capture, :auto_escape
24
43
  filter :EscapeHTML, :use_html_safe
44
+ filter :Debugger, :debug, :debug_prefix => 'After Slim'
25
45
  use Temple::HTML::Pretty, :format, :attr_wrapper, :id_delimiter, :pretty
26
46
  filter :MultiFlattener
27
47
  filter :StaticMerger
28
48
  filter :DynamicInliner
29
- filter :Debugger, :debug, :debug_prefix, :debug_pretty
49
+ filter :Debugger, :debug, :debug_prefix => 'Optimized code'
30
50
  chain << proc {|options| options[:generator].new }
31
51
  end
32
52
  end
data/lib/slim/filter.rb CHANGED
@@ -9,6 +9,10 @@ module Slim
9
9
  [:slim, :control, code, compile!(content)]
10
10
  end
11
11
 
12
+ def on_slim_comment(content)
13
+ [:slim, :comment, compile!(content)]
14
+ end
15
+
12
16
  def on_slim_output(code, escape, content)
13
17
  [:slim, :output, code, escape, compile!(content)]
14
18
  end
data/lib/slim/parser.rb CHANGED
@@ -69,7 +69,7 @@ module Slim
69
69
  # Hello
70
70
  # World!
71
71
  #
72
- block_indent, in_slim_comment, in_html_comment, text_indent = nil, false, false, nil
72
+ block_indent, text_indent, in_comment = nil, nil, false
73
73
 
74
74
  str.each_line do |line|
75
75
  lineno += 1
@@ -107,7 +107,7 @@ module Slim
107
107
  # This line happens to be indented deeper (or equal) than the block start character (|, ', /).
108
108
  # This means that it's a part of the block.
109
109
 
110
- if !in_slim_comment
110
+ if !in_comment
111
111
  # The indentation of first line of the text block determines the text base indentation.
112
112
  newline = text_indent ? "\n" : ''
113
113
  text_indent ||= indent
@@ -124,15 +124,10 @@ module Slim
124
124
  next
125
125
  end
126
126
 
127
- # Closes the html comment
128
- if in_html_comment
129
- stacks.last << [:static, '-->']
130
- end
131
-
132
127
  # It's guaranteed that we're now *not* in a block, because
133
128
  # the indent was less than the block start indent.
134
129
  block_indent = text_indent = nil
135
- in_slim_comment = in_html_comment = false
130
+ in_comment = false
136
131
  end
137
132
 
138
133
  # If there's more stacks than indents, it means that the previous
@@ -170,24 +165,26 @@ module Slim
170
165
  case line[0]
171
166
  when ?|, ?', ?/
172
167
  # Found a block.
168
+ ch = line.slice!(0)
173
169
 
174
170
  # We're now expecting the next line to be indented, so we'll need
175
171
  # to push a block to the stack.
176
172
  block = [:multi]
177
- stacks.last << (line[0] == ?' ? [:multi, block, [:slim, :text, ' ']] : block)
173
+ stacks.last << if ch == ?'
174
+ # Additional whitespace in front
175
+ [:multi, block, [:slim, :text, ' ']]
176
+ elsif ch == ?/ && line[0] == ?!
177
+ # HTML comment
178
+ line.slice!(0)
179
+ [:slim, :comment, block]
180
+ else
181
+ in_comment = ch == ?/
182
+ block
183
+ end
178
184
  stacks << block
179
185
  block_indent = indent
180
186
 
181
- in_slim_comment = line[0] == ?/ && line[1] != ?!
182
- in_html_comment = line[0] == ?/ && line[1] == ?! && line.slice!(0)
183
- line.slice!(0)
184
-
185
- # We're entering a block of html comments, so let's add an opening tag
186
- if in_html_comment
187
- block << [:static, '<!--']
188
- end
189
-
190
- if !in_slim_comment && !line.strip.empty?
187
+ if !in_comment && !line.strip.empty?
191
188
  block << [:slim, :text, line.sub(/^( )/, '')]
192
189
  text_indent = block_indent + ($1 ? 2 : 1)
193
190
  end
data/lib/slim/sections.rb CHANGED
@@ -17,6 +17,8 @@ module Slim
17
17
  def compile(exp)
18
18
  if options[:sections]
19
19
  # Store the dictionary in the _slimdict variable
20
+ dictionary = options[:dictionary]
21
+ dictionary = "Slim::Wrapper.new(#{dictionary})" if options[:dictionary_access] == :wrapped
20
22
  [:multi,
21
23
  [:block, "_slimdict = #{dictionary}"],
22
24
  super]
@@ -52,6 +54,7 @@ module Slim
52
54
  [:block, "if #{tmp1} == true"],
53
55
  content,
54
56
  [:block, 'else'],
57
+ # Wrap map in array because maps implement each
55
58
  [:block, "#{tmp1} = [#{tmp1}] if #{tmp1}.respond_to?(:has_key?) || !#{tmp1}.respond_to?(:map)"],
56
59
  [:block, "#{tmp2} = _slimdict"],
57
60
  [:block, "#{tmp1}.each do |_slimdict|"],
@@ -67,7 +70,10 @@ module Slim
67
70
  [:slim, :output, escape, access(name), content]
68
71
  end
69
72
 
73
+ private
74
+
70
75
  def access(name)
76
+ return name if name == 'yield'
71
77
  case options[:dictionary_access]
72
78
  when :string
73
79
  "_slimdict[#{name.to_s.inspect}]"
@@ -75,14 +81,5 @@ module Slim
75
81
  "_slimdict[#{name.to_sym.inspect}]"
76
82
  end
77
83
  end
78
-
79
- def dictionary
80
- if options[:dictionary_access] == :wrapped
81
- "Slim::Wrapper.new(#{options[:dictionary]})"
82
- else
83
- options[:dictionary]
84
- end
85
- end
86
-
87
84
  end
88
85
  end
data/lib/slim/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Slim
2
- VERSION = '0.8.3'
2
+ VERSION = '0.8.4'
3
3
  end
data/lib/slim/wrapper.rb CHANGED
@@ -1,9 +1,5 @@
1
1
  module Slim
2
2
  # For logic-less mode, objects can be encased in the Wrapper class.
3
- #
4
- # For Rails, this allows us to use the environment provided for rendering
5
- # a view including the instance variables, view helper and application helper
6
- # methods.
7
3
  class Wrapper
8
4
  attr_reader :value, :parent
9
5
 
@@ -24,15 +20,13 @@ module Slim
24
20
  # go through the same steps on the parent object. This is useful when
25
21
  # you are iterating over objects.
26
22
  def [](name)
27
- if value.respond_to?(name)
28
- wrap value.send(name)
29
- elsif value.respond_to?(:has_key?) && value.has_key?(name.to_sym)
30
- wrap value[name]
31
- elsif value.instance_variable_defined?("@#{name}")
32
- wrap value.instance_variable_get("@#{name}")
33
- elsif parent
34
- parent[name]
23
+ return wrap(value.send(name)) if value.respond_to?(name)
24
+ if value.respond_to?(:has_key?)
25
+ return wrap(value[name.to_sym]) if value.has_key?(name.to_sym)
26
+ return wrap(value[name.to_s]) if value.has_key?(name.to_s)
35
27
  end
28
+ return wrap(value.instance_variable_get("@#{name}")) if value.instance_variable_defined?("@#{name}")
29
+ parent[name] if parent
36
30
  end
37
31
 
38
32
  # Empty objects must appear empty for inverted sections
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 8
8
- - 3
9
- version: 0.8.3
8
+ - 4
9
+ version: 0.8.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Andrew Stone
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-12-23 00:00:00 +11:00
19
+ date: 2011-01-26 00:00:00 -05:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -30,8 +30,8 @@ dependencies:
30
30
  segments:
31
31
  - 0
32
32
  - 1
33
- - 6
34
- version: 0.1.6
33
+ - 7
34
+ version: 0.1.7
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -44,8 +44,8 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  segments:
46
46
  - 1
47
- - 1
48
- version: "1.1"
47
+ - 2
48
+ version: "1.2"
49
49
  type: :runtime
50
50
  version_requirements: *id002
51
51
  - !ruby/object:Gem::Dependency