fix: Renders youtube and vimeo links within blank lines as embeds (#7422)

Within the article we are now rendering every link for youtube and vimeo as embeds. This isn't a good solution, as users might need to have plain links as well. This fix will render only links within two blank lines as embeds.

Co-authored-by: Sojan Jose <sojan@pepalo.com>
This commit is contained in:
Nithin David Thomas
2023-09-21 12:46:03 +05:30
committed by GitHub
parent 27fc24375d
commit 53dc38e650
2 changed files with 32 additions and 3 deletions

View File

@@ -15,11 +15,30 @@ class CustomMarkdownRenderer < CommonMarker::HtmlRenderer
end end
def link(node) def link(node)
render_embedded_content(node) || super return if surrounded_by_empty_lines?(node) && render_embedded_content(node)
# If it's not YouTube or Vimeo link, render normally
super
end end
private private
def surrounded_by_empty_lines?(node)
prev_node_empty?(node.previous) && next_node_empty?(node.next)
end
def prev_node_empty?(prev_node)
prev_node.nil? || node_empty?(prev_node)
end
def next_node_empty?(next_node)
next_node.nil? || node_empty?(next_node)
end
def node_empty?(node)
(node.type == :text && node.string_content.strip.empty?) || (node.type != :text)
end
def render_embedded_content(node) def render_embedded_content(node)
link_url = node.url link_url = node.url

View File

@@ -104,8 +104,8 @@ describe CustomMarkdownRenderer do
end end
context 'when multiple links are present' do context 'when multiple links are present' do
it 'renders all links' do it 'renders all links when present between empty lines' do
markdown = '[youtube](https://www.youtube.com/watch?v=VIDEO_ID) [vimeo](https://vimeo.com/1234567) ^ hello ^ [normal](https://example.com)' markdown = "\n[youtube](https://www.youtube.com/watch?v=VIDEO_ID)\n\n[vimeo](https://vimeo.com/1234567)\n^ hello ^ [normal](https://example.com)"
output = render_markdown(markdown) output = render_markdown(markdown)
expect(output).to include('src="https://www.youtube.com/embed/VIDEO_ID"') expect(output).to include('src="https://www.youtube.com/embed/VIDEO_ID"')
expect(output).to include('src="https://player.vimeo.com/video/1234567"') expect(output).to include('src="https://player.vimeo.com/video/1234567"')
@@ -113,5 +113,15 @@ describe CustomMarkdownRenderer do
expect(output).to include('<sup> hello </sup>') expect(output).to include('<sup> hello </sup>')
end end
end end
context 'when links within text are present' do
it 'renders only text within blank lines as embeds' do
markdown = "\n[youtube](https://www.youtube.com/watch?v=VIDEO_ID)\nthis is such an amazing [vimeo](https://vimeo.com/1234567)\n[vimeo](https://vimeo.com/1234567)"
output = render_markdown(markdown)
expect(output).to include('src="https://www.youtube.com/embed/VIDEO_ID"')
expect(output).to include('href="https://vimeo.com/1234567"')
expect(output).to include('src="https://player.vimeo.com/video/1234567"')
end
end
end end
end end