summaryrefslogtreecommitdiff
path: root/lib/gitlab/gfm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/gfm')
-rw-r--r--lib/gitlab/gfm/reference_unfolder.rb31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/gitlab/gfm/reference_unfolder.rb b/lib/gitlab/gfm/reference_unfolder.rb
new file mode 100644
index 00000000000..4969e8ebe85
--- /dev/null
+++ b/lib/gitlab/gfm/reference_unfolder.rb
@@ -0,0 +1,31 @@
+module Gitlab
+ module Gfm
+ ##
+ # Class than unfolds local references in text.
+ #
+ #
+ class ReferenceUnfolder
+ def initialize(text, project)
+ @text = text
+ @project = project
+ end
+
+ def unfold(from_project)
+ referables.each_with_object(@text.dup) do |referable, text|
+ next unless referable.respond_to?(:to_reference)
+
+ pattern = /#{Regexp.escape(referable.to_reference)}/
+ text.gsub!(pattern, referable.to_reference(from_project))
+ end
+ end
+
+ private
+
+ def referables
+ extractor = Gitlab::ReferenceExtractor.new(@project)
+ extractor.analyze(@text)
+ extractor.all
+ end
+ end
+ end
+end