Commit 2bc78739a7aa9d7e5109281fc45dbd41a1a576d4

Authored by Riyad Preukschas
1 parent 16b54178

Fix parsing of ref-like Urls in links and images in GFM

Fixes #2166
lib/gitlab/markdown.rb
... ... @@ -45,12 +45,11 @@ module Gitlab
45 45  
46 46 # Extract pre blocks so they are not altered
47 47 # from http://github.github.com/github-flavored-markdown/
48   - extractions = {}
49   - text.gsub!(%r{<pre>.*?</pre>|<code>.*?</code>}m) do |match|
50   - md5 = Digest::MD5.hexdigest(match)
51   - extractions[md5] = match
52   - "{gfm-extraction-#{md5}}"
53   - end
  48 + text.gsub!(%r{<pre>.*?</pre>|<code>.*?</code>}m) { |match| extract_piece(match) }
  49 + # Extract links with probably parsable hrefs
  50 + text.gsub!(%r{<a.*?>.*?</a>}m) { |match| extract_piece(match) }
  51 + # Extract images with probably parsable src
  52 + text.gsub!(%r{<img.*?>}m) { |match| extract_piece(match) }
54 53  
55 54 # TODO: add popups with additional information
56 55  
... ... @@ -58,7 +57,7 @@ module Gitlab
58 57  
59 58 # Insert pre block extractions
60 59 text.gsub!(/\{gfm-extraction-(\h{32})\}/) do
61   - extractions[$1]
  60 + insert_piece($1)
62 61 end
63 62  
64 63 sanitize text.html_safe, attributes: ActionView::Base.sanitized_allowed_attributes + %w(id class)
... ... @@ -66,6 +65,18 @@ module Gitlab
66 65  
67 66 private
68 67  
  68 + def extract_piece(text)
  69 + @extractions ||= {}
  70 +
  71 + md5 = Digest::MD5.hexdigest(text)
  72 + @extractions[md5] = text
  73 + "{gfm-extraction-#{md5}}"
  74 + end
  75 +
  76 + def insert_piece(id)
  77 + @extractions[id]
  78 + end
  79 +
69 80 # Private: Parses text for references and emoji
70 81 #
71 82 # text - Text to parse
... ...
lib/redcarpet/render/gitlab_html.rb
... ... @@ -27,6 +27,10 @@ class Redcarpet::Render::GitlabHTML &lt; Redcarpet::Render::HTML
27 27 HTML
28 28 end
29 29  
  30 + def link(link, title, content)
  31 + h.link_to_gfm(content, link, title: title)
  32 + end
  33 +
30 34 def postprocess(full_document)
31 35 h.gfm(full_document)
32 36 end
... ...
spec/helpers/gitlab_markdown_helper_spec.rb
1 1 require "spec_helper"
2 2  
3 3 describe GitlabMarkdownHelper do
  4 + include ApplicationHelper
  5 +
4 6 let!(:project) { create(:project) }
5 7  
6 8 let(:user) { create(:user, username: 'gfm') }
... ... @@ -340,6 +342,18 @@ describe GitlabMarkdownHelper do
340 342 markdown("\nDon't use `$#{snippet.id}` here.\n").should == "<p>Don&#39;t use <code>$#{snippet.id}</code> here.</p>\n"
341 343 end
342 344  
  345 + it "should leave ref-like autolinks untouched" do
  346 + markdown("look at http://example.tld/#!#{merge_request.id}").should == "<p>look at <a href=\"http://example.tld/#!#{merge_request.id}\">http://example.tld/#!#{merge_request.id}</a></p>\n"
  347 + end
  348 +
  349 + it "should leave ref-like href of 'manual' links untouched" do
  350 + markdown("why not [inspect !#{merge_request.id}](http://example.tld/#!#{merge_request.id})").should == "<p>why not <a href=\"http://example.tld/#!#{merge_request.id}\">inspect </a><a href=\"http://test.host/project60/merge_requests/#{merge_request.id}\" class=\"gfm gfm-merge_request \" title=\"Merge Request: #{merge_request.title}\">!#{merge_request.id}</a><a href=\"http://example.tld/#!#{merge_request.id}\"></a></p>\n"
  351 + end
  352 +
  353 + it "should leave ref-like src of images untouched" do
  354 + markdown("screen shot: ![some image](http://example.tld/#!#{merge_request.id})").should == "<p>screen shot: <img src=\"http://example.tld/#!#{merge_request.id}\" alt=\"some image\"></p>\n"
  355 + end
  356 +
343 357 it "should generate absolute urls for refs" do
344 358 markdown("##{issue.id}").should include(project_issue_url(project, issue))
345 359 end
... ...