FIX: support <img> in code blocks when inlining uploads

Simpler code is better :)

Also added moar specs to ensure <img> tag inside code blocks are properly ignored.
This commit is contained in:
Régis Hanol 2019-09-12 21:25:14 +02:00
parent 8f601d5025
commit aa511c5b59
3 changed files with 28 additions and 51 deletions

View File

@ -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]*)(([ ]*)<img ([^>\n]+)>([ ]*))([\r\n]*)/i) do |match|
node = Nokogiri::HTML::fragment(match[3].strip).children[0]
markdown.scan(/(<(?!img)[^<>]+\/?>)?(\s*)(<img [^>\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

View File

@ -77,7 +77,7 @@ describe Jobs::PullHotlinkedImages do
expect(post.reload.raw).to eq(<<~RAW.chomp)
<h1></h1>
<a href="https://somelink.com">
<img alt="somelink" src="#{upload.short_path}" />
![somelink](#{upload.short_url})
</a>
RAW
end

View File

@ -329,6 +329,14 @@ RSpec.describe InlineUploads do
<img src="#{upload.url}" width="5" height="4">
<img src="#{upload.url}" width="5px" height="auto">
`<img src="#{upload.url}" alt="image inside code quotes">`
```
<img src="#{upload.url}" alt="image inside code fences">
```
<img src="#{upload.url}" alt="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})
`<img src="#{upload.url}" alt="image inside code quotes">`
```
<img src="#{upload.url}" alt="image inside code fences">
```
<img src="#{upload.url}" alt="image inside code block">
MD
end
@ -381,7 +397,7 @@ RSpec.describe InlineUploads do
expect(InlineUploads.process(md)).to eq(<<~MD)
<h1></h1>
<a href="http://somelink.com">
<img src="#{upload2.short_path}" alt="test" width="500" height="500">
![test|500x500](#{upload2.short_url})
</a>
<a href="http://somelink.com">
@ -391,7 +407,7 @@ RSpec.describe InlineUploads do
md = "<h1></h1>\r\n<a href=\"http://somelink.com\">\r\n <img src=\"#{upload.url}\" alt=\"test\" width=\"500\" height=\"500\">\r\n</a>"
expect(InlineUploads.process(md)).to eq("<h1></h1>\r\n<a href=\"http://somelink.com\">\r\n <img src=\"#{upload.short_path}\" alt=\"test\" width=\"500\" height=\"500\">\r\n</a>")
expect(InlineUploads.process(md)).to eq("<h1></h1>\r\n<a href=\"http://somelink.com\">\r\n ![test|500x500](#{upload.short_url})\r\n</a>")
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)
<a href="http://somelink.com">
![test|500x500](#{upload.short_url})
</a>
<p>
![test](#{upload2.short_url})
</p>
<a href="http://somelink.com">
<a href="http://somelink.com">![test|500x500](#{upload3.short_url})</a>
![test|500x500](#{upload3.short_url})
</a>
<a href="http://somelink.com">
![test|500x500](#{upload.short_url})
</a>
<a href="http://somelink.com"> ![test|500x500](#{upload.short_url}) </a>
<a href="http://somelink.com">
![test|500x500](#{upload.short_url})
![test|500x500](#{upload.short_url})
</a>
<p>Test ![test|500x500](#{upload2.short_url})</p>
<hr/>
![test|500x500](#{upload2.short_url})
MD
end