summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-06-09 08:37:27 +0000
committerRémy Coutable <remy@rymai.me>2016-06-09 08:37:27 +0000
commit3d72cb897efddc14021afe8b064aa2bff14c7c15 (patch)
treed8adf94fe576accedfff24b29e4a2e549f1fc51d /lib
parent13fd88faa3a334e0a9d221c578abde686d45e368 (diff)
parent19b91e749a6320d12fb299d33f1f6440777e0e26 (diff)
downloadgitlab-ce-3d72cb897efddc14021afe8b064aa2bff14c7c15.tar.gz
Merge branch '18019-fix-wiki-linking' into 'master'
Fix wiki linking behavior for markdown wiki pages Related to #18019 - As per the documentation in !4372 ## TODO - [ ] !4432 Have wiki linking behave as per the documentation - [x] Move `WikiLinkFilter` specs to the pipeline level - [x] Verify current behavior on wiki `show` page - [x] Fix current behavior on wiki `show` page - [x] Verify current behaviour on wiki preview - [x] Fix current behaviour on wiki preview - [x] Rewrite all links and get preview links working - [x] Make sure all links are on-par with the wiki `show` page - [x] TDD `WikiLinkFilter` and get it working - [x] Hook `WikiLinkFilter` up - [x] Fix tests - [x] Fix `markdown_spec` - [x] Fix `wiki` spinach feature - [x] Wait for [build](https://gitlab.com/gitlab-org/gitlab-ce/commit/4f50dd2/builds) to pass - [x] Make sure all wiki-related pages are working as expected (history, all pages, etc.) - [x] Test in different ruby versions - [x] GitLab instances hosted on a relative URL - [x] Non-markdown rendering formats? - [x] RDoc - [x] ASCIIDoc - [x] Create issues to fix things for RDoc and ASCIIDoc - [x] Gauge performance impact - [x] Refactor - [x] Re-organize commits - [x] Make sure [build](https://gitlab.com/gitlab-org/gitlab-ce/commit/f860e9a8dcabe7d5f160c32fc549807c98baa4a1/builds) passes - [x] Respond to @rymai's comments - [x] `class WikiLinkFilter < HTML::Pipeline::Filter` - [x] blank line after guard clause - [x] keyword arguments for `wiki` and `slug` - [x] invert the condition - [x] inline `user` in spec - [x] Make sure spec names are not out of date - [x] Comment for each rewrite rule - [x] Add CHANGELOG entry - [x] Reorganize commits - [x] Make sure [build](https://gitlab.com/gitlab-org/gitlab-ce/commit/19b91e749a6320d12fb299d33f1f6440777e0e26/builds) passes - [ ] Wait for merge See merge request !4432
Diffstat (limited to 'lib')
-rw-r--r--lib/banzai/filter/wiki_link_filter.rb32
-rw-r--r--lib/banzai/filter/wiki_link_filter/rewriter.rb40
2 files changed, 46 insertions, 26 deletions
diff --git a/lib/banzai/filter/wiki_link_filter.rb b/lib/banzai/filter/wiki_link_filter.rb
index 7dc771afd71..37a2779d453 100644
--- a/lib/banzai/filter/wiki_link_filter.rb
+++ b/lib/banzai/filter/wiki_link_filter.rb
@@ -2,7 +2,8 @@ require 'uri'
module Banzai
module Filter
- # HTML filter that "fixes" relative links to files in a repository.
+ # HTML filter that "fixes" links to pages/files in a wiki.
+ # Rewrite rules are documented in the `WikiPipeline` spec.
#
# Context options:
# :project_wiki
@@ -25,36 +26,15 @@ module Banzai
end
def process_link_attr(html_attr)
- return if html_attr.blank? || file_reference?(html_attr) || hierarchical_link?(html_attr)
+ return if html_attr.blank?
- uri = URI(html_attr.value)
- if uri.relative? && uri.path.present?
- html_attr.value = rebuild_wiki_uri(uri).to_s
- end
+ html_attr.value = apply_rewrite_rules(html_attr.value)
rescue URI::Error
# noop
end
- def rebuild_wiki_uri(uri)
- uri.path = ::File.join(project_wiki_base_path, uri.path)
- uri
- end
-
- def project_wiki
- context[:project_wiki]
- end
-
- def file_reference?(html_attr)
- !File.extname(html_attr.value).blank?
- end
-
- # Of the form `./link`, `../link`, or similar
- def hierarchical_link?(html_attr)
- html_attr.value[0] == '.'
- end
-
- def project_wiki_base_path
- project_wiki && project_wiki.wiki_base_path
+ def apply_rewrite_rules(link_string)
+ Rewriter.new(link_string, wiki: context[:project_wiki], slug: context[:page_slug]).apply_rules
end
end
end
diff --git a/lib/banzai/filter/wiki_link_filter/rewriter.rb b/lib/banzai/filter/wiki_link_filter/rewriter.rb
new file mode 100644
index 00000000000..2e2c8da311e
--- /dev/null
+++ b/lib/banzai/filter/wiki_link_filter/rewriter.rb
@@ -0,0 +1,40 @@
+module Banzai
+ module Filter
+ class WikiLinkFilter < HTML::Pipeline::Filter
+ class Rewriter
+ def initialize(link_string, wiki:, slug:)
+ @uri = Addressable::URI.parse(link_string)
+ @wiki_base_path = wiki && wiki.wiki_base_path
+ @slug = slug
+ end
+
+ def apply_rules
+ apply_file_link_rules!
+ apply_hierarchical_link_rules!
+ apply_relative_link_rules!
+ @uri.to_s
+ end
+
+ private
+
+ # Of the form 'file.md'
+ def apply_file_link_rules!
+ @uri = Addressable::URI.join(@slug, @uri) if @uri.extname.present?
+ end
+
+ # Of the form `./link`, `../link`, or similar
+ def apply_hierarchical_link_rules!
+ @uri = Addressable::URI.join(@slug, @uri) if @uri.to_s[0] == '.'
+ end
+
+ # Any link _not_ of the form `http://example.com/`
+ def apply_relative_link_rules!
+ if @uri.relative? && @uri.path.present?
+ link = ::File.join(@wiki_base_path, @uri.path)
+ @uri = Addressable::URI.parse(link)
+ end
+ end
+ end
+ end
+ end
+end