diff options
author | Robert Speicher <robert@gitlab.com> | 2015-09-21 19:38:37 +0000 |
---|---|---|
committer | Robert Speicher <robert@gitlab.com> | 2015-09-21 19:38:37 +0000 |
commit | d4acda1253e4059d2af6a551aa750c7df8c7dd5a (patch) | |
tree | ea439afcfc40afa1a8d7f44104f29afbb42274c8 /lib | |
parent | d4a960161eecf5730b56d3f375573fa39aa67e95 (diff) | |
parent | 2b94f5fb06ef061fb49a7dadcbb95c0954bc9860 (diff) | |
download | gitlab-ce-d4acda1253e4059d2af6a551aa750c7df8c7dd5a.tar.gz |
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.rb | 40 |
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 |