Commit a675bea2 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'rs-issue-1721' into 'master'

Fix link_to_gfm with only a reference having the incorrect link

Before:

```ruby
link_to_gfm("#4", "/foo")     # => "<a href="/namespace/project/issues/4" class="gfm gfm-issue">#4</a>"
link_to_gfm("See #4", "/foo") # => "<a href="/foo">See </a><a href="/namespace/project/issues/4" class="gfm gfm-issue">#4</a>"
```

After:

```ruby
link_to_gfm("#4", "/foo")     # => "<a href="/foo">#4</a>"
link_to_gfm("See #4", "/foo") # => "<a href="/foo">See </a><a href="/namespace/project/issues/4" class="gfm gfm-issue">#4</a>"
```

Closes #192
Closes #1721
Closes [GitHub #7115](https://github.com/gitlabhq/gitlabhq/issues/7115)

See merge request !739
parents d99637bf 5733bdb7
require 'nokogiri'
module GitlabMarkdownHelper
include Gitlab::Markdown
......@@ -21,11 +23,22 @@ module GitlabMarkdownHelper
gfm_body = gfm(escaped_body, {}, html_options)
gfm_body.gsub!(%r{<a.*?>.*?</a>}m) do |match|
"</a>#{match}#{link_to("", url, html_options)[0..-5]}" # "</a>".length +1
fragment = Nokogiri::XML::DocumentFragment.parse(gfm_body)
if fragment.children.size == 1 && fragment.children[0].name == 'a'
# Fragment has only one node, and it's a link generated by `gfm`.
# Replace it with our requested link.
text = fragment.children[0].text
fragment.children[0].replace(link_to(text, url, html_options))
else
# Traverse the fragment's first generation of children looking for pure
# text, wrapping anything found in the requested link
fragment.children.each do |node|
next unless node.text?
node.replace(link_to(node.text, url, html_options))
end
end
link_to(gfm_body.html_safe, url, html_options)
fragment.to_html.html_safe
end
def markdown(text, options={})
......
......@@ -94,6 +94,12 @@ describe GitlabMarkdownHelper do
expect(link_to_gfm(actual, commit_path)).
to match('&lt;h1&gt;test&lt;/h1&gt;')
end
it 'ignores reference links when they are the entire body' do
text = issues[0].to_reference
act = link_to_gfm(text, '/foo')
expect(act).to eq %Q(<a href="/foo">#{issues[0].to_reference}</a>)
end
end
describe '#render_wiki_content' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment