Commit 16ba8fa077145f99dff98501770ed80d0a58fd58
1 parent
1018cbdc
Exists in
spb-stable
and in
3 other branches
Display correct paths in markdown for reference style links.
Showing
1 changed file
with
25 additions
and
6 deletions
Show diff stats
app/helpers/gitlab_markdown_helper.rb
@@ -69,10 +69,17 @@ module GitlabMarkdownHelper | @@ -69,10 +69,17 @@ module GitlabMarkdownHelper | ||
69 | project_path_with_namespace = project.path_with_namespace | 69 | project_path_with_namespace = project.path_with_namespace |
70 | paths = extract_paths(text) | 70 | paths = extract_paths(text) |
71 | paths.each do |file_path| | 71 | paths.each do |file_path| |
72 | - new_path = rebuild_path(project_path_with_namespace, file_path, requested_path, ref) | ||
73 | - # Replacing old string with a new one with brackets ]() to prevent replacing occurence of a word | ||
74 | - # e.g. If we have a markdown like [test](test) this will replace ](test) and not the word test | ||
75 | - text.gsub!("](#{file_path})", "](/#{new_path})") | 72 | + original_file_path = extract(file_path) |
73 | + new_path = rebuild_path(project_path_with_namespace, original_file_path, requested_path, ref) | ||
74 | + if reference_path?(file_path) | ||
75 | + # Replacing old string with a new one that contains updated path | ||
76 | + # eg. [some document]: document.md will be replaced with [some document] /namespace/project/master/blob/document.md | ||
77 | + text.gsub!(file_path, file_path.gsub(original_file_path, "/#{new_path}")) | ||
78 | + else | ||
79 | + # Replacing old string with a new one with brackets ]() to prevent replacing occurence of a word | ||
80 | + # e.g. If we have a markdown like [test](test) this will replace ](test) and not the word test | ||
81 | + text.gsub!("](#{file_path})", "](/#{new_path})") | ||
82 | + end | ||
76 | end | 83 | end |
77 | text | 84 | text |
78 | end | 85 | end |
@@ -83,9 +90,11 @@ module GitlabMarkdownHelper | @@ -83,9 +90,11 @@ module GitlabMarkdownHelper | ||
83 | select_relative(paths) | 90 | select_relative(paths) |
84 | end | 91 | end |
85 | 92 | ||
86 | - # Split the markdown text to each line and find all paths, this will match anything with - ]("some_text") | 93 | + # Split the markdown text to each line and find all paths, this will match anything with - ]("some_text") and [some text]: file.md |
87 | def pick_out_paths(markdown_text) | 94 | def pick_out_paths(markdown_text) |
88 | - markdown_text.split("\n").map { |text| text.scan(/\]\(([^(]+)\)/) } | 95 | + inline_paths = markdown_text.split("\n").map { |text| text.scan(/\]\(([^(]+)\)/) } |
96 | + reference_paths = markdown_text.split("\n").map { |text| text.scan(/\[.*\]:.*/) } | ||
97 | + inline_paths + reference_paths | ||
89 | end | 98 | end |
90 | 99 | ||
91 | # Removes any empty result produced by not matching the regexp | 100 | # Removes any empty result produced by not matching the regexp |
@@ -93,12 +102,22 @@ module GitlabMarkdownHelper | @@ -93,12 +102,22 @@ module GitlabMarkdownHelper | ||
93 | paths.reject{|l| l.empty? }.flatten | 102 | paths.reject{|l| l.empty? }.flatten |
94 | end | 103 | end |
95 | 104 | ||
105 | + # If a path is a reference style link we need to omit ]: | ||
106 | + def extract(path) | ||
107 | + path.split("]: ").last | ||
108 | + end | ||
109 | + | ||
96 | # Reject any path that contains ignored protocol | 110 | # Reject any path that contains ignored protocol |
97 | # eg. reject "https://gitlab.org} but accept "doc/api/README.md" | 111 | # eg. reject "https://gitlab.org} but accept "doc/api/README.md" |
98 | def select_relative(paths) | 112 | def select_relative(paths) |
99 | paths.reject{|path| ignored_protocols.map{|protocol| path.include?(protocol)}.any?} | 113 | paths.reject{|path| ignored_protocols.map{|protocol| path.include?(protocol)}.any?} |
100 | end | 114 | end |
101 | 115 | ||
116 | + # Check whether a path is a reference-style link | ||
117 | + def reference_path?(path) | ||
118 | + path.include?("]: ") | ||
119 | + end | ||
120 | + | ||
102 | def ignored_protocols | 121 | def ignored_protocols |
103 | ["http://","https://", "ftp://", "mailto:"] | 122 | ["http://","https://", "ftp://", "mailto:"] |
104 | end | 123 | end |