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/lib/action_view/helpers/text_helper.rb | 39 +++++++++++++++++------ 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'actionpack/lib/action_view/helpers/text_helper.rb') 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 -- cgit v1.2.3