diff options
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/text_helper.rb | 29 | ||||
-rw-r--r-- | actionpack/test/template/text_helper_test.rb | 18 |
3 files changed, 36 insertions, 13 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index faf205df87..d7cec7c7d4 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Make auto_link parse a greater subset of valid url formats. [Jamis Buck] + * Integration tests: headers beginning with X aren't excluded from the HTTP_ prefix, so X-Requested-With becomes HTTP_X_REQUESTED_WITH as expected. [Mike Clark] * Tighten rescue clauses. #5985 [james@grayproductions.net] diff --git a/actionpack/lib/action_view/helpers/text_helper.rb b/actionpack/lib/action_view/helpers/text_helper.rb index f668f09d34..a2efedf100 100644 --- a/actionpack/lib/action_view/helpers/text_helper.rb +++ b/actionpack/lib/action_view/helpers/text_helper.rb @@ -313,23 +313,26 @@ module ActionView @_cycles[name] = cycle_object end - AUTO_LINK_RE = / - ( # leading text - <\w+.*?>| # leading HTML tag, or - [^=!:'"\/]| # leading punctuation, or - ^ # beginning of line + AUTO_LINK_RE = %r{ + ( # leading text + <\w+.*?>| # leading HTML tag, or + [^=!:'"/]| # leading punctuation, or + ^ # beginning of line ) ( - (?:http[s]?:\/\/)| # protocol spec, or - (?:www\.) # www.* + (?:https?://)| # protocol spec, or + (?:www\.) # www.* ) ( - ([\w]+:?[=?&\/.-]?)* # url segment - \w+[\/]? # url tail - (?:\#\w*)? # trailing anchor + [-\w]+ # subdomain or domain + (?:\.[-\w]+)* # remaining subdomains or domain + (?::\d+)? # port + (?:/(?:[~\w%.;-]+)?)* # path + (?:\?[\w%&=.;-]+)? # query string + (?:\#\w*)? # trailing anchor ) - ([[:punct:]]|\s|<|$) # trailing text - /x unless const_defined?(:AUTO_LINK_RE) + ([[:punct:]]|\s|<|$) # trailing text + }x unless const_defined?(:AUTO_LINK_RE) # 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: @@ -339,7 +342,7 @@ module ActionView 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 + all, a, b, c, d = $&, $1, $2, $3, $4 if a =~ /<a\s/i # don't replace URL's that are already linked all else diff --git a/actionpack/test/template/text_helper_test.rb b/actionpack/test/template/text_helper_test.rb index 0333e974b8..babb68ccfa 100644 --- a/actionpack/test/template/text_helper_test.rb +++ b/actionpack/test/template/text_helper_test.rb @@ -114,6 +114,24 @@ class TextHelperTest < Test::Unit::TestCase assert_equal("2 counts", pluralize(2, "count")) end + def test_auto_link_parsing + urls = %w(http://www.rubyonrails.com + http://www.rubyonrails.com:80 + http://www.rubyonrails.com/~minam + https://www.rubyonrails.com/~minam + http://www.rubyonrails.com/~minam/url%20with%20spaces + http://www.rubyonrails.com/foo.cgi?something=here + http://www.rubyonrails.com/foo.cgi?something=here&and=here + http://www.rubyonrails.com/contact;new + http://www.rubyonrails.com/contact;new%20with%20spaces + http://www.rubyonrails.com/contact;new?with=query&string=params + http://www.rubyonrails.com/~minam/contact;new?with=query&string=params) + + urls.each do |url| + assert_equal %(<a href="#{url}">#{url}</a>), auto_link(url) + end + end + def test_auto_linking email_raw = 'david@loudthinking.com' email_result = %{<a href="mailto:#{email_raw}">#{email_raw}</a>} |