From e24d3e9d6316f622cda20fb7f337608879ec981a Mon Sep 17 00:00:00 2001 From: Paul Hieromnimon Date: Sun, 16 Jan 2011 20:20:39 -0600 Subject: [PATCH] Overrode Array.join to return html_safe Strings (SafeBuffer) if all array elements and separator are safe. Also overrode Array.html_safe? to return true if every element of the array is html_safe. --- .../core_ext/string/output_safety.rb | 16 +++++++ activesupport/test/core_ext/string_ext_test.rb | 44 ++++++++++++++++++++ 2 files changed, 60 insertions(+), 0 deletions(-) diff --git a/activesupport/lib/active_support/core_ext/string/output_safety.rb b/activesupport/lib/active_support/core_ext/string/output_safety.rb index bb0f747..006651e 100644 --- a/activesupport/lib/active_support/core_ext/string/output_safety.rb +++ b/activesupport/lib/active_support/core_ext/string/output_safety.rb @@ -116,3 +116,19 @@ class String ActiveSupport::SafeBuffer.new(self) end end + +class Array + + alias_method :original_join, :join + + def join(sep=$,) + sep ||= "".html_safe + str = original_join(sep) + (sep.html_safe? && html_safe?) ? str.html_safe : str + end + + def html_safe? + self.detect {|e| !e.html_safe?}.nil? + end + +end diff --git a/activesupport/test/core_ext/string_ext_test.rb b/activesupport/test/core_ext/string_ext_test.rb index bb865ca..41a2364 100644 --- a/activesupport/test/core_ext/string_ext_test.rb +++ b/activesupport/test/core_ext/string_ext_test.rb @@ -434,6 +434,50 @@ class OutputSafetyTest < ActiveSupport::TestCase assert string.html_safe? end + test "Joining safe elements without a separator is safe" do + array = 5.times.collect {"some string".html_safe} + assert array.join.html_safe? + end + + test "Joining safe elements with a safe separator is safe" do + array = 5.times.collect {"some string".html_safe} + assert array.join("-".html_safe).html_safe? + end + + test "Joining safe elements with an unsafe separator is unsafe" do + array = 5.times.collect {"some string".html_safe} + assert_false array.join("-").html_safe? + end + + test "Joining is unsafe if any element is unsafe even with a safe separator" do + array = 5.times.collect {"some string".html_safe} + array << "some string" + assert_false array.join("-".html_safe).html_safe? + end + + test "Joining is unsafe if any element is unsafe and no separator is given" do + array = 5.times.collect {"some string".html_safe} + array << "some string" + assert_false array.join.html_safe? + end + + test "Joining is unsafe if any element is unsafe and the separator is unsafe" do + array = 5.times.collect {"some string".html_safe} + array << "some string" + assert_false array.join("-").html_safe? + end + + test "Array is safe if all elements are safe" do + array = 5.times.collect { "some string".html_safe } + assert array.html_safe? + end + + test "Array is unsafe if any element is unsafe" do + array = 5.times.collect { "some string".html_safe } + array << "some string" + assert_false array.html_safe? + end + test 'emits normal string yaml' do assert_equal 'foo'.to_yaml, 'foo'.html_safe.to_yaml(:foo => 1) end -- 1.7.1