aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2007-09-18 10:55:15 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2007-09-18 10:55:15 +0000
commit8fd263cd4ec740bda56b6f4c0d3e2ddd91f05722 (patch)
tree3bf61c55c6ef2fd2f91c9032c8a3f925280e93f9
parent7010ee361ec71ed1a37962897cebc8684d90aa35 (diff)
downloadrails-8fd263cd4ec740bda56b6f4c0d3e2ddd91f05722.tar.gz
rails-8fd263cd4ec740bda56b6f4c0d3e2ddd91f05722.tar.bz2
rails-8fd263cd4ec740bda56b6f4c0d3e2ddd91f05722.zip
tag_options creates fewer objects
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7512 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--actionpack/lib/action_view/helpers/tag_helper.rb29
-rw-r--r--actionpack/test/template/tag_helper_test.rb4
2 files changed, 18 insertions, 15 deletions
diff --git a/actionpack/lib/action_view/helpers/tag_helper.rb b/actionpack/lib/action_view/helpers/tag_helper.rb
index 8d3f6be04c..f222e43adc 100644
--- a/actionpack/lib/action_view/helpers/tag_helper.rb
+++ b/actionpack/lib/action_view/helpers/tag_helper.rb
@@ -8,6 +8,8 @@ module ActionView
module TagHelper
include ERB::Util
+ BOOLEAN_ATTRIBUTES = Set.new(%w(disabled readonly multiple))
+
# Returns an empty HTML tag of type +name+ which by default is XHTML
# compliant. Setting +open+ to true will create an open tag compatible
# with HTML 4.0 and below. Add HTML attributes by passing an attributes
@@ -97,29 +99,28 @@ module ActionView
private
def content_tag_string(name, content, options)
- tag_options = options ? tag_options(options) : ""
+ tag_options = tag_options(options) if options
"<#{name}#{tag_options}>#{content}</#{name}>"
end
-
- def tag_options(options)
- cleaned_options = convert_booleans(options.stringify_keys.reject {|key, value| value.nil?})
- ' ' + cleaned_options.map {|key, value| %(#{key}="#{escape_once(value)}")}.sort * ' ' unless cleaned_options.empty?
- end
- def convert_booleans(options)
- %w( disabled readonly multiple ).each { |a| boolean_attribute(options, a) }
- options
+ def tag_options(options)
+ unless options.blank?
+ attrs = []
+ options.each do |key, value|
+ next unless value
+ key = key.to_s
+ value = BOOLEAN_ATTRIBUTES.include?(key) ? key : escape_once(value)
+ attrs << %(#{key}="#{value}")
+ end
+ " #{attrs.sort * ' '}" unless attrs.empty?
+ end
end
- def boolean_attribute(options, attribute)
- options[attribute] ? options[attribute] = attribute : options.delete(attribute)
- end
-
# Fix double-escaped entities, such as &amp;amp;, &amp;#123;, etc.
def fix_double_escape(escaped)
escaped.gsub(/&amp;([a-z]+|(#\d+));/i) { "&#{$1};" }
end
-
+
def block_is_within_action_view?(block)
eval("defined? _erbout", block.binding)
end
diff --git a/actionpack/test/template/tag_helper_test.rb b/actionpack/test/template/tag_helper_test.rb
index b839d53f6b..1e8957d756 100644
--- a/actionpack/test/template/tag_helper_test.rb
+++ b/actionpack/test/template/tag_helper_test.rb
@@ -13,7 +13,9 @@ class TagHelperTest < Test::Unit::TestCase
end
def test_tag_options
- assert_match /\A<p class="(show|elsewhere)" \/>\z/, tag("p", "class" => "show", :class => "elsewhere")
+ str = tag("p", "class" => "show", :class => "elsewhere")
+ assert_match /class="show"/, str
+ assert_match /class="elsewhere"/, str
end
def test_tag_options_rejects_nil_option