Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRobert Speicher <robert@gitlab.com>2015-09-21 22:38:37 +0300
committerRobert Speicher <robert@gitlab.com>2015-09-21 22:38:37 +0300
commitd4acda1253e4059d2af6a551aa750c7df8c7dd5a (patch)
treeea439afcfc40afa1a8d7f44104f29afbb42274c8 /lib
parentd4a960161eecf5730b56d3f375573fa39aa67e95 (diff)
parent2b94f5fb06ef061fb49a7dadcbb95c0954bc9860 (diff)
Merge branch 'rs-relative-link-up-one' into 'master'
Allow relative links to go up one directory level See merge request !1352
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/markdown/relative_link_filter.rb40
1 files changed, 29 insertions, 11 deletions
diff --git a/lib/gitlab/markdown/relative_link_filter.rb b/lib/gitlab/markdown/relative_link_filter.rb
index 8c5cf51bfe1..6ee3d1ce039 100644
--- a/lib/gitlab/markdown/relative_link_filter.rb
+++ b/lib/gitlab/markdown/relative_link_filter.rb
@@ -59,25 +59,43 @@ module Gitlab
end
def relative_file_path(path)
- nested_path = build_nested_path(path, context[:requested_path])
+ nested_path = build_relative_path(path, context[:requested_path])
file_exists?(nested_path) ? nested_path : path
end
- # Covering a special case, when the link is referencing file in the same
- # directory.
- # If we are at doc/api/README.md and the README.md contains relative
- # links like [Users](users.md), this takes the request
- # path(doc/api/README.md) and replaces the README.md with users.md so the
- # path looks like doc/api/users.md.
- # If we are at doc/api and the README.md shown in below the tree view
- # this takes the request path(doc/api) and adds users.md so the path
- # looks like doc/api/users.md
- def build_nested_path(path, request_path)
+ # Convert a relative path into its correct location based on the currently
+ # requested path
+ #
+ # path - Relative path String
+ # request_path - Currently-requested path String
+ #
+ # Examples:
+ #
+ # # File in the same directory as the current path
+ # build_relative_path("users.md", "doc/api/README.md")
+ # # => "doc/api/users.md"
+ #
+ # # File in the same directory, which is also the current path
+ # build_relative_path("users.md", "doc/api")
+ # # => "doc/api/users.md"
+ #
+ # # Going up one level to a different directory
+ # build_relative_path("../update/7.14-to-8.0.md", "doc/api/README.md")
+ # # => "doc/update/7.14-to-8.0.md"
+ #
+ # Returns a String
+ def build_relative_path(path, request_path)
return request_path if path.empty?
return path unless request_path
parts = request_path.split('/')
parts.pop if path_type(request_path) != 'tree'
+
+ while parts.length > 1 && path.start_with?('../')
+ parts.pop
+ path.sub!('../', '')
+ end
+
parts.push(path).join('/')
end