Class: Gitlab::Gfm::ReferenceRewriter

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/gfm/reference_rewriter.rb

Overview

Class that unfolds local references in text.

The initializer takes text in Markdown and project this text is valid in context of.

`unfold` method tries to find all local references and unfold each of those local references to cross reference format, assuming that the argument passed to this method is a project that references will be viewed from (see `Referable#to_reference method).

Examples:

'Hello, this issue is related to #123 and

other issues labeled with ~"label"', will be converted to:

'Hello, this issue is related to gitlab-org/gitlab-ce#123 and

other issue labeled with gitlab-org/gitlab-ce~"label"'.

It does respect markdown lexical rules, so text in code block will not be replaced, see another example:

'Merge request for issue #1234, see also link:

http://gitlab.com/some/link/#1234, and code `puts #1234`' =>

'Merge request for issue gitlab-org/gitlab-ce#1234, se also link:

http://gitlab.com/some/link/#1234, and code `puts #1234`'

Constant Summary collapse

RewriteError =
Class.new(StandardError)

Instance Method Summary collapse

Constructor Details

#initialize(text, source_parent, current_user) ⇒ ReferenceRewriter

Returns a new instance of ReferenceRewriter.


36
37
38
39
40
41
42
# File 'lib/gitlab/gfm/reference_rewriter.rb', line 36

def initialize(text, source_parent, current_user)
  @text = text
  @source_parent = source_parent
  @current_user = current_user
  @original_html = markdown(text)
  @pattern = Gitlab::ReferenceExtractor.references_pattern
end

Instance Method Details

#needs_rewrite?Boolean

Returns:

  • (Boolean)

52
53
54
# File 'lib/gitlab/gfm/reference_rewriter.rb', line 52

def needs_rewrite?
  @text =~ @pattern
end

#rewrite(target_parent) ⇒ Object


44
45
46
47
48
49
50
# File 'lib/gitlab/gfm/reference_rewriter.rb', line 44

def rewrite(target_parent)
  return @text unless needs_rewrite?

  @text.gsub(@pattern) do |reference|
    unfold_reference(reference, Regexp.last_match, target_parent)
  end
end