diff --git a/app/services/inline_uploads.rb b/app/services/inline_uploads.rb index 35e1f0b4fdf..f16f4e5110a 100644 --- a/app/services/inline_uploads.rb +++ b/app/services/inline_uploads.rb @@ -34,7 +34,7 @@ class InlineUploads if (actual_link = (node.attributes["href"]&.value || node.attributes["src"]&.value)) link_occurences << { link: actual_link, is_valid: true } elsif node.name != "p" - link_occurences << { link: actual_link, is_valid: false } + link_occurences << { link: seen_link, is_valid: false } end end end @@ -219,8 +219,8 @@ class InlineUploads end def self.match_img(markdown, external_src: false) - markdown.scan(/(([ ]*)<(?!img)[^<>]+\/?>)?([\r\n]*)(([ ]*)\n]+)>([ ]*))([\r\n]*)/i) do |match| - node = Nokogiri::HTML::fragment(match[3].strip).children[0] + markdown.scan(/(<(?!img)[^<>]+\/?>)?(\s*)(\n]+>)/i) do |match| + node = Nokogiri::HTML::fragment(match[2].strip).children[0] src = node.attributes["src"]&.value if src && (matched_uploads(src).present? || external_src) @@ -229,36 +229,10 @@ class InlineUploads height = node.attributes["height"]&.value.to_i title = node.attributes["title"]&.value text = "#{text}|#{width}x#{height}" if width > 0 && height > 0 - after_html_tag = match[0].present? + spaces_before = match[1].present? ? match[1][/ +$/].size : 0 + replacement = +"#{" " * spaces_before}![#{text}](#{PLACEHOLDER}#{title.present? ? " \"#{title}\"" : ""})" - spaces_before = - if after_html_tag && !match[0].end_with?("/>") - (match[4].length > 0 ? match[4] : " ") - else - "" - end - - replacement = +"#{spaces_before}![#{text}](#{PLACEHOLDER}#{title.present? ? " \"#{title}\"" : ""})" - - if after_html_tag && (num_newlines = match[2].length) <= 1 - replacement.prepend("\n" * (num_newlines == 0 ? 2 : 1)) - end - - if after_html_tag && !match[0].end_with?("/>") && (num_newlines = match[7].length) <= 1 - replacement += ("\n" * (num_newlines == 0 ? 2 : 1)) - end - - match[3].strip! if !after_html_tag - - if (match[1].nil? || match[1].length < 4) - if (match[4].nil? || match[4].length < 4) - yield(match[3], src, replacement, $~.offset(0)[0]) if block_given? - else - yield(match[3], src, match[3].sub(src, PATH_PLACEHOLDER), $~.offset(0)[0]) if block_given? - end - else - yield(match[3], src, match[3].sub(src, PATH_PLACEHOLDER), $~.offset(0)[0]) if block_given? - end + yield(match[2], src, replacement, $~.offset(0)[0]) if block_given? end end end diff --git a/spec/jobs/pull_hotlinked_images_spec.rb b/spec/jobs/pull_hotlinked_images_spec.rb index a96e476ce73..dd194f3b897 100644 --- a/spec/jobs/pull_hotlinked_images_spec.rb +++ b/spec/jobs/pull_hotlinked_images_spec.rb @@ -77,7 +77,7 @@ describe Jobs::PullHotlinkedImages do expect(post.reload.raw).to eq(<<~RAW.chomp)

- somelink + ![somelink](#{upload.short_url}) RAW end diff --git a/spec/services/inline_uploads_spec.rb b/spec/services/inline_uploads_spec.rb index 0bd1e6cb581..ea55a82352b 100644 --- a/spec/services/inline_uploads_spec.rb +++ b/spec/services/inline_uploads_spec.rb @@ -329,6 +329,14 @@ RSpec.describe InlineUploads do + + `image inside code quotes` + + ``` + image inside code fences + ``` + + image inside code block MD expect(InlineUploads.process(md)).to eq(<<~MD) @@ -346,6 +354,14 @@ RSpec.describe InlineUploads do ![|5x4](#{upload.short_url}) ![](#{upload.short_url}) + + `image inside code quotes` + + ``` + image inside code fences + ``` + + image inside code block MD end @@ -381,7 +397,7 @@ RSpec.describe InlineUploads do expect(InlineUploads.process(md)).to eq(<<~MD)

- test + ![test|500x500](#{upload2.short_url}) @@ -391,7 +407,7 @@ RSpec.describe InlineUploads do md = "

\r\n
\r\n \"test\"\r\n" - expect(InlineUploads.process(md)).to eq("

\r\n\r\n \"test\"\r\n") + expect(InlineUploads.process(md)).to eq("

\r\n\r\n ![test|500x500](#{upload.short_url})\r\n") end it "should correctly update image sources within anchor or paragraph tags" do @@ -423,40 +439,27 @@ RSpec.describe InlineUploads do expect(InlineUploads.process(md)).to eq(<<~MD) - ![test|500x500](#{upload.short_url}) -

- ![test](#{upload2.short_url}) -

- + ![test|500x500](#{upload3.short_url}) - ![test|500x500](#{upload3.short_url}) - - - - - - ![test|500x500](#{upload.short_url}) - - + ![test|500x500](#{upload.short_url}) - ![test|500x500](#{upload.short_url}) + ![test|500x500](#{upload.short_url})

Test ![test|500x500](#{upload2.short_url})


- ![test|500x500](#{upload2.short_url}) MD end