summaryrefslogtreecommitdiff
path: root/lib/banzai/filter/external_issue_reference_filter.rb
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2015-12-15 15:51:16 +0100
committerDouwe Maan <douwe@gitlab.com>2015-12-15 15:51:16 +0100
commit7781bda9bd82997f4a03de4cf911b1156ceb2cde (patch)
treea632a12b295694232205e2190f784f9bb79235ee /lib/banzai/filter/external_issue_reference_filter.rb
parent9451db3819ae45734c4343e55a74d347cdacf70d (diff)
downloadgitlab-ce-7781bda9bd82997f4a03de4cf911b1156ceb2cde.tar.gz
Move Markdown/reference logic from Gitlab::Markdown to Banzai
Diffstat (limited to 'lib/banzai/filter/external_issue_reference_filter.rb')
-rw-r--r--lib/banzai/filter/external_issue_reference_filter.rb69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/banzai/filter/external_issue_reference_filter.rb b/lib/banzai/filter/external_issue_reference_filter.rb
new file mode 100644
index 00000000000..f5737a7ac19
--- /dev/null
+++ b/lib/banzai/filter/external_issue_reference_filter.rb
@@ -0,0 +1,69 @@
+require 'banzai'
+
+module Banzai
+ module Filter
+ # HTML filter that replaces external issue tracker references with links.
+ # References are ignored if the project doesn't use an external issue
+ # tracker.
+ class ExternalIssueReferenceFilter < ReferenceFilter
+ # Public: Find `JIRA-123` issue references in text
+ #
+ # ExternalIssueReferenceFilter.references_in(text) do |match, issue|
+ # "<a href=...>##{issue}</a>"
+ # end
+ #
+ # text - String text to search.
+ #
+ # Yields the String match and the String issue reference.
+ #
+ # Returns a String replaced with the return of the block.
+ def self.references_in(text)
+ text.gsub(ExternalIssue.reference_pattern) do |match|
+ yield match, $~[:issue]
+ end
+ end
+
+ def call
+ # Early return if the project isn't using an external tracker
+ return doc if project.nil? || project.default_issues_tracker?
+
+ replace_text_nodes_matching(ExternalIssue.reference_pattern) do |content|
+ issue_link_filter(content)
+ end
+
+ replace_link_nodes_with_href(ExternalIssue.reference_pattern) do |link, text|
+ issue_link_filter(link, link_text: text)
+ end
+ end
+
+ # Replace `JIRA-123` issue references in text with links to the referenced
+ # issue's details page.
+ #
+ # text - String text to replace references in.
+ #
+ # Returns a String with `JIRA-123` references replaced with links. All
+ # links have `gfm` and `gfm-issue` class names attached for styling.
+ def issue_link_filter(text, link_text: nil)
+ project = context[:project]
+
+ self.class.references_in(text) do |match, issue|
+ url = url_for_issue(issue, project, only_path: context[:only_path])
+
+ title = escape_once("Issue in #{project.external_issue_tracker.title}")
+ klass = reference_class(:issue)
+ data = data_attribute(project: project.id)
+
+ text = link_text || match
+
+ %(<a href="#{url}" #{data}
+ title="#{title}"
+ class="#{klass}">#{text}</a>)
+ end
+ end
+
+ def url_for_issue(*args)
+ IssuesHelper.url_for_issue(*args)
+ end
+ end
+ end
+end