60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| require 'gitlab/markdown'
 | |
| 
 | |
| module Gitlab
 | |
|   # Extract possible GFM references from an arbitrary String for further processing.
 | |
|   class ReferenceExtractor
 | |
|     attr_accessor :project, :current_user
 | |
| 
 | |
|     def initialize(project, current_user = nil)
 | |
|       @project = project
 | |
|       @current_user = current_user
 | |
|     end
 | |
| 
 | |
|     def analyze(text)
 | |
|       references.clear
 | |
|       @text = Gitlab::Markdown.render_without_gfm(text)
 | |
|     end
 | |
| 
 | |
|     %i(user label issue merge_request snippet commit commit_range).each do |type|
 | |
|       define_method("#{type}s") do
 | |
|         references[type]
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     private
 | |
| 
 | |
|     def references
 | |
|       @references ||= Hash.new do |references, type|
 | |
|         type = type.to_sym
 | |
|         return references[type] if references.has_key?(type)
 | |
| 
 | |
|         references[type] = pipeline_result(type).uniq
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     # 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.const_get(klass)
 | |
| 
 | |
|       context = {
 | |
|         project: project,
 | |
|         current_user: current_user,
 | |
|         # We don't actually care about the links generated
 | |
|         only_path: true,
 | |
|         ignore_blockquotes: true
 | |
|       }
 | |
| 
 | |
|       pipeline = HTML::Pipeline.new([filter], context)
 | |
|       result = pipeline.call(@text)
 | |
| 
 | |
|       result[:references][filter_type]
 | |
|     end
 | |
|   end
 | |
| end
 |