]> source.dussan.org Git - redmine.git/commitdiff
Fixed: http links containing parentheses fail to reder correctly (#1591). Patch by...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 17 Sep 2008 16:48:04 +0000 (16:48 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 17 Sep 2008 16:48:04 +0000 (16:48 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1871 e93f8b46-1217-0410-a6f0-8f06a7374b81

lib/redcloth3.rb
lib/redmine/wiki_formatting.rb
test/unit/helpers/application_helper_test.rb

index b2e44359e14c803a2cf20ed88c5917630bdcb1d7..a5e63262c442d52b8f8ba18b1028bb110a3a9295 100644 (file)
@@ -788,10 +788,10 @@ class RedCloth3 < String
             ":
             ([\w\/]\S+?)               # $url
             (\/)?                      # $slash
-            ([^\w\/;]*?)               # $post
+            ([^\w\=\/;\(\)]*?)         # $post
             (?=<|\s|$)
         /x 
-
+#"
     def inline_textile_link( text ) 
         text.gsub!( LINK_RE ) do |m|
             pre,atts,text,title,url,slash,post = $~[1..7]
@@ -799,6 +799,12 @@ class RedCloth3 < String
             url, url_title = check_refs( url )
             title ||= url_title
             
+            # Idea below : an URL with unbalanced parethesis and
+            # ending by ')' is put into external parenthesis
+            if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) )
+              url=url[0..-2] # discard closing parenth from url
+              post = ")"+post # add closing parenth to post
+            end
             atts = pba( atts )
             atts = " href=\"#{ url }#{ slash }\"#{ atts }"
             atts << " title=\"#{ title }\"" if title
index 649edfeff3be56df2234cb01b51c8756ecb21c9d..7dffff4923a6410e3716d8296f0c81ab4020ccb4 100644 (file)
@@ -144,7 +144,7 @@ module Redmine
                           (\S+?)                   # url
                           (\/)?                    # slash
                         )
-                        ([^\w\=\/;]*?)               # post
+                        ([^\w\=\/;\(\)]*?)               # post
                         (?=<|\s|$)
                        }x unless const_defined?(:AUTO_LINK_RE)
 
@@ -156,7 +156,13 @@ module Redmine
             # don't replace URL's that are already linked
             # and URL's prefixed with ! !> !< != (textile images)
             all
-          else            
+          else
+            # Idea below : an URL with unbalanced parethesis and
+            # ending by ')' is put into external parenthesis
+            if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) )
+              url=url[0..-2] # discard closing parenth from url
+              post = ")"+post # add closing parenth to post
+            end
             %(#{leading}<a class="external" href="#{proto=="www."?"http://www.":proto}#{url}">#{proto + url}</a>#{post})
           end
         end
index 6db029adabbf4d0ccd3ecd58b825abc453f425e2..7ef47f5926025256283a9622da0bd0f61446778d 100644 (file)
@@ -38,10 +38,18 @@ class ApplicationHelperTest < HelperTestCase
       'This is a link: http://foo.bar.' => 'This is a link: <a class="external" href="http://foo.bar">http://foo.bar</a>.',
       'A link (eg. http://foo.bar).' => 'A link (eg. <a class="external" href="http://foo.bar">http://foo.bar</a>).',
       'http://foo.bar/foo.bar#foo.bar.' => '<a class="external" href="http://foo.bar/foo.bar#foo.bar">http://foo.bar/foo.bar#foo.bar</a>.',
+      'http://www.foo.bar/Test_(foobar)' => '<a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>',
+      '(see inline link : http://www.foo.bar/Test_(foobar))' => '(see inline link : <a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>)',
+      '(see inline link : http://www.foo.bar/Test)' => '(see inline link : <a class="external" href="http://www.foo.bar/Test">http://www.foo.bar/Test</a>)',
+      '(see inline link : http://www.foo.bar/Test).' => '(see inline link : <a class="external" href="http://www.foo.bar/Test">http://www.foo.bar/Test</a>).',
+      '(see "inline link":http://www.foo.bar/Test_(foobar))' => '(see <a href="http://www.foo.bar/Test_(foobar)" class="external">inline link</a>)',
+      '(see "inline link":http://www.foo.bar/Test)' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>)',
+      '(see "inline link":http://www.foo.bar/Test).' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>).',
       'www.foo.bar' => '<a class="external" href="http://www.foo.bar">www.foo.bar</a>',
       'http://foo.bar/page?p=1&t=z&s=' => '<a class="external" href="http://foo.bar/page?p=1&#38;t=z&#38;s=">http://foo.bar/page?p=1&#38;t=z&#38;s=</a>',
       'http://foo.bar/page#125' => '<a class="external" href="http://foo.bar/page#125">http://foo.bar/page#125</a>',
       'http://foo@www.bar.com' => '<a class="external" href="http://foo@www.bar.com">http://foo@www.bar.com</a>',
+      'http://foo:bar@www.bar.com' => '<a class="external" href="http://foo:bar@www.bar.com">http://foo:bar@www.bar.com</a>',
       'ftp://foo.bar' => '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>',
     }
     to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }