gitlab-org--gitlab-foss/lib/gitlab/reference_extractor.rb

78 lines
1.7 KiB
Ruby

module Gitlab
# Extract possible GFM references from an arbitrary String for further processing.
class ReferenceExtractor
attr_accessor :project, :current_user, :references
def initialize(project, current_user = nil)
@project = project
@current_user = current_user
end
def analyze(text)
@_text = text.dup
end
def users
result = pipeline_result(:user)
result.uniq
end
def labels
result = pipeline_result(:label)
result.uniq
end
def issues
# TODO (rspeicher): What about external issues?
result = pipeline_result(:issue)
result.uniq
end
def merge_requests
result = pipeline_result(:merge_request)
result.uniq
end
def snippets
result = pipeline_result(:snippet)
result.uniq
end
def commits
result = pipeline_result(:commit)
result.uniq
end
def commit_ranges
result = pipeline_result(:commit_range)
result.uniq
end
private
# Instantiate and call HTML::Pipeline with a single reference filter type,
# returning the result
#
# filter_type - Symbol reference type (e.g., :commit, :issue, etc.)
#
# Returns the results Array for the requested filter type
def pipeline_result(filter_type)
klass = filter_type.to_s.camelize + 'ReferenceFilter'
filter = "Gitlab::Markdown::#{klass}".constantize
context = {
project: project,
current_user: current_user,
# We don't actually care about the links generated
only_path: true
}
pipeline = HTML::Pipeline.new([filter], context)
result = pipeline.call(@_text)
result[:references][filter_type]
end
end
end