diff options
Diffstat (limited to 'lib/gitlab/gfm/reference_rewriter.rb')
-rw-r--r-- | lib/gitlab/gfm/reference_rewriter.rb | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index 5d0a638f97a..40dcac5f46f 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -31,30 +31,41 @@ module Gitlab # http://gitlab.com/some/link/#1234, and code `puts #1234`' # class ReferenceRewriter + include Gitlab::Utils::StrongMemoize + RewriteError = Class.new(StandardError) - def initialize(text, source_parent, current_user) + def initialize(text, text_html, source_parent, current_user) @text = text + + # If for some reason cached html is not present it gets rendered here + @text_html = text_html || original_html + @source_parent = source_parent @current_user = current_user - @original_html = markdown(text) @pattern = Gitlab::ReferenceExtractor.references_pattern end def rewrite(target_parent) return @text unless needs_rewrite? - @text.gsub(@pattern) do |reference| + @text.gsub!(@pattern) do |reference| unfold_reference(reference, Regexp.last_match, target_parent) end end def needs_rewrite? - @text =~ @pattern + strong_memoize(:needs_rewrite) { @text_html.include?('data-reference-type=') } end private + def original_html + strong_memoize(:original_html) do + markdown(@text) + end + end + def unfold_reference(reference, match, target_parent) before = @text[0...match.begin(0)] after = @text[match.end(0)..] @@ -89,7 +100,7 @@ module Gitlab end def substitution_valid?(substituted) - @original_html == markdown(substituted) + original_html == markdown(substituted) end def markdown(text) |