haml-edge 2.3.169 → 2.3.170

Sign up to get free protection for your applications and to get access to all the features.
data/.yardopts CHANGED
@@ -2,6 +2,7 @@
2
2
  --markup markdown
3
3
  --markup-provider maruku
4
4
  --default-return ""
5
+ --title "Haml/Sass Documentation"
5
6
  --hide-void-return
6
7
  --protected
7
8
  --no-private
data/EDGE_GEM_VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.169
1
+ 2.3.170
data/Rakefile CHANGED
@@ -90,7 +90,7 @@ end
90
90
  task :release_elpa do
91
91
  require 'tlsmail'
92
92
  require 'time'
93
- require 'haml'
93
+ require scope('lib/haml')
94
94
 
95
95
  version = Haml.version[:number]
96
96
 
@@ -257,6 +257,7 @@ begin
257
257
  files = FileList.new(scope('doc-src/*')).to_a.sort_by {|s| s.size} + %w[MIT-LICENSE VERSION]
258
258
  t.options << '--files' << files.join(',')
259
259
  t.options << '--template-path' << scope('yard')
260
+ t.options << '--title' << ENV["YARD_TITLE"] if ENV["YARD_TITLE"]
260
261
  end
261
262
  Rake::Task['yard'].prerequisites.insert(0, 'yard:sass')
262
263
  Rake::Task['yard'].instance_variable_set('@comment', nil)
@@ -367,12 +368,12 @@ namespace :test do
367
368
  task :rails_compatibility do
368
369
  `rm -rf test/rails`
369
370
  puts "Checking out rails. Please wait."
370
- system("git clone ~/code/rails test/rails") rescue nil
371
+ system("git clone git://github.com/rails/rails.git test/rails") rescue nil
371
372
  begin
372
373
  rails_versions.each {|version| test_rails_version version}
373
374
 
374
375
  puts "Checking out rails_xss. Please wait."
375
- system("git clone ~/code/rails_xss test/plugins/rails_xss")
376
+ system("git clone git://github.com/NZKoz/rails_xss.git test/plugins/rails_xss")
376
377
  test_rails_version(rails_versions.find {|s| s =~ /^v2\.3/})
377
378
  ensure
378
379
  `rm -rf test/rails`
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.169
1
+ 2.3.170
data/extra/haml-mode.el CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ;; Author: Nathan Weizenbaum
6
6
  ;; URL: http://github.com/nex3/haml/tree/master
7
- ;; Version: 2.2.20
7
+ ;; Version: 2.2.21
8
8
  ;; Created: 2007-03-08
9
9
  ;; By: Nathan Weizenbaum
10
10
  ;; Keywords: markup, language, html
data/extra/sass-mode.el CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  ;; Author: Nathan Weizenbaum
6
6
  ;; URL: http://github.com/nex3/haml/tree/master
7
- ;; Version: 2.2.20
7
+ ;; Version: 2.2.21
8
8
  ;; Created: 2007-03-15
9
9
  ;; By: Nathan Weizenbaum
10
10
  ;; Keywords: markup, language, css
11
- ;; Package-Requires: ((haml-mode "2.2.20"))
11
+ ;; Package-Requires: ((haml-mode "2.2.21"))
12
12
 
13
13
  ;;; Commentary:
14
14
 
data/lib/haml.rb CHANGED
@@ -38,3 +38,4 @@ end
38
38
 
39
39
  require 'haml/util'
40
40
  require 'haml/engine'
41
+ require 'haml/railtie'
data/lib/haml/buffer.rb CHANGED
@@ -233,10 +233,11 @@ RUBY
233
233
 
234
234
  # Merges two attribute hashes.
235
235
  # This is the same as `to.merge!(from)`,
236
- # except that it merges id and class attributes.
236
+ # except that it merges id, class, and data attributes.
237
237
  #
238
238
  # ids are concatenated with `"_"`,
239
239
  # and classes are concatenated with `" "`.
240
+ # data hashes are simply merged.
240
241
  #
241
242
  # Destructively modifies both `to` and `from`.
242
243
  #
@@ -244,12 +245,14 @@ RUBY
244
245
  # @param from [{String => #to_s}] The attribute hash to merge from
245
246
  # @return [{String => String}] `to`, after being merged
246
247
  def self.merge_attrs(to, from)
248
+ from['id'] = Precompiler.filter_and_join(from['id'], '_') if from['id']
247
249
  if to['id'] && from['id']
248
250
  to['id'] << '_' << from.delete('id').to_s
249
251
  elsif to['id'] || from['id']
250
252
  from['id'] ||= to['id']
251
253
  end
252
254
 
255
+ from['class'] = Precompiler.filter_and_join(from['class'], ' ') if from['class']
253
256
  if to['class'] && from['class']
254
257
  # Make sure we don't duplicate class names
255
258
  from['class'] = (from['class'].to_s.split(' ') | to['class'].split(' ')).sort.join(' ')
@@ -257,6 +260,16 @@ RUBY
257
260
  from['class'] ||= to['class']
258
261
  end
259
262
 
263
+ from_data = from['data'].is_a?(Hash)
264
+ to_data = to['data'].is_a?(Hash)
265
+ if from_data && to_data
266
+ to['data'] = to['data'].merge(from['data'])
267
+ elsif to_data
268
+ to = Haml::Util.map_keys(to.delete('data')) {|name| "data-#{name}"}.merge(to)
269
+ elsif from_data
270
+ from = Haml::Util.map_keys(from.delete('data')) {|name| "data-#{name}"}.merge(from)
271
+ end
272
+
260
273
  to.merge!(from)
261
274
  end
262
275
 
data/lib/haml/exec.rb CHANGED
@@ -232,6 +232,10 @@ END
232
232
  'Output style. Can be nested (default), compact, compressed, or expanded.') do |name|
233
233
  @options[:for_engine][:style] = name.to_sym
234
234
  end
235
+ opts.on('-g', '--debug-info',
236
+ 'Emit extra information in the generated CSS that can be used by the FireSass Firebug plugin.') do
237
+ @options[:for_engine][:debug_info] = true
238
+ end
235
239
  opts.on('-l', '--line-numbers', '--line-comments',
236
240
  'Emit comments in the generated CSS indicating the corresponding sass line.') do
237
241
  @options[:for_engine][:line_numbers] = true
data/lib/haml/filters.rb CHANGED
@@ -100,8 +100,10 @@ module Haml
100
100
  if contains_interpolation?(text)
101
101
  return if options[:suppress_eval]
102
102
 
103
- push_script <<RUBY, :escape_html => false
104
- find_and_preserve(#{filter.inspect}.render_with_options(#{unescape_interpolation(text)}, _hamlout.options))
103
+ text = unescape_interpolation(text).gsub("\\n", "\n")
104
+ newline if text.gsub!(/\n"\Z/, "\\n\"")
105
+ push_script <<RUBY.strip, :escape_html => false
106
+ find_and_preserve(#{filter.inspect}.render_with_options(#{text}, _hamlout.options))
105
107
  RUBY
106
108
  return
107
109
  end
@@ -113,6 +115,10 @@ RUBY
113
115
  else
114
116
  push_text(rendered.rstrip)
115
117
  end
118
+
119
+ (text.count("\n") - 1).times {newline}
120
+ resolve_newlines
121
+ newline
116
122
  end
117
123
  end
118
124
 
data/lib/haml/helpers.rb CHANGED
@@ -234,6 +234,33 @@ MESSAGE
234
234
  haml_buffer.tabulation -= i
235
235
  end
236
236
 
237
+ # Sets the number of tabs the buffer automatically adds
238
+ # to the lines of the template,
239
+ # but only for the duration of the block.
240
+ # For example:
241
+ #
242
+ # %h1 foo
243
+ # - with_tabs(2) do
244
+ # %p bar
245
+ # %strong baz
246
+ #
247
+ # Produces:
248
+ #
249
+ # <h1>foo</h1>
250
+ # <p>bar</p>
251
+ # <strong>baz</strong>
252
+ #
253
+ #
254
+ # @param i [Fixnum] The number of tabs to use
255
+ # @yield A block in which the indentation will be `i` spaces
256
+ def with_tabs(i)
257
+ old_tabs = haml_buffer.tabulation
258
+ haml_buffer.tabulation = i
259
+ yield
260
+ ensure
261
+ haml_buffer.tabulation = old_tabs
262
+ end
263
+
237
264
  # Surrounds a block of Haml code with strings,
238
265
  # with no whitespace in between.
239
266
  # For example:
@@ -131,52 +131,91 @@ module ActionView
131
131
  end
132
132
  end
133
133
 
134
- module FormTagHelper
135
- def form_tag_with_haml(url_for_options = {}, options = {}, *parameters_for_url, &proc)
136
- if is_haml?
137
- if block_given?
134
+ if Haml::Util.ap_geq_3?
135
+ module FormTagHelper
136
+ def form_tag_with_haml(url_for_options = {}, options = {}, *parameters_for_url, &proc)
137
+ if is_haml?
138
+ if block_given?
139
+ oldproc = proc
140
+ proc = haml_bind_proc do |*args|
141
+ concat "\n"
142
+ with_tabs(1) {oldproc.call(*args)}
143
+ end
144
+ end
145
+ res = form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc) + "\n"
146
+ res << "\n" if block_given?
147
+ res
148
+ else
149
+ form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc)
150
+ end
151
+ end
152
+ alias_method :form_tag_without_haml, :form_tag
153
+ alias_method :form_tag, :form_tag_with_haml
154
+ end
155
+
156
+ module FormHelper
157
+ def form_for_with_haml(object_name, *args, &proc)
158
+ if block_given? && is_haml?
138
159
  oldproc = proc
139
160
  proc = haml_bind_proc do |*args|
140
- concat "\n"
141
- tab_up
142
- oldproc.call(*args)
143
- tab_down
144
- concat haml_indent
161
+ with_tabs(1) {oldproc.call(*args)}
145
162
  end
146
- concat haml_indent
147
- end
148
- res = form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc) + "\n"
149
- if block_given?
150
- concat "\n"
151
- return Haml::Helpers::ErrorReturn.new("form_tag")
152
163
  end
164
+ res = form_for_without_haml(object_name, *args, &proc)
165
+ res << "\n" if block_given? && is_haml?
153
166
  res
154
- else
155
- form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc)
156
167
  end
168
+ alias_method :form_for_without_haml, :form_for
169
+ alias_method :form_for, :form_for_with_haml
170
+ end
171
+ else
172
+ module FormTagHelper
173
+ def form_tag_with_haml(url_for_options = {}, options = {}, *parameters_for_url, &proc)
174
+ if is_haml?
175
+ if block_given?
176
+ oldproc = proc
177
+ proc = haml_bind_proc do |*args|
178
+ concat "\n"
179
+ tab_up
180
+ oldproc.call(*args)
181
+ tab_down
182
+ concat haml_indent
183
+ end
184
+ concat haml_indent
185
+ end
186
+ res = form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc) + "\n"
187
+ if block_given?
188
+ concat "\n"
189
+ return Haml::Helpers::ErrorReturn.new("form_tag")
190
+ end
191
+ res
192
+ else
193
+ form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc)
194
+ end
195
+ end
196
+ alias_method :form_tag_without_haml, :form_tag
197
+ alias_method :form_tag, :form_tag_with_haml
157
198
  end
158
- alias_method :form_tag_without_haml, :form_tag
159
- alias_method :form_tag, :form_tag_with_haml
160
- end
161
199
 
162
- module FormHelper
163
- def form_for_with_haml(object_name, *args, &proc)
164
- if block_given? && is_haml?
165
- oldproc = proc
166
- proc = haml_bind_proc do |*args|
167
- tab_up
168
- oldproc.call(*args)
169
- tab_down
200
+ module FormHelper
201
+ def form_for_with_haml(object_name, *args, &proc)
202
+ if block_given? && is_haml?
203
+ oldproc = proc
204
+ proc = haml_bind_proc do |*args|
205
+ tab_up
206
+ oldproc.call(*args)
207
+ tab_down
208
+ concat haml_indent
209
+ end
170
210
  concat haml_indent
171
211
  end
172
- concat haml_indent
212
+ form_for_without_haml(object_name, *args, &proc)
213
+ concat "\n" if block_given? && is_haml?
214
+ Haml::Helpers::ErrorReturn.new("form_for") if is_haml?
173
215
  end
174
- form_for_without_haml(object_name, *args, &proc)
175
- concat "\n" if block_given? && is_haml?
176
- Haml::Helpers::ErrorReturn.new("form_for") if is_haml?
216
+ alias_method :form_for_without_haml, :form_for
217
+ alias_method :form_for, :form_for_with_haml
177
218
  end
178
- alias_method :form_for_without_haml, :form_for
179
- alias_method :form_for, :form_for_with_haml
180
219
  end
181
220
  end
182
221
  end
@@ -104,6 +104,14 @@ end
104
104
 
105
105
  module ActionView
106
106
  module Helpers
107
+ module CaptureHelper
108
+ def with_output_buffer_with_haml_xss(*args, &block)
109
+ Haml::Util.html_safe(with_output_buffer_without_haml_xss(*args, &block))
110
+ end
111
+ alias_method :with_output_buffer_without_haml_xss, :with_output_buffer
112
+ alias_method :with_output_buffer, :with_output_buffer_with_haml_xss
113
+ end
114
+
107
115
  module FormTagHelper
108
116
  def form_tag_with_haml_xss(*args, &block)
109
117
  res = form_tag_without_haml_xss(*args, &block)
@@ -114,6 +122,16 @@ module ActionView
114
122
  alias_method :form_tag, :form_tag_with_haml_xss
115
123
  end
116
124
 
125
+ module FormHelper
126
+ def form_for_with_haml_xss(*args, &block)
127
+ res = form_for_without_haml_xss(*args, &block)
128
+ return Haml::Util.html_safe(res) if res.is_a?(String)
129
+ return res
130
+ end
131
+ alias_method :form_for_without_haml_xss, :form_for
132
+ alias_method :form_for, :form_for_with_haml_xss
133
+ end
134
+
117
135
  module TextHelper
118
136
  def concat_with_haml_xss(string)
119
137
  if is_haml?
data/lib/haml/html.rb CHANGED
@@ -109,7 +109,7 @@ module Haml
109
109
  #
110
110
  # Example usage:
111
111
  #
112
- # Haml::Engine.new("<a href='http://google.com'>Blat</a>").render
112
+ # Haml::HTML.new("<a href='http://google.com'>Blat</a>").render
113
113
  # #=> "%a{:href => 'http://google.com'} Blat"
114
114
  class HTML
115
115
  # @param template [String, Hpricot::Node] The HTML template to convert
@@ -189,7 +189,6 @@ END
189
189
  if flat?
190
190
  push_flat(@line)
191
191
  @line = @next_line
192
- newline
193
192
  next
194
193
  end
195
194
 
@@ -245,11 +244,12 @@ END
245
244
  return start_haml_comment if text[1] == SILENT_COMMENT
246
245
 
247
246
  raise SyntaxError.new(<<END.rstrip, index) if text[1..-1].strip == "end"
248
- You don't need to use "- end" in Haml. Use indentation instead:
247
+ You don't need to use "- end" in Haml. Un-indent to close a block:
249
248
  - if foo?
250
249
  %strong Foo!
251
250
  - else
252
251
  Not foo.
252
+ %p This line is un-indented, so it isn't part of the "if" block
253
253
  END
254
254
 
255
255
  push_silent(text[1..-1], true)
@@ -541,9 +541,18 @@ END
541
541
  quote_escape = attr_wrapper == '"' ? "&quot;" : "&apos;"
542
542
  other_quote_char = attr_wrapper == '"' ? "'" : '"'
543
543
 
544
+ if attributes['data'].is_a?(Hash)
545
+ attributes = attributes.dup
546
+ attributes =
547
+ Haml::Util.map_keys(attributes.delete('data')) {|name| "data-#{name}"}.merge(attributes)
548
+ end
549
+
544
550
  result = attributes.collect do |attr, value|
545
551
  next if value.nil?
546
552
 
553
+ value = filter_and_join(value, ' ') if attr == :class
554
+ value = filter_and_join(value, '_') if attr == :id
555
+
547
556
  if value == true
548
557
  next " #{attr}" if is_html
549
558
  next " #{attr}=#{attr_wrapper}#{attr}#{attr_wrapper}"
@@ -567,6 +576,11 @@ END
567
576
  result.compact.sort.join
568
577
  end
569
578
 
579
+ def self.filter_and_join(value, separator)
580
+ value = [value] unless value.is_a?(Array)
581
+ return value.flatten.collect {|item| item ? item.to_s : nil}.compact.join(separator)
582
+ end
583
+
570
584
  def prerender_tag(name, self_close, attributes)
571
585
  attributes_string = Precompiler.build_attributes(html?, @options[:attr_wrapper], attributes)
572
586
  "<#{name}#{attributes_string}#{self_close && xhtml? ? ' /' : ''}>"
@@ -0,0 +1,14 @@
1
+ # This file is here to integrate with Rails 3,
2
+ # since there's no better way to do so as of 14 March 2010.
3
+ # Yehuda promises there will be soon,
4
+ # and once there is we should switch to that.
5
+
6
+ if defined?(Rails::Railtie)
7
+ module Haml
8
+ class Railtie < Rails::Railtie
9
+ initializer :haml do
10
+ Haml.init_rails(binding)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -33,6 +33,38 @@ module Haml
33
33
  end
34
34
  end
35
35
  end
36
+
37
+ # Rails 3.0 prints a deprecation warning when block helpers
38
+ # return strings that go unused.
39
+ # We want to print the same deprecation warning,
40
+ # so we have to compile in a method call to check for it.
41
+ #
42
+ # I don't like having this in the precompiler pipeline,
43
+ # and I'd like to get rid of it once Rails 3.1 is well-established.
44
+ if defined?(ActionView::OutputBuffer) &&
45
+ Haml::Util.has?(:instance_method, ActionView::OutputBuffer, :append_if_string=)
46
+ module Precompiler
47
+ def push_silent_with_haml_block_deprecation(text, can_suppress = false)
48
+ unless can_suppress && block_opened? && !mid_block_keyword?("- #{text}") &&
49
+ text =~ ActionView::Template::Handlers::Erubis::BLOCK_EXPR
50
+ return push_silent_without_haml_block_deprecation(text, can_suppress)
51
+ end
52
+
53
+ push_silent_without_haml_block_deprecation("_hamlout.append_if_string= #{text}", can_suppress)
54
+ end
55
+ alias_method :push_silent_without_haml_block_deprecation, :push_silent
56
+ alias_method :push_silent, :push_silent_with_haml_block_deprecation
57
+ end
58
+
59
+ class Buffer
60
+ def append_if_string=(value)
61
+ if value.is_a?(String) && !value.is_a?(ActionView::NonConcattingString)
62
+ ActiveSupport::Deprecation.warn("- style block helpers are deprecated. Please use =", caller)
63
+ buffer << value
64
+ end
65
+ end
66
+ end
67
+ end
36
68
  end
37
69
 
38
70
  if defined? ActionView::Template and ActionView::Template.respond_to? :register_template_handler
data/lib/haml/util.rb CHANGED
@@ -179,6 +179,31 @@ module Haml
179
179
  return nil
180
180
  end
181
181
 
182
+ # Returns whether this environment is using ActionPack
183
+ # version 3.0.0 or greater.
184
+ #
185
+ # @return [Boolean]
186
+ def ap_geq_3?
187
+ # The ActionPack module is always loaded automatically in Rails >= 3
188
+ return false unless defined?(ActionPack) && defined?(ActionPack::VERSION)
189
+
190
+ version =
191
+ if defined?(ActionPack::VERSION::MAJOR)
192
+ ActionPack::VERSION::MAJOR
193
+ else
194
+ # Rails 1.2
195
+ ActionPack::VERSION::Major
196
+ end
197
+
198
+ # 3.0.0.beta1 acts more like ActionPack 2
199
+ # for purposes of this method
200
+ # (checking whether block helpers require = or -).
201
+ # This extra check can be removed when beta2 is out.
202
+ version >= 3 &&
203
+ !(defined?(ActionPack::VERSION::TINY) &&
204
+ ActionPack::VERSION::TINY == "0.beta")
205
+ end
206
+
182
207
  # Returns an ActionView::Template* class.
183
208
  # In pre-3.0 versions of Rails, most of these classes
184
209
  # were of the form `ActionView::TemplateFoo`,
@@ -299,6 +324,14 @@ MSG
299
324
  ruby1_8? ? enum.enum_with_index : enum.each_with_index
300
325
  end
301
326
 
327
+ # Returns the ASCII code of the given character.
328
+ #
329
+ # @param c [String] All characters but the first are ignored.
330
+ # @return [Fixnum] The ASCII code of `c`.
331
+ def ord(c)
332
+ ruby1_8? ? c[0] : c.ord
333
+ end
334
+
302
335
  ## Static Method Stuff
303
336
 
304
337
  # The context in which the ERB for \{#def\_static\_method} will be run.
@@ -132,23 +132,27 @@ module Sass::Tree
132
132
  to_return = ''
133
133
  old_spaces = ' ' * (tabs - 1)
134
134
  spaces = ' ' * tabs
135
- if @options[:line_comments] && style != :compressed
136
- to_return << "#{old_spaces}/* line #{line}"
137
-
138
- if filename
139
- relative_filename = if @options[:css_filename]
140
- begin
141
- Pathname.new(filename).relative_path_from(
142
- Pathname.new(File.dirname(@options[:css_filename]))).to_s
143
- rescue ArgumentError
144
- nil
135
+ if style != :compressed
136
+ if @options[:debug_info]
137
+ to_return << debug_info_rule.to_s(tabs) << "\n"
138
+ elsif @options[:line_comments]
139
+ to_return << "#{old_spaces}/* line #{line}"
140
+
141
+ if filename
142
+ relative_filename = if @options[:css_filename]
143
+ begin
144
+ Pathname.new(filename).relative_path_from(
145
+ Pathname.new(File.dirname(@options[:css_filename]))).to_s
146
+ rescue ArgumentError
147
+ nil
148
+ end
145
149
  end
150
+ relative_filename ||= filename
151
+ to_return << ", #{relative_filename}"
146
152
  end
147
- relative_filename ||= filename
148
- to_return << ", #{relative_filename}"
149
- end
150
153
 
151
- to_return << " */\n"
154
+ to_return << " */\n"
155
+ end
152
156
  end
153
157
 
154
158
  if style == :compact
@@ -207,6 +211,16 @@ module Sass::Tree
207
211
  super
208
212
  end
209
213
 
214
+ # A hash that will be associated with this rule in the CSS document
215
+ # if the {file:SASS_REFERENCE.md#debug_info-option `:debug_info` option} is enabled.
216
+ # This data is used by e.g. [the FireSass Firebug extension](https://addons.mozilla.org/en-US/firefox/addon/103988).
217
+ #
218
+ # @return [{#to_s => #to_s}]
219
+ def debug_info
220
+ {:filename => filename && ("file://" + URI.escape(File.expand_path(filename))),
221
+ :line => self.line}
222
+ end
223
+
210
224
  private
211
225
 
212
226
  def resolve_parent_refs(super_rules)
@@ -267,5 +281,20 @@ module Sass::Tree
267
281
 
268
282
  rules
269
283
  end
284
+
285
+ def debug_info_rule
286
+ node = DirectiveNode.new("@media -sass-debug-info")
287
+ debug_info.each do |k, v|
288
+ rule = RuleNode.new(nil)
289
+ rule.resolved_rules = [[k.to_s.gsub(/[^\w-]/, "\\\\\\0")]]
290
+ val = v.to_s.gsub(/[^\w-]/, "\\\\\\0").
291
+ gsub(/^[\d-]/) {|c| "\\%04x " % Haml::Util.ord(c)}
292
+ prop = PropNode.new("font-family", val, :new)
293
+ rule << prop
294
+ node << rule
295
+ end
296
+ node.options = @options.merge(:debug_info => false, :line_comments => false, :style => :compressed)
297
+ node
298
+ end
270
299
  end
271
300
  end
@@ -36,7 +36,14 @@ class EngineTest < Test::Unit::TestCase
36
36
  "%p{:a => 'b',\n:c => 'd',\n:e => raise('foo')}" => ["foo", 3],
37
37
  " %p foo" => "Indenting at the beginning of the document is illegal.",
38
38
  " %p foo" => "Indenting at the beginning of the document is illegal.",
39
- "- end" => "You don't need to use \"- end\" in Haml. Use indentation instead:\n- if foo?\n %strong Foo!\n- else\n Not foo.",
39
+ "- end" => <<MESSAGE.rstrip,
40
+ You don't need to use "- end" in Haml. Un-indent to close a block:
41
+ - if foo?
42
+ %strong Foo!
43
+ - else
44
+ Not foo.
45
+ %p This line is un-indented, so it isn't part of the "if" block
46
+ MESSAGE
40
47
  " \n\t\n %p foo" => ["Indenting at the beginning of the document is illegal.", 3],
41
48
  "\n\n %p foo" => ["Indenting at the beginning of the document is illegal.", 3],
42
49
  "%p\n foo\n foo" => ["Inconsistent indentation: 1 space was used for indentation, but the rest of the document was indented using 2 spaces.", 3],
@@ -73,6 +80,11 @@ class EngineTest < Test::Unit::TestCase
73
80
  "!!!\n\n bar" => ["Illegal nesting: nesting within a header command is illegal.", 3],
74
81
  "foo\n:ruby\n 1\n 2\n 3\n- raise 'foo'" => ["foo", 6],
75
82
  "foo\n:erb\n 1\n 2\n 3\n- raise 'foo'" => ["foo", 6],
83
+ "foo\n:plain\n 1\n 2\n 3\n- raise 'foo'" => ["foo", 6],
84
+ "foo\n:plain\n 1\n 2\n 3\n4\n- raise 'foo'" => ["foo", 7],
85
+ "foo\n:plain\n 1\n 2\n 3\#{''}\n- raise 'foo'" => ["foo", 6],
86
+ "foo\n:plain\n 1\n 2\n 3\#{''}\n4\n- raise 'foo'" => ["foo", 7],
87
+ "foo\n:plain\n 1\n 2\n \#{raise 'foo'}" => ["foo", 5],
76
88
  "= raise 'foo'\nfoo\nbar\nbaz\nbang" => ["foo", 1],
77
89
  }
78
90
 
@@ -130,6 +142,29 @@ class EngineTest < Test::Unit::TestCase
130
142
  assert_equal("<p class='3'>foo</p>", render("%p{:class => 1+2} foo").chomp)
131
143
  end
132
144
 
145
+ def test_class_attr_with_array
146
+ assert_equal("<p class='a b'>foo</p>\n", render("%p{:class => %w[a b]} foo")) # basic
147
+ assert_equal("<p class='a b css'>foo</p>\n", render("%p.css{:class => %w[a b]} foo")) # merge with css
148
+ assert_equal("<p class='b css'>foo</p>\n", render("%p.css{:class => %w[css b]} foo")) # merge uniquely
149
+ assert_equal("<p class='a b c d'>foo</p>\n", render("%p{:class => [%w[a b], %w[c d]]} foo")) # flatten
150
+ assert_equal("<p class='a b'>foo</p>\n", render("%p{:class => [:a, :b] } foo")) # stringify
151
+ assert_equal("<p class=''>foo</p>\n", render("%p{:class => [nil, false] } foo")) # strip falsey
152
+ assert_equal("<p class='a'>foo</p>\n", render("%p{:class => :a} foo")) # single stringify
153
+ assert_equal("<p>foo</p>\n", render("%p{:class => false} foo")) # single falsey
154
+ assert_equal("<p class='a b html'>foo</p>\n", render("%p(class='html'){:class => %w[a b]} foo")) # html attrs
155
+ end
156
+
157
+ def test_id_attr_with_array
158
+ assert_equal("<p id='a_b'>foo</p>\n", render("%p{:id => %w[a b]} foo")) # basic
159
+ assert_equal("<p id='css_a_b'>foo</p>\n", render("%p#css{:id => %w[a b]} foo")) # merge with css
160
+ assert_equal("<p id='a_b_c_d'>foo</p>\n", render("%p{:id => [%w[a b], %w[c d]]} foo")) # flatten
161
+ assert_equal("<p id='a_b'>foo</p>\n", render("%p{:id => [:a, :b] } foo")) # stringify
162
+ assert_equal("<p id=''>foo</p>\n", render("%p{:id => [nil, false] } foo")) # strip falsey
163
+ assert_equal("<p id='a'>foo</p>\n", render("%p{:id => :a} foo")) # single stringify
164
+ assert_equal("<p>foo</p>\n", render("%p{:id => false} foo")) # single falsey
165
+ assert_equal("<p id='html_a_b'>foo</p>\n", render("%p(id='html'){:id => %w[a b]} foo")) # html attrs
166
+ end
167
+
133
168
  def test_dynamic_attributes_with_no_content
134
169
  assert_equal(<<HTML, render(<<HAML))
135
170
  <p>
@@ -611,8 +646,9 @@ HAML
611
646
  <p>foo-end</p>
612
647
  <p>bar-end</p>
613
648
  HTML
614
- - "foo-end-bar-end".gsub(/\\w+-end/) do |s|
649
+ - ("foo-end-bar-end".gsub(/\\w+-end/) do |s|
615
650
  %p= s
651
+ - end; nil)
616
652
  HAML
617
653
  end
618
654
 
@@ -1164,6 +1200,47 @@ SASS
1164
1200
  assert_equal %{<!DOCTYPE html>\n}, render('!!!', :format => :html5)
1165
1201
  end
1166
1202
 
1203
+ # HTML5 custom data attributes
1204
+ def test_html5_data_attributes
1205
+ assert_equal("<div data-author_id='123' data-biz='baz' data-foo='bar'></div>\n",
1206
+ render("%div{:data => {:author_id => 123, :foo => 'bar', :biz => 'baz'}}"))
1207
+
1208
+ assert_equal("<div data-one_plus_one='2'></div>\n",
1209
+ render("%div{:data => {:one_plus_one => 1+1}}"))
1210
+
1211
+ assert_equal("<div data-foo='Here&apos;s a \"quoteful\" string.'></div>\n",
1212
+ render(%{%div{:data => {:foo => %{Here's a "quoteful" string.}}}})) #'
1213
+ end
1214
+
1215
+ def test_html5_data_attributes_with_multiple_defs
1216
+ # Should always use the more-explicit attribute
1217
+ assert_equal("<div data-foo='second'></div>\n",
1218
+ render("%div{:data => {:foo => 'first'}, 'data-foo' => 'second'}"))
1219
+ assert_equal("<div data-foo='first'></div>\n",
1220
+ render("%div{'data-foo' => 'first', :data => {:foo => 'second'}}"))
1221
+ end
1222
+
1223
+ def test_html5_data_attributes_with_attr_method
1224
+ Haml::Helpers.module_eval do
1225
+ def data_hash
1226
+ {:data => {:foo => "bar", :baz => "bang"}}
1227
+ end
1228
+
1229
+ def data_val
1230
+ {:data => "dat"}
1231
+ end
1232
+ end
1233
+
1234
+ assert_equal("<div data-baz='bang' data-brat='wurst' data-foo='blip'></div>\n",
1235
+ render("%div{data_hash, :data => {:foo => 'blip', :brat => 'wurst'}}"))
1236
+ assert_equal("<div data-baz='bang' data-foo='blip'></div>\n",
1237
+ render("%div{data_hash, 'data-foo' => 'blip'}"))
1238
+ assert_equal("<div data-baz='bang' data-foo='bar' data='dat'></div>\n",
1239
+ render("%div{data_hash, :data => 'dat'}"))
1240
+ assert_equal("<div data-brat='wurst' data-foo='blip' data='dat'></div>\n",
1241
+ render("%div{data_val, :data => {:foo => 'blip', :brat => 'wurst'}}"))
1242
+ end
1243
+
1167
1244
  # New attributes
1168
1245
 
1169
1246
  def test_basic_new_attributes
@@ -65,7 +65,21 @@ class HelperTest < Test::Unit::TestCase
65
65
  assert_equal("foo\n bar\nbaz\n", render("foo\n- tab_up\nbar\n- tab_down\nbaz"))
66
66
  assert_equal(" <p>tabbed</p>\n", render("- buffer.tabulation=5\n%p tabbed"))
67
67
  end
68
-
68
+
69
+ def test_with_tabs
70
+ assert_equal(<<HTML, render(<<HAML))
71
+ Foo
72
+ Bar
73
+ Baz
74
+ Baz
75
+ HTML
76
+ Foo
77
+ - with_tabs 2 do
78
+ = "Bar\\nBaz"
79
+ Baz
80
+ HAML
81
+ end
82
+
69
83
  def test_helpers_dont_leak
70
84
  # Haml helpers shouldn't be accessible from ERB
71
85
  render("foo")
@@ -93,9 +107,16 @@ class HelperTest < Test::Unit::TestCase
93
107
  def test_form_tag
94
108
  # This is usually provided by ActionController::Base.
95
109
  def @base.protect_against_forgery?; false; end
96
- result = render("- form_tag 'foo' do\n %p bar\n %strong baz", :action_view)
97
- should_be = "<form action=\"foo\" method=\"post\">\n <p>bar</p>\n <strong>baz</strong>\n</form>\n"
98
- assert_equal(should_be, result)
110
+ assert_equal(<<HTML, render(<<HAML, :action_view))
111
+ <form action="foo" method="post">
112
+ <p>bar</p>
113
+ <strong>baz</strong>
114
+ </form>
115
+ HTML
116
+ #{rails_block_helper_char} form_tag 'foo' do
117
+ %p bar
118
+ %strong baz
119
+ HAML
99
120
  end
100
121
 
101
122
  def test_text_area
@@ -110,16 +131,23 @@ class HelperTest < Test::Unit::TestCase
110
131
  end
111
132
 
112
133
  def test_capture_haml
113
- assert_equal("\"<p>13</p>\\n\"\n", render("- foo = capture_haml(13) do |a|\n %p= a\n= foo.dump"))
134
+ assert_equal(<<HTML, render(<<HAML))
135
+ "<p>13</p>\\n"
136
+ HTML
137
+ - (foo = capture_haml(13) do |a|
138
+ %p= a
139
+ - end; nil)
140
+ = foo.dump
141
+ HAML
114
142
  end
115
143
 
116
144
  def test_content_tag_block
117
- assert_equal(<<HTML.strip, render(<<HAML, :action_view))
145
+ assert_equal(<<HTML.strip, render(<<HAML, :action_view).strip)
118
146
  <div><p>bar</p>
119
147
  <strong>bar</strong>
120
148
  </div>
121
149
  HTML
122
- - content_tag :div do
150
+ #{rails_block_helper_char} content_tag :div do
123
151
  %p bar
124
152
  %strong bar
125
153
  HAML
@@ -177,6 +205,16 @@ HAML
177
205
  assert_equal("<br class='foo' />\n", render("- haml_tag :br, :class => 'foo'"))
178
206
  end
179
207
 
208
+ def test_haml_tag_with_class_array
209
+ assert_equal("<p class='a b'>foo</p>\n", render("- haml_tag :p, 'foo', :class => %w[a b]"))
210
+ assert_equal("<p class='a b c d'>foo</p>\n", render("- haml_tag 'p.c.d', 'foo', :class => %w[a b]"))
211
+ end
212
+
213
+ def test_haml_tag_with_id_array
214
+ assert_equal("<p id='a_b'>foo</p>\n", render("- haml_tag :p, 'foo', :id => %w[a b]"))
215
+ assert_equal("<p id='c_a_b'>foo</p>\n", render("- haml_tag 'p#c', 'foo', :id => %w[a b]"))
216
+ end
217
+
180
218
  def test_haml_tag_non_autoclosed_tags_arent_closed
181
219
  assert_equal("<p></p>\n", render("- haml_tag :p"))
182
220
  end
@@ -56,7 +56,9 @@ testtest
56
56
  </br>
57
57
  <p class='article bar foo' id='article_1'>Blah</p>
58
58
  <p class='article foo' id='article_1'>Blah</p>
59
+ <p class='article bar baz foo' id='article_1'>Blah</p>
59
60
  <p class='article quux qux' id='article_1'>Blump</p>
61
+ <p class='article' id='foo_bar_baz_article_1'>Whee</p>
60
62
  Woah inner quotes
61
63
  <p class='dynamic_quote' dyn='3' quotes="single '"></p>
62
64
  <p class='dynamic_self_closing' dyn='3' />
@@ -70,8 +70,9 @@ class TemplateTest < Test::Unit::TestCase
70
70
  end
71
71
 
72
72
  if Haml::Util.has?(:private_method, base, :evaluate_assigns)
73
+ # Rails < 3.0
73
74
  base.send(:evaluate_assigns)
74
- else
75
+ elsif Haml::Util.has?(:private_method, base, :_evaluate_assigns_and_ivars)
75
76
  # Rails 2.2
76
77
  base.send(:_evaluate_assigns_and_ivars)
77
78
  end
@@ -190,22 +191,24 @@ class TemplateTest < Test::Unit::TestCase
190
191
  assert_equal("2\n", render("= 1+1"))
191
192
  end
192
193
 
193
- def test_form_for_error_return
194
- assert_raise(Haml::Error) { render(<<HAML) }
194
+ unless Haml::Util.ap_geq_3?
195
+ def test_form_for_error_return
196
+ assert_raise(Haml::Error) { render(<<HAML) }
195
197
  = form_for :article, @article, :url => '' do |f|
196
198
  Title:
197
199
  = f.text_field :title
198
200
  Body:
199
201
  = f.text_field :body
200
202
  HAML
201
- end
203
+ end
202
204
 
203
- def test_form_tag_error_return
204
- assert_raise(Haml::Error) { render(<<HAML) }
205
+ def test_form_tag_error_return
206
+ assert_raise(Haml::Error) { render(<<HAML) }
205
207
  = form_tag '' do
206
208
  Title:
207
209
  Body:
208
210
  HAML
211
+ end
209
212
  end
210
213
 
211
214
  def test_haml_options
@@ -228,10 +231,13 @@ baz
228
231
  HTML
229
232
  %p
230
233
  foo
231
- - with_output_buffer do
234
+ -# Parenthesis required due to Rails 3.0 deprecation of block helpers
235
+ -# that return strings.
236
+ - (with_output_buffer do
232
237
  bar
233
238
  = "foo".gsub(/./) do |s|
234
239
  - "flup"
240
+ - end; nil)
235
241
  baz
236
242
  HAML
237
243
  end
@@ -267,6 +273,28 @@ END
267
273
  end
268
274
  end
269
275
 
276
+ if defined?(ActionView::OutputBuffer) &&
277
+ Haml::Util.has?(:instance_method, ActionView::OutputBuffer, :append_if_string=)
278
+ def test_av_block_deprecation_warning
279
+ assert_warning(/^DEPRECATION WARNING: - style block helpers are deprecated\. Please use =\./) do
280
+ assert_equal <<HTML, render(<<HAML, :action_view)
281
+ <form action="" method="post">
282
+ Title:
283
+ <input id="article_title" name="article[title]" size="30" type="text" value="Hello" />
284
+ Body:
285
+ <input id="article_body" name="article[body]" size="30" type="text" value="World" />
286
+ </form>
287
+ HTML
288
+ - form_for :article, @article, :url => '' do |f|
289
+ Title:
290
+ = f.text_field :title
291
+ Body:
292
+ = f.text_field :body
293
+ HAML
294
+ end
295
+ end
296
+ end
297
+
270
298
  ## XSS Protection Tests
271
299
 
272
300
  # In order to enable these, either test against Rails 3.0
@@ -356,7 +384,7 @@ HAML
356
384
  <input id="article_body" name="article[body]" size="30" type="text" value="World" />
357
385
  </form>
358
386
  HTML
359
- - form_for :article, @article, :url => '' do |f|
387
+ #{rails_block_helper_char} form_for :article, @article, :url => '' do |f|
360
388
  Title:
361
389
  = f.text_field :title
362
390
  Body:
@@ -62,6 +62,19 @@ click
62
62
  <input id="article_body" name="article[body]" size="30" type="text" value="World" />
63
63
  </form>
64
64
  </div>
65
+ - elsif Haml::Util.ap_geq_3?
66
+ %p
67
+ = form_tag ''
68
+ %div
69
+ = form_tag '' do
70
+ %div= submit_tag 'save'
71
+ - @foo = 'value one'
72
+ = test_partial 'partial'
73
+ = form_for :article, @article, :url => '' do |f|
74
+ Title:
75
+ = f.text_field :title
76
+ Body:
77
+ = f.text_field :body
65
78
  - else
66
79
  %p
67
80
  = form_tag ''
@@ -70,7 +70,9 @@
70
70
  Nested content
71
71
  %p.foo{:class => true ? 'bar' : 'baz'}[@article] Blah
72
72
  %p.foo{:class => false ? 'bar' : ''}[@article] Blah
73
+ %p.foo{:class => %w[bar baz]}[@article] Blah
73
74
  %p.qux{:class => 'quux'}[@article] Blump
75
+ %p#foo{:id => %w[bar baz]}[@article] Whee
74
76
  == #{"Woah inner quotes"}
75
77
  %p.dynamic_quote{:quotes => "single '", :dyn => 1 + 2}
76
78
  %p.dynamic_self_closing{:dyn => 1 + 2}/
@@ -1,3 +1,7 @@
1
1
  %h1 Partial layout used with for block:
2
- - render :layout => 'layout_for_partial.haml' do
3
- %p Some content within a layout
2
+ - if Haml::Util.ap_geq_3?
3
+ = render :layout => 'layout_for_partial.haml' do
4
+ %p Some content within a layout
5
+ - else
6
+ - render :layout => 'layout_for_partial.haml' do
7
+ %p Some content within a layout
@@ -86,6 +86,11 @@ class UtilTest < Test::Unit::TestCase
86
86
  enum_with_index(%w[foo bar baz]).map {|s, i| "#{s}#{i}"})
87
87
  end
88
88
 
89
+ def test_ord
90
+ assert_equal(102, ord("f"))
91
+ assert_equal(98, ord("bar"))
92
+ end
93
+
89
94
  def test_caller_info
90
95
  assert_equal(["/tmp/foo.rb", 12, "fizzle"], caller_info("/tmp/foo.rb:12: in `fizzle'"))
91
96
  assert_equal(["/tmp/foo.rb", 12, nil], caller_info("/tmp/foo.rb:12"))
@@ -626,6 +626,81 @@ SASS
626
626
  renders_correctly "line_numbers", :line_comments => true, :load_paths => [File.dirname(__FILE__) + "/templates"]
627
627
  end
628
628
 
629
+ def test_debug_info
630
+ assert_equal(<<CSS, render(<<SASS, :debug_info => true, :style => :compact))
631
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/\\/home\\/nex3\\/code\\/haml\\/test_debug_info_inline\\.sass}line{font-family:\\0032 }}
632
+ foo bar { foo: bar; }
633
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/\\/home\\/nex3\\/code\\/haml\\/test_debug_info_inline\\.sass}line{font-family:\\0035 }}
634
+ foo baz { blip: blop; }
635
+
636
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/\\/home\\/nex3\\/code\\/haml\\/test_debug_info_inline\\.sass}line{font-family:\\0039 }}
637
+ floodle { flop: blop; }
638
+
639
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/\\/home\\/nex3\\/code\\/haml\\/test_debug_info_inline\\.sass}line{font-family:\\0031 8}}
640
+ bup { mix: on; }
641
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/\\/home\\/nex3\\/code\\/haml\\/test_debug_info_inline\\.sass}line{font-family:\\0031 5}}
642
+ bup mixin { moop: mup; }
643
+
644
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/\\/home\\/nex3\\/code\\/haml\\/test_debug_info_inline\\.sass}line{font-family:\\0032 2}}
645
+ bip hop, skip hop { a: b; }
646
+ CSS
647
+ foo
648
+ bar
649
+ foo: bar
650
+
651
+ baz
652
+ blip: blop
653
+
654
+
655
+ floodle
656
+
657
+ flop: blop
658
+
659
+ =mxn
660
+ mix: on
661
+ mixin
662
+ moop: mup
663
+
664
+ bup
665
+ +mxn
666
+
667
+ bip, skip
668
+ hop
669
+ a: b
670
+ SASS
671
+ end
672
+
673
+ def test_debug_info_without_filename
674
+ assert_equal(<<CSS, Sass::Engine.new(<<SASS, :debug_info => true).render)
675
+ @media -sass-debug-info{filename{font-family:}line{font-family:\\0031 }}
676
+ foo {
677
+ a: b; }
678
+ CSS
679
+ foo
680
+ a: b
681
+ SASS
682
+ end
683
+
684
+ def test_debug_info_with_compressed
685
+ assert_equal(<<CSS, render(<<SASS, :debug_info => true, :style => :compressed))
686
+ foo{a:b}
687
+ CSS
688
+ foo
689
+ a: b
690
+ SASS
691
+ end
692
+
693
+ def test_debug_info_with_line_annotations
694
+ assert_equal(<<CSS, render(<<SASS, :debug_info => true, :line_comments => true))
695
+ @media -sass-debug-info{filename{font-family:file\\:\\/\\/\\/home\\/nex3\\/code\\/haml\\/test_debug_info_with_line_annotations_inline\\.sass}line{font-family:\\0031 }}
696
+ foo {
697
+ a: b; }
698
+ CSS
699
+ foo
700
+ a: b
701
+ SASS
702
+ end
703
+
629
704
  def test_empty_first_line
630
705
  assert_equal("#a {\n b: c; }\n", render("#a\n\n b: c"))
631
706
  end
data/test/test_helper.rb CHANGED
@@ -41,7 +41,12 @@ class Test::Unit::TestCase
41
41
  def assert_warning(message)
42
42
  the_real_stderr, $stderr = $stderr, StringIO.new
43
43
  yield
44
- assert_equal message.strip, $stderr.string.strip
44
+
45
+ if message.is_a?(Regexp)
46
+ assert_match message, $stderr.string.strip
47
+ else
48
+ assert_equal message.strip, $stderr.string.strip
49
+ end
45
50
  ensure
46
51
  $stderr = the_real_stderr
47
52
  end
@@ -49,4 +54,9 @@ class Test::Unit::TestCase
49
54
  def silence_warnings(&block)
50
55
  Haml::Util.silence_warnings(&block)
51
56
  end
57
+
58
+ def rails_block_helper_char
59
+ return '=' if Haml::Util.ap_geq_3?
60
+ return '-'
61
+ end
52
62
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haml-edge
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.169
4
+ version: 2.3.170
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Weizenbaum
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2010-03-02 00:00:00 -05:00
13
+ date: 2010-03-20 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -64,13 +64,14 @@ files:
64
64
  - lib/haml/helpers/xss_mods.rb
65
65
  - lib/haml/html.rb
66
66
  - lib/haml/precompiler.rb
67
+ - lib/haml/util.rb
67
68
  - lib/haml/html/erb.rb
68
69
  - lib/haml/shared.rb
69
70
  - lib/haml/template.rb
70
71
  - lib/haml/template/patch.rb
71
72
  - lib/haml/template/plugin.rb
72
- - lib/haml/util.rb
73
73
  - lib/haml/version.rb
74
+ - lib/haml/railtie.rb
74
75
  - lib/sass.rb
75
76
  - lib/sass/css.rb
76
77
  - lib/sass/engine.rb