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 | 69 | project_path_with_namespace = project.path_with_namespace |
| 70 | 70 | paths = extract_paths(text) |
| 71 | 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 | 83 | end |
| 77 | 84 | text |
| 78 | 85 | end |
| ... | ... | @@ -83,9 +90,11 @@ module GitlabMarkdownHelper |
| 83 | 90 | select_relative(paths) |
| 84 | 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 | 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 | 98 | end |
| 90 | 99 | |
| 91 | 100 | # Removes any empty result produced by not matching the regexp |
| ... | ... | @@ -93,12 +102,22 @@ module GitlabMarkdownHelper |
| 93 | 102 | paths.reject{|l| l.empty? }.flatten |
| 94 | 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 | 110 | # Reject any path that contains ignored protocol |
| 97 | 111 | # eg. reject "https://gitlab.org} but accept "doc/api/README.md" |
| 98 | 112 | def select_relative(paths) |
| 99 | 113 | paths.reject{|path| ignored_protocols.map{|protocol| path.include?(protocol)}.any?} |
| 100 | 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 | 121 | def ignored_protocols |
| 103 | 122 | ["http://","https://", "ftp://", "mailto:"] |
| 104 | 123 | end | ... | ... |