From adba18106081f55f2e8761b5104d295cacd6a8c6 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Thu, 10 Nov 2005 06:04:50 +0000 Subject: The auto_link text helper accepts an optional block to format the link text for each url and email address. References #2628. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2963 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 4 ++- actionpack/lib/action_view/helpers/text_helper.rb | 39 +++++++++++++++++------ actionpack/test/template/text_helper_test.rb | 7 ++++ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index aaf2182c60..d9e4bb1053 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,6 +1,8 @@ *SVN* -* assert_tag uses exact matches for string conditions, instead of partial matches. Use regex to do partial matches. #2799 +* The auto_link text helper accepts an optional block to format the link text for each url and email address. Example: auto_link(post.body) { |text| truncate(text, 10) } [Jeremy Kemper] + +* assert_tag uses exact matches for string conditions, instead of partial matches. Use regex to do partial matches. #2799 [Jamis Buck] * CGI::Session::ActiveRecordStore.data_column_name = 'foobar' to use a different session data column than the 'data' default. [nbpwie102@sneakemail.com] diff --git a/actionpack/lib/action_view/helpers/text_helper.rb b/actionpack/lib/action_view/helpers/text_helper.rb index e19ba8a66c..b31668203e 100644 --- a/actionpack/lib/action_view/helpers/text_helper.rb +++ b/actionpack/lib/action_view/helpers/text_helper.rb @@ -135,11 +135,17 @@ module ActionView # auto_link("Go to http://www.rubyonrails.com and say hello to david@loudthinking.com") => # Go to http://www.rubyonrails.com and # say hello to david@loudthinking.com - def auto_link(text, link = :all, href_options = {}) + # + # If a block is given, each url and email address is yielded and the + # result is used as the link text. Example: + # auto_link(post.body, :all, :target => '_blank') do |text| + # truncate(text, 15) + # end + def auto_link(text, link = :all, href_options = {}, &block) case link - when :all then auto_link_urls(auto_link_email_addresses(text), href_options) - when :email_addresses then auto_link_email_addresses(text) - when :urls then auto_link_urls(text, href_options) + when :all then auto_link_urls(auto_link_email_addresses(text, &block), href_options, &block) + when :email_addresses then auto_link_email_addresses(text, &block) + when :urls then auto_link_urls(text, href_options, &block) end end @@ -325,22 +331,37 @@ module ActionView ([[:punct:]]|\s|<|$) # trailing text /x unless const_defined?(:AUTO_LINK_RE) - # Turns all urls into clickable links. + # Turns all urls into clickable links. If a block is given, each url + # is yielded and the result is used as the link text. Example: + # auto_link_urls(post.body, :all, :target => '_blank') do |text| + # truncate(text, 15) + # end def auto_link_urls(text, href_options = {}) + extra_options = tag_options(href_options.stringify_keys) || "" text.gsub(AUTO_LINK_RE) do all, a, b, c, d = $&, $1, $2, $3, $5 if a =~ /#{b}#{c}#{d}) + text = b + c + text = yield(text) if block_given? + %(#{a}#{text}#{d}) end end end - # Turns all email addresses into clickable links. + # Turns all email addresses into clickable links. If a block is given, + # each email is yielded and the result is used as the link text. + # Example: + # auto_link_email_addresses(post.body) do |text| + # truncate(text, 15) + # end def auto_link_email_addresses(text) - text.gsub(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/, '\1') + text.gsub(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do + text = $1 + text = yield(text) if block_given? + %{#{text}} + end end end end diff --git a/actionpack/test/template/text_helper_test.rb b/actionpack/test/template/text_helper_test.rb index ef6c837c9f..d43bc43b9c 100644 --- a/actionpack/test/template/text_helper_test.rb +++ b/actionpack/test/template/text_helper_test.rb @@ -161,6 +161,13 @@ class TextHelperTest < Test::Unit::TestCase assert_equal %(

#{url1}
#{url2}

), auto_link("

#{url1}
#{url2}

") end + def test_auto_link_with_block + url = "http://api.rubyonrails.com/Foo.html" + email = "fantabulous@shiznadel.ic" + + assert_equal %(

#{url[0..7]}...
#{email[0..7]}...

), auto_link("

#{url}
#{email}

") { |url| truncate(url, 10) } + end + def test_sanitize_form raw = "
" result = sanitize(raw) -- cgit v1.2.3