diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index 684c16c4b3..85c4b41f86 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Added :encode option to mail_to that'll allow you to masquarede the email address behind javascript or hex encoding #494 [Lucas Carlson]
+
* Fixed that the content-header was being set to application/octet_stream instead of application/octet-stream on send_date/file [Alexey]
* Removed the need for passing the binding when using CacheHelper#cache
diff --git a/actionpack/lib/action_view/helpers/url_helper.rb b/actionpack/lib/action_view/helpers/url_helper.rb
index 0113c42eb7..0661c961b6 100644
--- a/actionpack/lib/action_view/helpers/url_helper.rb
+++ b/actionpack/lib/action_view/helpers/url_helper.rb
@@ -91,8 +91,35 @@ module ActionView
# Creates a link tag for starting an email to the specified email_address, which is also used as the name of the
# link unless +name+ is specified. Additional HTML options, such as class or id, can be passed in the html_options hash.
+ #
+ # You can also make it difficult for spiders to harvest email address by obfuscating them.
+ # Examples:
+ # * mail_to "me@domain.com", "My email", :encode => "javascript"
+ # =>
+ # * mail_to "me@domain.com", "My email", :encode => "hex"
+ # => My email
def mail_to(email_address, name = nil, html_options = {})
- content_tag "a", name || email_address, html_options.merge({ "href" => "mailto:#{email_address}" })
+ encode = html_options[:encode]
+ html_options.delete(:encode)
+ string = ''
+ if encode == 'javascript'
+ tmp = "document.write('#{content_tag("a", name || email_address, html_options.merge({ "href" => "mailto:"+email_address.to_s }))}');"
+ for i in 0...tmp.length
+ string << sprintf("%%%x",tmp[i])
+ end
+ ""
+ elsif encode == 'hex'
+ for i in 0...email_address.length
+ if email_address[i,1] =~ /\w/
+ string << sprintf("%%%x",email_address[i])
+ else
+ string << email_address[i,1]
+ end
+ end
+ content_tag "a", name || email_address, html_options.merge({ "href" => "mailto:#{string}" })
+ else
+ content_tag "a", name || email_address, html_options.merge({ "href" => "mailto:#{email_address}" })
+ end
end
private
diff --git a/actionpack/test/template/tag_helper_test.rb b/actionpack/test/template/tag_helper_test.rb
index c3289af50c..2db1bac238 100644
--- a/actionpack/test/template/tag_helper_test.rb
+++ b/actionpack/test/template/tag_helper_test.rb
@@ -14,5 +14,17 @@ class TagHelperTest < Test::Unit::TestCase
assert_equal "Create", content_tag("a", "Create", "href" => "create")
end
+ def test_mail_to_with_javascript
+ assert_equal "", mail_to("me@domain.com", "My email", :encode => "javascript")
+ end
+
+ def test_mail_to_with_hex
+ assert_equal "My email", mail_to("me@domain.com", "My email", :encode => "hex")
+ end
+
+ def test_mail_to
+ assert_equal "My email", mail_to("me@domain.com", "My email")
+ end
+
# FIXME: Test form tag
end
\ No newline at end of file