Commit 5277ac1b15edbb6dd7aa7a5cadee0efc07cdb3d4

Authored by Marin Jankovski
1 parent 7dbbb6de

Added comments and split the methods further.

Showing 1 changed file with 46 additions and 13 deletions   Show diff stats
app/helpers/gitlab_markdown_helper.rb
... ... @@ -59,20 +59,48 @@ module GitlabMarkdownHelper
59 59 end
60 60 end
61 61  
  62 + # text - whole text from a markdown file
  63 + # project_path_with_namespace - namespace/projectname
  64 + # ref - name of the branch or reference
  65 + # wiki - whether the markdown is from wiki or not
62 66 def create_relative_links(text, project_path_with_namespace, ref, wiki = false)
63   - links = extract_paths(text)
64   - links.each do |string|
65   - new_link = new_link(project_path_with_namespace, string, ref)
66   - text.gsub!("](#{string})", "](/#{new_link})")
  67 + paths = extract_paths(text)
  68 + paths.each do |path|
  69 + new_path = rebuild_path(project_path_with_namespace, path, ref)
  70 + # Replacing old string with a new one with brackets ]() to prevent replacing occurence of a word
  71 + # e.g. If we have a markdown like [test](test) this will replace ](test) and not the word test
  72 + text.gsub!("](#{path})", "](/#{new_path})")
67 73 end
68 74 text
69 75 end
70 76  
71   - def extract_paths(text)
72   - text.split("\n").map { |a| a.scan(/\]\(([^(]+)\)/) }.reject{|b| b.empty? }.flatten.reject{|c| c.include?("http" || "www")}
  77 + def extract_paths(markdown_text)
  78 + all_markdown_paths = pick_out_paths(markdown_text)
  79 + paths = remove_empty(all_markdown_paths)
  80 + select_relative(paths)
73 81 end
74 82  
75   - def new_link(path_with_namespace, string, ref)
  83 + # Split the markdown text to each line and find all paths, this will match anything with - ]("some_text")
  84 + def pick_out_paths(markdown_text)
  85 + markdown_text.split("\n").map { |text| text.scan(/\]\(([^(]+)\)/) }
  86 + end
  87 +
  88 + # Removes any empty result produced by not matching the regexp
  89 + def remove_empty(paths)
  90 + paths.reject{|l| l.empty? }.flatten
  91 + end
  92 +
  93 + # Reject any path that contains ignored protocol
  94 + # eg. reject "https://gitlab.org} but accept "doc/api/README.md"
  95 + def select_relative(paths)
  96 + paths.reject{|path| ignored_protocols.map{|protocol| path.include?(protocol)}.any?}
  97 + end
  98 +
  99 + def ignored_protocols
  100 + ["http://","https://", "ftp://", "mailto:"]
  101 + end
  102 +
  103 + def rebuild_path(path_with_namespace, string, ref)
76 104 [
77 105 path_with_namespace,
78 106 path_with_ref(string, ref),
... ... @@ -80,19 +108,24 @@ module GitlabMarkdownHelper
80 108 ].compact.join("/")
81 109 end
82 110  
83   - def path_with_ref(string, ref)
84   - if File.exists?(Rails.root.join(string))
85   - "#{local_path(string)}/#{correct_ref(ref)}"
  111 + # Checks if the path exists in the repo
  112 + # eg. checks if doc/README.md exists, if it doesn't then it is a wiki link
  113 + def path_with_ref(path, ref)
  114 + if File.exists?(Rails.root.join(path))
  115 + "#{local_path(path)}/#{correct_ref(ref)}"
86 116 else
87 117 "wikis"
88 118 end
89 119 end
90 120  
91   - def local_path(string)
92   - File.directory?(Rails.root.join(string)) ? "tree":"blob"
  121 + # Check if the path is pointing to a directory(tree) or a file(blob)
  122 + # eg. doc/api is directory and doc/README.md is file
  123 + def local_path(path)
  124 + File.directory?(Rails.root.join(path)) ? "tree" : "blob"
93 125 end
94 126  
  127 + # We will assume that if no ref exists we can point to master
95 128 def correct_ref(ref)
96   - ref ? ref:'master'
  129 + ref ? ref : "master"
97 130 end
98 131 end
... ...