Class: Banzai::Filter::ExternalIssueReferenceFilter

Inherits:
ReferenceFilter
  • Object
show all
Defined in:
lib/banzai/filter/external_issue_reference_filter.rb

Overview

HTML filter that replaces external issue tracker references with links. References are ignored if the project doesn't use an external issue tracker.

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ReferenceFilter

#data_attribute, #each_node, #element_node?, #escape_once, #ignore_ancestor_query, #project, #reference_class, #replace_link_node_with_href, #replace_link_node_with_text, #replace_text_when_pattern_matches, #text_node?, user_can_reference?, user_can_see_reference?, #validate, #yield_valid_link

Class Method Details

.referenced_by(node) ⇒ Object


24
25
26
27
28
29
30
31
32
33
34
# File 'lib/banzai/filter/external_issue_reference_filter.rb', line 24

def self.referenced_by(node)
  project = Project.find(node.attr("data-project")) rescue nil
  return unless project

  id = node.attr("data-external-issue")
  external_issue = ExternalIssue.new(id, project)

  return unless external_issue

  { external_issue: external_issue }
end

.references_in(text) ⇒ Object

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.


18
19
20
21
22
# File 'lib/banzai/filter/external_issue_reference_filter.rb', line 18

def self.references_in(text)
  text.gsub(ExternalIssue.reference_pattern) do |match|
    yield match, $~[:issue]
  end
end

Instance Method Details

#callObject


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/banzai/filter/external_issue_reference_filter.rb', line 36

def call
  # Early return if the project isn't using an external tracker
  return doc if project.nil? || default_issues_tracker?

  ref_pattern = ExternalIssue.reference_pattern
  ref_start_pattern = /\A#{ref_pattern}\z/

  each_node do |node|
    if text_node?(node)
      replace_text_when_pattern_matches(node, ref_pattern) do |content|
        issue_link_filter(content)
      end

    elsif element_node?(node)
      yield_valid_link(node) do |link, text|
        if link =~ ref_start_pattern
          replace_link_node_with_href(node, link) do
            issue_link_filter(link, link_text: text)
          end
        end
      end
    end
  end

  doc
end

#default_issues_tracker?Boolean

Returns:

  • (Boolean)

94
95
96
97
98
99
100
101
# File 'lib/banzai/filter/external_issue_reference_filter.rb', line 94

def default_issues_tracker?
  if RequestStore.active?
    default_issues_tracker_cache[project.id] ||=
      project.default_issues_tracker?
  else
    project.default_issues_tracker?
  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.


70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/banzai/filter/external_issue_reference_filter.rb', line 70

def issue_link_filter(text, link_text: nil)
  project = context[:project]

  self.class.references_in(text) do |match, id|
    ExternalIssue.new(id, project)

    url = url_for_issue(id, project, only_path: context[:only_path])

    title = "Issue in #{project.external_issue_tracker.title}"
    klass = reference_class(:issue)
    data  = data_attribute(project: project.id, external_issue: id)

    text = link_text || match

    %(<a href="#{url}" #{data}
         title="#{escape_once(title)}"
         class="#{klass}">#{escape_once(text)}</a>)
  end
end

#url_for_issue(*args) ⇒ Object


90
91
92
# File 'lib/banzai/filter/external_issue_reference_filter.rb', line 90

def url_for_issue(*args)
  IssuesHelper.url_for_issue(*args)
end