Fixed: Links get chopped by punctuation marks in anchors.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@775 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang 2007-09-30 15:16:58 +00:00
parent cae547a7ea
commit b4d66593ef
2 changed files with 13 additions and 15 deletions

View File

@ -1,6 +1,6 @@
require 'redcloth' require 'redcloth'
require 'coderay' require 'coderay'
require 'pp'
module Redmine module Redmine
module WikiFormatting module WikiFormatting
@ -79,29 +79,25 @@ module Redmine
( (
(?:https?://)| # protocol spec, or (?:https?://)| # protocol spec, or
(?:www\.) # www.* (?:www\.) # www.*
)
(
[-\w]+ # subdomain or domain
(?:\.[-\w]+)* # remaining subdomains or domain
(?::\d+)? # port
(?:/(?:(?:[~\w\+%-]|(?:[,.;:][^\s$]))+)?)* # path
(?:\?[\w\+%&=.;-]+)? # query string
(?:\#[\w\-]*)? # trailing anchor
) )
([[:punct:]]|\s|<|$) # trailing text (
(\S+?) # url
(\/)? # slash
)
([^\w\=\/;]*?) # post
(?=<|\s|$)
}x unless const_defined?(:AUTO_LINK_RE) }x unless const_defined?(:AUTO_LINK_RE)
# Turns all urls into clickable links (code from Rails). # Turns all urls into clickable links (code from Rails).
def inline_auto_link(text) def inline_auto_link(text)
text.gsub!(AUTO_LINK_RE) do text.gsub!(AUTO_LINK_RE) do
all, a, b, c, d = $&, $1, $2, $3, $4 all, leading, proto, url, post = $&, $1, $2, $3, $6
if a =~ /<a\s/i || a =~ /![<>=]?/ if leading =~ /<a\s/i || leading =~ /![<>=]?/
# don't replace URL's that are already linked # don't replace URL's that are already linked
# and URL's prefixed with ! !> !< != (textile images) # and URL's prefixed with ! !> !< != (textile images)
all all
else else
text = b + c %(#{leading}<a href="#{proto=="www."?"http://www.":proto}#{url}">#{proto + url}</a>#{post})
%(#{a}<a href="#{b=="www."?"http://www.":b}#{c}">#{text}</a>#{d})
end end
end end
end end

View File

@ -29,6 +29,8 @@ class ApplicationHelperTest < HelperTestCase
def test_auto_links def test_auto_links
to_test = { to_test = {
'http://foo.bar' => '<a href="http://foo.bar">http://foo.bar</a>', 'http://foo.bar' => '<a href="http://foo.bar">http://foo.bar</a>',
'http://foo.bar.' => '<a href="http://foo.bar">http://foo.bar</a>.',
'http://foo.bar/foo.bar#foo.bar.' => '<a href="http://foo.bar/foo.bar#foo.bar">http://foo.bar/foo.bar#foo.bar</a>.',
'www.foo.bar' => '<a href="http://www.foo.bar">www.foo.bar</a>', 'www.foo.bar' => '<a href="http://www.foo.bar">www.foo.bar</a>',
'http://foo.bar/page?p=1&t=z&s=' => '<a 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?p=1&t=z&s=' => '<a 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 href="http://foo.bar/page#125">http://foo.bar/page#125</a>' 'http://foo.bar/page#125' => '<a href="http://foo.bar/page#125">http://foo.bar/page#125</a>'