diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-09-17 16:48:04 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-09-17 16:48:04 +0000 |
commit | 14b4afeec90a9048d06e5d5dc1ea45927fcc49f8 (patch) | |
tree | 4ac20943be407d2f675eaad1cf84fdf2d32f9e10 | |
parent | 3520961eae873fcbb983414ad8e18500b377c5b7 (diff) | |
download | redmine-14b4afeec90a9048d06e5d5dc1ea45927fcc49f8.tar.gz redmine-14b4afeec90a9048d06e5d5dc1ea45927fcc49f8.zip |
Fixed: http links containing parentheses fail to reder correctly (#1591). Patch by Paul Rivier.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1871 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | lib/redcloth3.rb | 10 | ||||
-rw-r--r-- | lib/redmine/wiki_formatting.rb | 10 | ||||
-rw-r--r-- | test/unit/helpers/application_helper_test.rb | 8 |
3 files changed, 24 insertions, 4 deletions
diff --git a/lib/redcloth3.rb b/lib/redcloth3.rb index b2e44359e..a5e63262c 100644 --- a/lib/redcloth3.rb +++ b/lib/redcloth3.rb @@ -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 diff --git a/lib/redmine/wiki_formatting.rb b/lib/redmine/wiki_formatting.rb index 649edfeff..7dffff492 100644 --- a/lib/redmine/wiki_formatting.rb +++ b/lib/redmine/wiki_formatting.rb @@ -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 diff --git a/test/unit/helpers/application_helper_test.rb b/test/unit/helpers/application_helper_test.rb index 6db029ada..7ef47f592 100644 --- a/test/unit/helpers/application_helper_test.rb +++ b/test/unit/helpers/application_helper_test.rb @@ -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&t=z&s=">http://foo.bar/page?p=1&t=z&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) } |