Class: Banzai::Filter::References::ExternalIssueReferenceFilter::LinkResolutionFilter

Inherits:
HTML::Pipeline::Filter
  • Object
show all
Defined in:
lib/banzai/filter/references/external_issue_reference_filter.rb

Overview

Called from PostProcessPipeline to add hrefs to anchors created above.

We might be operating on cached HTML which already has hrefs; replace them anyway, as they could be out of date.

Instance Method Summary collapse

Instance Method Details

#callObject



100
101
102
103
104
105
106
107
108
109
# File 'lib/banzai/filter/references/external_issue_reference_filter.rb', line 100

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

  doc.xpath(query).each do |node|
    node["href"] = url_for_issue(node["data-external-issue"])
  end

  doc
end

#projectObject



117
118
119
# File 'lib/banzai/filter/references/external_issue_reference_filter.rb', line 117

def project
  context[:project]
end

#queryObject



111
112
113
114
115
# File 'lib/banzai/filter/references/external_issue_reference_filter.rb', line 111

def query
  @query ||= %{descendant-or-self::a[
    @data-reference-type="external_issue" and boolean(@data-external-issue)
  ]}
end

#url_for_issue(issue_id) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/banzai/filter/references/external_issue_reference_filter.rb', line 121

def url_for_issue(issue_id)
  url = if context[:only_path]
          project.external_issue_tracker.issue_path(issue_id)
        else
          project.external_issue_tracker.issue_url(issue_id)
        end

  # Ensure we return a valid URL to prevent possible XSS.
  URI.parse(url).to_s
rescue URI::InvalidURIError
  ''
end