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

76 lines
1.9 KiB
Ruby
Raw Normal View History

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)
2015-03-27 06:37:45 -04:00
@project = project
2015-03-27 07:58:23 -04:00
@current_user = current_user
end
2015-03-27 06:37:45 -04:00
def analyze(text)
@_text = text.dup
end
2015-03-27 06:37:45 -04:00
def users
result = pipeline_result(:user)
result[:references][:user].flatten.compact.uniq
end
2015-03-27 06:37:45 -04:00
def labels
result = pipeline_result(:label)
result[:references][:label].compact.uniq
2015-02-07 06:14:55 -05:00
end
2015-03-27 06:37:45 -04:00
def issues
# TODO (rspeicher): What about external issues?
result = pipeline_result(:issue)
result[:references][:issue].compact.uniq
end
2015-03-27 06:37:45 -04:00
def merge_requests
result = pipeline_result(:merge_request)
result[:references][:merge_request].compact.uniq
end
2015-03-27 06:37:45 -04:00
def snippets
result = pipeline_result(:snippet)
result[:references][:snippet].compact.uniq
end
2015-03-27 06:37:45 -04:00
def commits
result = pipeline_result(:commit)
result[:references][:commit].compact.uniq
end
2015-03-27 06:37:45 -04:00
def commit_ranges
result = pipeline_result(:commit_range)
result[:references][:commit_range].compact.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 Hash
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)
pipeline.call(@_text)
end
end
end